0Pricing
Cyber Security Academy · レッスン

YARAルールの構文

文字列、条件、メタデータを学びます。

「YARAルールの構文」はCoddyKit上の無料Cyber Security Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCyber Security Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cyber Security Academyコースには全4レッスンが含まれています。

3つのセクション

YARA ルールには名前と、meta、strings、conditionの最大3つのセクションがあります。必須なのは condition だけですが、実際のルールでは3つすべてを使用します。

rule Example_Malware
{
  meta:
    author = "analyst"
    description = "Detects Example family"
  strings:
    $a = "EvilConfig"
    $b = { 6A 40 68 00 30 00 00 }
  condition:
    $a and $b
}

meta セクション

metaには、マッチングには影響しませんが、トリアージと保守に不可欠な説明用メタデータを格納します。

  • author、date、description
  • reference — レポートまたはアドバイザリへのリンク
  • hash — ルールの作成元となったサンプル
  • tlp — 共有分類

値には文字列、整数、ブール値を指定します。meta はドキュメントとして扱ってください。次に対応する担当者がそれを頼りにします。

テキスト文字列

stringsセクションでは、パターンに関連付ける($で始まる)識別子を定義します。最も単純な形式は、引用符で囲んだテキスト文字列です。

修飾子によってマッチングを細かく指定できます。

  • nocase — 大文字と小文字を区別しません
  • wide — UTF-16(1文字あたり2バイト。Windows で一般的)
  • ascii — ASCII(デフォルト。wide と組み合わせると両方に一致)
  • fullword — 単語全体としてのみ一致
strings:
  $s1 = "cmd.exe /c" nocase
  $s2 = "InjectDll" wide ascii
  $s3 = "admin" fullword

16進数文字列

バイナリパターンには、波括弧で囲んだ16進数文字列を使用します。これは生のバイト列に一致するため、オペコード、マジックナンバー、構造体に適しています。

16進数文字列では、柔軟な指定も可能です。

  • ?? — ワイルドカードのニブル/バイト
  • [n-m] — n~m 個の任意のバイトをスキップ
  • ( A | B ) — いずれかのパターン
strings:
  $h1 = { 4D 5A 90 00 }
  $h2 = { E8 ?? ?? ?? ?? 83 C4 04 }
  $h3 = { 6A 00 [2-6] FF 15 ?? ?? ?? ?? }
  $h4 = { ( B8 | B9 ) 00 00 00 00 }

正規表現

YARAでは、スラッシュで囲まれた正規表現パターンをサポートしており、テキスト文字列と同じ修飾子を使用できます。パターンが変化しても構造に従う場合(設定マーカーや生成されたミューテックス名など)は、正規表現を使用します。

正規表現は強力ですがコストも高いため、可能な場合は固定文字列または16進数を優先し、ファイル全体をスキャンしないよう正規表現の範囲を厳密に限定してください。

strings:
  $re1 = /mutex_[a-f0-9]{8}/ nocase
  $re2 = /https?:\/\/[a-z0-9]{12,20}\.top\// ascii

conditionセクション

conditionは、マッチするかどうかを決める真偽値式です。文字列識別子を直接参照します。単独の$aは、その文字列が見つかった場合に真になります。

and、or、not、かっこを組み合わせます。実際にファミリーに属する検出と偶然の一致を区別するロジックを記述するのが、このセクションです。

condition:
  $a and ($b or $c) and not $benign

カウントと集合

YARAでは、文字列集合に対して表現力の高い量指定子を使用できます。

  • any of them / all of them
  • 2 of ($s*) — グループ内の少なくとも2つ
  • #a > 3 — $aのマッチ数が3を超える

これにより、例えば5つのファミリーマーカーのうち3つを必須にするなど、検出感度と誤検知のバランスを取ることができます。

condition:
  3 of ($str*) and #marker >= 2

オフセットとファイルサイズ

条件では、マッチがどこで発生したかやファイルサイズを参照できます。

  • $a at 0 — オフセット0でマッチする必要があります
  • $a in (0..1024) — バイト範囲内にある必要があります
  • filesize — 合計サイズ。例えばfilesize < 200KB
  • uint16(0) == 0x5A4D — オフセットから整数を読み取ります(ここではMZヘッダー)

マッチを位置に固定すると、誤検知を大幅に減らし、スキャンも高速化できます。

condition:
  uint16(0) == 0x5A4D and filesize < 500KB and $payload

モジュール

YARAのモジュールは、形式を認識して解析した構造化データを提供するため、条件で生バイト列ではなく解析済みフィールドを評価できます。

  • pe — PEのインポート、セクション、エントリーポイント、署名、imphash
  • hash — 領域のmd5やsha256を計算します
  • math — エントロピーや統計情報
  • elf、dotnet、magic

例えばpeをインポートすると、インポートされた関数や特定のimphashを条件にできます。これはリテラル文字列よりもはるかに堅牢です。

import "pe"
condition:
  pe.imphash() == "a1b2c3d4e5f6..." and
  pe.imports("kernel32.dll", "VirtualAllocEx")

集合の反復処理

より複雑なロジックのために、YARAではforを使ってコレクションをループ処理できます。例えば、これらのオフセットのうち少なくとも2つが特定の条件を満たす場合や、いずれかのセクション名がパターンにマッチする場合などを表現できます。

PEセクションやインポートなどのモジュールデータを扱う際には、単一の値ではなく長さが変化するリストを調べる必要があるため、これは不可欠です。

import "pe"
condition:
  for any i in (0..pe.number_of_sections - 1) : (
    pe.sections[i].name == ".evil"
  )

global、private、タグ

ルールレベルのキーワードでルールセットを整理できます。

  • global rule — その条件がファイル内の他のすべてのルールに適用されます(例えばPEファイルだけをスキャンする場合)
  • private rule — 再利用可能な構成要素です。単独では報告されませんが、他のルールから参照できます
  • ルール名の後ろに付けるタグで検出結果を分類できます(出力のフィルタリングなどに使用します)
global private rule IsPE { condition: uint16(0) == 0x5A4D }

rule Dropper : trojan dropper {
  strings: $a = "drop_payload"
  condition: $a
}

クイックチェック

条件の堅牢性について考えてみましょう。

まとめ

YARAルールの構文を一覧で確認します。

  • ルール = meta + strings + condition
  • テキスト文字列と、nocase/wide/ascii/fullword修飾子
  • 16進文字列と、ワイルドカード??、ジャンプ[n-m]、代替候補
  • 正規表現は構造を持つ可変パターンに使用します(控えめに使用してください)
  • conditionで文字列をand/or/notによって組み合わせます
  • 量指定子:any/all/N of、およびカウント#a
  • アンカー:at、in、filesize、uint読み取り
  • モジュール(pe、hash、math)で構造化データやimphashに基づいてマッチします
  • global、private、タグでルールセットを整理します

次は、文字列と16進数を使った実践的なハンティングです。

よくある質問

「YARAルールの構文」レッスンは無料ですか?

はい。「YARAルールの構文」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cyber Security Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cyber Security Academyコースには全4レッスンが含まれています。

「YARAルールの構文」で何を学びますか?

文字列、条件、メタデータを学びます。 ブラウザで直接実行するハンズオンコードでCyber Security Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Cyber Security Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCyber Security Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「YARAルールの構文」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCyber Security Academyレッスンでコードを書いて実行できますか?

はい。すべてのCyber Security Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. YARAの用途
  2. YARAルールの構文
  3. 文字列と16進数によるハンティング
  4. スキャンのスケールと自動化
← Cyber Security Academyに戻る