マルウェアハンターの言語、YARAルールを自分で作ってみよう

「このファイルが危険かどうか、どうやって知るの?」

セキュリティアナリストの永遠の問いに、YARAは最も優雅な答えを提示します。

<

>

この記事で扱うこと

  • YARAとは何か、なぜセキュリティアナリストの必須ツールなのか
  • YARAルールの3つの主要構成要素 (meta, strings, condition)
  • サンプルファイルを直接作成し、シグネチャを抽出し、検出ルールを作成する全過程
  • ルールを実行して実際にマッチングが発生するか確認する方法
  • 現場でよく遭遇する落とし穴と回避テクニック

導入 — なぜYARAなのか

マルウェアアナリストの机の上に疑わしいファイルが1つ置かれていると想像してみてください。アンチウイルスエンジンは沈黙しており、ハッシュ値でVirusTotalを検索しても特別な情報はありません。それでも、何か不穏な匂いがします。この時、アナリストは尋ねます。「このファイルのどの部分がマルウェアの痕跡なのだろう?そして、似たようなファイルが現れたらどうやって捕まえる?」

YARAはまさにこの問いに答えるために生まれました。VirusTotalのVictor Alvarezによって作成されたこのツールは、「マルウェアパターンを人間が読めるルールで記述し、そのルールでファイル・メモリ・プロセスを迅速にスキャンする」作業を簡素化します。今日、ほとんどすべてのセキュリティベンダー、EDRソリューション、脅威インテリジェンスプラットフォームが内部的にYARAを活用しています。

YARAルールの解剖学

YARAルールはまるで令状のようです。誰を探すのか (meta)どのような手がかりで探すのか (strings)どのような条件で逮捕するのか (condition) の3つの要素で構成されます。

1) meta — ルールの身分証明書

ルールの名前、作成者、説明、参考資料などを記録する領域です。検出動作には影響しませんが、コラボレーションとメンテナンスの核心です。

2) strings — 検出手がかり

探したいパターンを定義します。3つの形式があります。

  • テキスト文字列: “powershell -enc” — 一般的なASCII/UTF-8文字列
  • 16進数バイト: { 4D 5A ?? ?? 50 45 } — PEファイルのマジックバイトのようなバイナリパターン (??はワイルドカード)
  • 正規表現: /cmd.exes+/c/i — 柔軟なパターンマッチング

3) condition — マッチング規則

strings領域で定義された手がかりがどのような条件で組み合わされば検出とみなすかを明示します。and, or, not, カウント比較、ファイルサイズ条件などを自由に使うことができます。

実習 — ファイル作成から検出まで

ステップ0. YARAインストール

# Ubuntu / Debian
sudo apt update && sudo apt install -y yara

# macOS (Homebrew)
brew install yara

# インストール確認
yara --version

ステップ1. 検出対象サンプルファイルの作成

実習用の無害なファイルを1つ作成してみます。仮想の「疑わしいスクリプト」と仮定します。実際のマルウェアは絶対に使用せず、私たちが直接シグネチャを埋め込んだダミーファイルを使います。

cat > suspicious_sample.txt << 'EOF'
#!/bin/bash
# Internal task runner v1.0
TASK_ID=ACME-EDU-2026
echo "Starting backup process..."
curl -s http://example-edu-lab.local/healthcheck
echo "Token: EDULAB_SIGNATURE_TOKEN_42"
exit 0
EOF

このファイルの2つの特徴に注目してください。ACME-EDU-2026という識別子とEDULAB_SIGNATURE_TOKEN_42というトークンです。これら2つの文字列が一緒に登場すれば、このファイル群を正確に識別できます。

ステップ2. シグネチャの抽出

サンプルファイルからどのパターンを手がかりにするかを決定します。stringsコマンドで候補を調べます。

strings suspicious_sample.txt | head -20

アナリストは次の3つの基準でシグネチャを選びます。

  • 固有性: 一般的なファイルにはあまり登場しない文字列か?
  • 安定性: 変種が出ても維持されそうなパターンか?
  • 組み合わせ可能性: 他のパターンと組み合わせて誤検知を減らせるか?

ここでは、ACME-EDU-2026、EDULAB_SIGNATURE_TOKEN_42、そしてシェルスクリプトのマジックバイト #!/bin/bash を採用します。

ステップ3. YARAルールの作成

いよいよ実際のルールを作成します。ファイル名は `edulab_detector.yar` とします。

