こんにちは、セキュリティの最前線で戦うアナリストの皆さん!🛡️
マルウェア分析をしていると、数千、数万ものファイルの中から「私が探していたあのファイル」を特定しなければならない時があります。一つ一つ開いて確認することもできず、既存のワクチンでは検出できない新種のマルウェアであれば、なおさら途方に暮れてしまいます。
この時に必要なのが、まさにYARA(ヤラ)です。YARAは「ファイルのための正規表現」と呼ばれ、マルウェアのパターン(指紋)を定義してファイルを分類する最も強力なツールです。
今日は、YARAルールを作成するための基礎文法構造(3大要素)と作成原則を徹底的に解説します。この記事を読めば、皆さんも自分だけのワクチンエンジンを作ることができます!🚀

1. YARAルールの解剖学:骨格を理解する 🦴
YARAルールはC言語に似た直感的な構造を持っています。大きく分けて、ヘッダー(Header)、メタ(Meta)、文字列(Strings)、条件(Condition)の4つの部分に分かれます。
rule Malware_Example_Rule // [ヘッダー] ルールの名前
{
meta: // [メタ] 説明と情報
author = "Security Analyst"
description = "This is a sample rule"
date = "2025-12-16"
strings: // [文字列] 検索したいパターン
$text_string = "malicious_command"
$hex_string = { E2 34 A1 ?? 00 }
condition: // [条件] 検出ロジック
$text_string or $hex_string
}
各セクションがどのような役割を果たすのか、詳しく見ていきましょうか?🧐
2. 最初の要素:メタ (Meta) – 「名刺」 📝
metaセクションは、ルールの動作には全く影響を与えません。しかし、実務では最も重要になることもあります。後でこのルールを誰が、なぜ作ったのかを記録しておく「コメント」であり「名刺」だからです。
- 主要キーワード:
- author: 作成者名
- description: ルールの説明 (どのようなマルウェアを検出するか)
- date: 作成日または修正日
- hash: 分析したマルウェアサンプルのハッシュ値 (非常に重要!後で検証用に使われる)
- version: ルールバージョン
💡 作成のヒント: 一人で使うルールであっても、descriptionとhashは必ず書く習慣をつけましょう。3ヶ月後の自分のためです。
3. 2番目の要素:文字列 (Strings) – 「証拠品」 🧵
stringsセクションは、ファイル内部で「見つけたいデータ」を定義する場所です。変数のように$記号で始まる識別子を使用します。
大きく分けて3つのタイプがあります。
① テキスト文字列 (Text Strings)
一般的なASCII文字やユニコード文字列を検索します。二重引用符(” “)を使用します。
$s1 = "cmd.exe" ascii // 一般的な英字文字列
$s2 = "Attack" wide // ユニコード文字列 (2バイトずつ保存される)
$s3 = "Error" nocase // 大文字小文字を区別しない (error, ERROR の両方を検出)
$s4 = "hacker" fullword // 単語全体が一致する場合のみ (yhacker は検出しない)
② 16進数文字列 (Hex Strings)
バイナリコード(機械語)や特定のバイトパターンを検索する際に使用します。中括弧({ })を使用します。
$h1 = { E2 34 A1 C5 } // 正確に一致するバイト
$h2 = { E2 34 ?? C5 } // ワイルドカード(??): この位置には何が来ても構わない
$h3 = { E2 [2-4] C5 } // ジャンプ: 途中で2〜4バイトがスキップされる
- ワイルドカード(??)は、変種マルウェアを検出する上で核心的な役割を果たします!
③ 正規表現 (Regular Expressions)
複雑なパターンを検索する際に使用しますが、性能低下の主な原因となるため、本当に必要な場合にのみ使用します。スラッシュ(/ /)を使用します。
$r1 = /md5: [0-9a-fA-F]{32}/
4. 3番目の要素:条件 (Condition) – 「裁判官」 ⚖️
conditionセクションは、定義した文字列を組み合わせて「最終的にマルウェアと判断するかどうか」を決定する論理領域です。Trueが返されれば検出されたことになります。
① 論理演算子 (Boolean Logic)
condition:
($s1 and $s2) or $h1 // s1とs2の両方があるか、h1があれば検出
② 数に基づく (Counting)
condition:
#s1 > 3 // 文字列s1がファイル内に3回以上出現すれば検出
③ ファイルサイズおよびヘッダー検査 (File Properties)
最もよく使われるパターンです。誤検知を減らすために、ファイルサイズやヘッダーを先に検査します。
condition:
uint16(0) == 0x5A4D and filesize < 2MB // MZヘッダー(exeファイル)であり、2MB未満の場合
- uint16(0): ファイルの0番地から16ビット(2バイト)を読み取ります。(Windows実行ファイルは常にMZ、つまり0x5A4Dで始まります)
5. YARAルール作成の3大原則 (Best Practices) ⭐
YARAルールを誤って作成すると、システムを停止させたり、正常なファイルをマルウェアとして誤検知する大惨事を引き起こす可能性があります。次の3つのことを必ず覚えておいてください。
1️⃣ 短すぎる文字列は禁止! (Performance)
- 悪い例: $a = “55” (16進数ではなく文字列 “55”)
- 理由: ファイル内に「55」は何万回も出現する可能性があります。スキャン速度が非常に遅くなります。最低5〜6バイト以上のユニークな文字列を使用してください。
2️⃣ 誤検知(False Positive)に注意! (Specificity)
- 悪い例: $s = “CreateFile”
- 理由: CreateFileは正常なプログラムもすべて使用する関数です。これを条件にすると、Windowsのメモ帳もマルウェアとして検出されてしまいます。マルウェアにのみ存在する特異な文字列(C2アドレス、誤字、特異なミューテックスなど)を探してください。
3️⃣ 条件文の順序を守る! (Short-Circuit Evaluation)
- 良い例: uint16(0) == 0x5A4D and $s1
- 説明: コンピュータは前から条件を検査します。ファイルヘッダーがMZでなければ、後ろにある$s1は検査すらされずにスキップされます。軽い条件(ファイルサイズ、ヘッダー)を先に書き、重い条件(文字列検索)を後に書くと、速度がはるかに速くなります。
🎉 終わりに:これであなたもルール作成者!
YARAルールは単純に見えますが、「どの文字列をシグネチャとして使うか?」を決定するアナリストの洞察力が込められた結果物です。
今日学んだMeta(説明)、Strings(証拠)、Condition(判断)の構造を頭に入れ、皆さんが分析したマルウェアの特徴をルールに落とし込んでみてください。
次回は、このように作成したYARAルールを使って実際のマルウェアファイルをスキャンし、検出する実習を行います。お楽しみに!👋
コメントを残す