rule EDULAB_Suspicious_Script
{
    meta:
        author      = "주군의 보안 강의실"
        description = "EDULAB 식별자와 토큰을 포함한 셸 스크립트 탐지"
        date        = "2026-05-23"
        version     = "1.0"
        severity    = "medium"
        reference   = "internal-training-only"

    strings:
        $magic   = "#!/bin/bash"
        $id      = "ACME-EDU-2026" ascii
        $token   = "EDULAB_SIGNATURE_TOKEN_42" ascii
        $hex_sig = { 23 21 2F 62 69 6E 2F 62 61 73 68 }   // "#!/bin/bash"の16進数

    condition:
        filesize < 10KB
        and $magic at 0
        and all of ($id, $token)
}

ルールのcondition部分を1行ずつ解釈してみます。

  • filesize < 10KB — 小さなスクリプトのみを検査対象に絞ります。性能と精度の両方に役立ちます。
  • $magic at 0 — ファイルの0番目のオフセットに #!/bin/bash が存在する必要があります。つまり、本物のシェルスクリプトである必要があります。
  • all of ($id, $token) — 識別子とトークンがすべて存在する場合にマッチします。

これら3つの条件がandで結ばれているため、単にbash文字列だけが含まれる普通のスクリプトは検出されません。

ステップ4. ルールの検証とスキャン

作成したルールの構文をまず検証します。

# 構文検証のみ実行
yara -w edulab_detector.yar suspicious_sample.txt

# マッチした文字列も出力
yara -s edulab_detector.yar suspicious_sample.txt

正常に作成されていれば、次のような結果が表示されます。

EDULAB_Suspicious_Script suspicious_sample.txt
0x0:$magic: #!/bin/bash
0x35:$id: ACME-EDU-2026
0xa9:$token: EDULAB_SIGNATURE_TOKEN_42

各行はマッチしたオフセットと実際にマッチしたバイト列を示します。アナリストはこの出力によって「どこで、何が、どのように」検出されたかを一目で把握できます。

ステップ5. ディレクトリ全体のスキャン

実際の運用では、ディレクトリツリー全体をスキャンします。

# /var/log以下のすべてのファイルを再帰的にスキャン
yara -r edulab_detector.yar /var/log

# ルールディレクトリ内のすべての.yarファイルを一度に適用するには
yara -r rules_dir/ /target/path

⚠️ 注意事項 — 現場で遭遇する落とし穴

  • 誤検知の嵐: `$short = “GET”` のような短すぎて一般的な文字列は、ほとんどすべてのファイルにマッチします。最低7〜8バイト以上の固有のシーケンスを推奨します。
  • エンコーディングの欠落: WindowsマルウェアはUTF-16 (wide) で文字列を保存する場合が多いです。`$str = “malware” ascii wide` のように両方を明示して見逃さないようにしてください。
  • シグネチャ回避: 攻撃者が文字列を細かく分割したりXORエンコードしたりすると、単純な文字列マッチングは無力化されます。この場合は、16進数パターンやpeモジュールを活用した構造ベースの検出を検討してください。
  • 性能負担: あまりにも多くの正規表現はスキャン速度を急激に低下させます。可能な限り単純な文字列とhexパターンを先に使い、regexは最後の手段として残しておくのが良いでしょう。
  • 倫理的境界: 実際のマルウェアを扱う際は、必ず隔離された分析環境 (サンドボックス、VM) を使用し、教育・研究目的以外での配布は禁止されています。

✅ まとめ — ハンターの第一歩

YARAは単なるツールではなく、セキュリティアナリストの言語です。疑わしいパターンを人間が読める形式で記述し、同僚と共有し、自動化パイプラインに乗せるすべての作業が、この小さなルールファイル1つから始まります。

今日、私たちは最も基本的なルールを最初から最後まで作成しました。次のステップに進みたい場合は、この道筋をたどってみてください。

  • pe, elf, hash, mathモジュールの活用 — 構造ベース・エントロピーベースの検出
  • YARA-X (Rustで再記述された次世代エンジン) の性能比較
  • floss, capaで自動抽出したパターンをルールに変換するワークフロー
  • Sigma → YARA変換、ATT&CKマトリックスマッピング

ルール1行が数千台のサーバーを守ることができます。主君のセキュリティ教室で、最初のシグネチャがうまく獲物を狩ることを願っています。️


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です