YARAルール完全入門|マルウェアを“指紋”で見つけ出す
「このファイル、あの攻撃で見た検体と同じ仲間では?」——その勘を、誰でも再現できる“照合ルール”に変えるのがYARAです。ルールの構造(meta/strings/condition)から、16進パターン、メモリスキャン、フリート横断ハント、誤検知を抑える運用まで、防御者の視点で日本語でやさしく解説します。
📋 この記事の目次
攻撃を受けたとき、私たちはよく同じ壁にぶつかります。「この怪しいファイルは、本当に悪いものなのか?」「同じ検体が、ほかの端末にも潜んでいないか?」。一つひとつ目視で確かめるのは限界がありますが、もし“悪いものの特徴”を一度ルールとして書いておければ、何千ものファイルやメモリの中から、それを自動でつかまえられます。それを実現するのが YARA(ヤラ)——マルウェア研究者たちの“万能ナイフ”と呼ばれるパターンマッチングツールです。検知ルールの汎用フォーマットSigmaが“ログ”を見張る言葉なら、YARAは“ファイルやメモリ”を見張る言葉。日本語でまとまった解説がまだ少ないこの分野を、DFIR完全ロードマップの一歩進んだ実践編として、基礎からていねいに解き明かします。
本記事は、守る側(青チーム)が、自分の管理する端末やファイルから不審なものを見つけるための「検知」を学ぶ教育目的の解説です。YARAルールは、あなた自身が調査権限を持つファイル・メモリに対して使ってください。他者の端末を無断でスキャンする行為は、不正アクセス禁止法やプライバシーに関わる問題になり得ます。また本物のマルウェア検体は“劇物”です。学習は、ネットから隔離した検証環境(自宅ラボ)や、公開されている安全なサンプル・テスト文字列で進めましょう(検体の安全な扱いは⑤章で詳しく述べます)。
🔬 YARAとは? マルウェア界の“指紋照合”
「ファイルの中の特徴的なパターン」で悪性を見抜く——その発想と価値を理解しましょう。
YARA=ファイルやメモリを“特徴パターン”で照合・分類する道具
YARAは、ファイルやプロセス・メモリの中から特徴的なパターン(文字列やバイト列)を探し出し、マルウェアを「見つける(検知)」「仲間分けする(分類)」ためのオープンソースのツールです(VirusTotalのVictor Alvarez氏が開発)。公式が“マルウェア研究者のためのパターンマッチング・スイスアーミーナイフ”と称するとおり、用途は幅広く、世界中のセキュリティ製品・脅威ハンティング・インシデント対応の現場で、共通の“検知の言葉”として使われています。
イメージしやすいたとえは「指紋照合」です。犯罪捜査で指紋データベースと照合して人物を特定するように、YARAは「このマルウェア家系には、こんな特徴がある」というルールを作り、調べたいファイルと突き合わせます。たとえば、ある攻撃グループのツールだけが内部に持つ独特の文字列、特定のパッカーが残すバイト列の癖、設定ファイルの目印——そうした“手癖”をルールに書いておけば、ファイル名や見た目を変えられても、中身の指紋から正体を言い当てられるのです。
これはMITRE ATT&CKの総論で触れた「IOCより振る舞い・特徴で戦うと、攻撃者は痛い」という考え方とも響き合います。ハッシュ値は1バイト変えるだけで別物になりますが、マルウェアの“中身の作り”はそう簡単には変えられない。YARAは、その変えにくい部分を狙ってルール化することで、亜種や少し化粧直しした検体まで、まとめてつかまえにいきます。
🔁 YARAの照合モデル——「ルール」と「対象」を突き合わせる
YARAが守りの現場で重宝されるのは、使える“場所”が広いからです。1つの怪しいファイルの素性調べ(トリアージ)はもちろん、感染が疑われる端末のメモリを走査して潜伏中のコードをあぶり出したり、何百台もの端末を横断スキャンして「同じ検体がほかにいないか」を一気に確認したり。メールやファイルの受け渡し口(ゲートウェイ)に組み込んで、入ってくる前にはじくこともできます。1つのルールが、いろいろな場面で使い回せる——ここがYARAの大きな魅力です。
ひとことで言うと
YARAは「“悪いものの特徴”を書き留めて、何にでも当てられる照合ルール」です。Sigmaが「ログに残った“出来事”」を見張るのに対し、YARAは「ファイルやメモリの“中身”」を見張ります。両方そろえると、「何が起きたか」と「何が潜んでいるか」の両面から、守りの網を張れます。
🧱 YARAルールの構造(rule/meta/strings/condition)
怖がらなくて大丈夫。YARAルールは“3つの部屋”を持つ、素直な設計図です。
YARAルールは、見た目こそプログラムに似ていますが、中身はたった3つの部屋(セクション)でできています。「何という名前のルールか(rule)」を宣言し、「探したいパターン(strings)」を並べ、「どう組み合わさったら“当たり”とするか(condition)」を決める。これだけです。加えて、ルールの素性を書くメモ欄(meta)を添えます。まずは代表的な要素を押さえましょう。
| 要素 | 役割 |
|---|---|
rule 名前 | ルールの宣言と名前。検知時に「どのルールに当たったか」として表示される識別子。 |
meta: | ルールのメモ欄。作者・説明・日付・参照URL・検体ハッシュなど。検知ロジックには影響しないが、運用の生命線。 |
strings: | 探したいパターンの定義。$a $b …と変数名を付け、テキスト/16進/正規表現で書く。 |
condition: | 検知の最終ロジック(必須)。「どのパターンが、いくつ、どこに現れたら当たりか」を真偽式で表す。 |
import "pe" | モジュール読み込み。pe(実行ファイル構造)や math(エントロピー)などの“拡張機能”を呼べる。 |
必須なのは rule と condition の2つだけ。strings は“探すパターン”がある場合に書きます(ファイルサイズやファイル形式だけで判定するなら、stringsなしのルールもあり得ます)。実際の1本を見てみましょう。下は「情報窃取型マルウェアによく見られる特徴の組み合わせ」を検知する、教育用の例です。
▲ 読み方:metaに素性(作者・日付・参照・ハッシュ・ATT&CK手口)を記録し、stringsで特徴パターンを定義、conditionで「PEヘッダ+2つ以上の特徴+復号API」という“当たりの条件”を組み立てています。※文字列は説明用の例で、そのまま実在検体を表すものではありません。
注目してほしいのは、condition がこのルールの“頭脳”だということ。strings をいくら並べても、それだけでは検知になりません。「PEファイルであること(uint16(0) == 0x5A4D=先頭が“MZ”)」という土俵を確認したうえで、「特徴文字列が2つ以上」「かつ復号APIを含む」と条件を重ねることで、ただ単語が1個出ただけの無関係なファイル(=誤検知)を上手に振るい落としています。この“組み立て”の妙が、③④章の主役です。
🧩 YARAルールの解剖図——3つの部屋とメモ欄
meta は“検知に使われない”けれど、いちばん大事にしたい欄
meta: はYARAの判定ロジックには一切影響しません。でも実務では、「誰が・いつ・なぜ・どの検体を根拠に」書いたルールかが分からないと、後で誤検知が出たときに直せず、共有もできません。参照URL・検体ハッシュ・ATT&CK手口を必ず残す——これが“育てられるルール”の第一歩です。
🧬 stringsの3つの型:テキスト・16進・正規表現
YARAの“探す材料”は3種類。それぞれの得意分野と、表現力を上げる修飾子を学びます。
strings: に書けるパターンは、大きく3つの型に分かれます。検体のどこに注目するかで、使い分けます。
テキスト文字列
いちばん基本。$a = "mimikatz" のように、検体内に現れる“読める文字”を指定します。設定文字列・URL・エラーメッセージ・作者の癖など、人が残した痕跡を狙うのに最適。
16進バイト列(hex)
{ 4D 5A 90 00 } のように、生のバイト列を指定。文字にならない機械語コードの断片やヘッダを狙えます。ワイルドカードや可変長ジャンプで“少しの違い”を吸収できるのが強み。
正規表現
$re = /[a-z0-9]{32}\.onion/ のように、揺れのあるパターンを柔軟に表現。ただし重くなりやすいので、テキスト・16進で足りるなら、そちらを優先します。
さらに、文字列の後ろに「修飾子(モディファイア)」を付けると、一致のしかたを細かく制御できます。これがYARAの表現力の源です。とくに wide と nocase は実戦で多用します。
| 修飾子 | 意味 | なぜ効くか |
|---|---|---|
nocase | 大文字小文字を区別しない | Passwords も passwords も拾う。 |
wide | 2バイト文字(UTF-16LE)として探す | Windowsは文字列をUTF-16で持つことが多い。これを忘れると検知漏れの定番。 |
ascii | 1バイト文字として探す(既定) | ascii wide と併記すると両方を同時に狙える。 |
fullword | 単語として独立しているときだけ一致 | net が internet に誤爆するのを防ぐ。 |
xor | 1バイトXORで難読化された状態でも探す | 設定文字列を xor で隠す検体に有効。 |
base64 | Base64エンコードされた姿で探す | 埋め込みデータやスクリプトの隠蔽に対応。 |
16進文字列の真価は「ワイルドカード」と「ジャンプ」にあります。攻撃者がコンパイルし直すたびに、機械語のごく一部(レジスタやアドレス)は変わります。そこを ??(任意の1バイト)や [4-6](4〜6バイトを読み飛ばす)で“穴”にしておくと、細部は違っても骨格が同じ亜種を、まとめて捕まえられます。下を見てください。
▲ ??=任意の1バイト、5?=上位だけ固定、[4-6]=可変長ジャンプ、(… | …)=候補。正規表現の考え方が効いてくる場面で、正規表現でログ解析の基礎が土台になります。
どの型を選ぶにせよ、ルールの“強さ”を決めるのは「どの文字列・バイト列を狙うか」という目利きです。ありふれたライブラリの定型文を選ぶと誤検知だらけになり、逆に検体1個だけの偶然のゴミを選ぶと、亜種が出た瞬間に役立たずになります。“その家系だけが持つ、変えにくい特徴”を見抜く——この勘所は⑥章でじっくり扱います。まずは「3つの型と、wide/nocase/fullwordという必須の修飾子がある」ことを押さえれば十分です。
狙う文字列は、どうやって見つける?
検体から候補となる文字列を洗い出すには、strings コマンドや、逆アセンブラGhidraでの解析が役立ちます。コードを読み解いて「この関数だけが使う独特の文字列」を見つけられれば、誤検知に強い“効くルール”が書けます。検体そのものの安全な扱い方は、次の⑤章で必ず確認してください。
🧠 conditionの書き方:本物だけを光らせる
YARAの心臓部。“探す材料”を真偽式で組み立て、ノイズを削って“本物”だけを通します。
condition: は、strings で定義したパターンを論理式(真偽の組み立て)でまとめ、「最終的に“当たり”とみなす条件」を決める部分です。必須であり、ルールの賢さがここに集約されます。基本の語彙はとてもシンプルです。
| 書き方 | 意味 |
|---|---|
$a and $b / $a or $b | 論理積・論理和。「両方」「どちらか」を表す基本。 |
any of them | 定義した文字列のどれか1つでも一致。all of themなら全部。 |
2 of ($s*) | $sで始まる文字列のうち2つ以上が一致。“しきい値”検知の主役。 |
#a > 3 | 文字列 $a の出現回数が3より多い(#はカウント)。 |
$a at 0 / $a in (0..100) | 特定の位置・範囲に現れるか(ヘッダ位置の固定などに)。 |
filesize < 2MB | ファイルサイズで足切り。巨大ファイルの誤爆と無駄なスキャンを防ぐ。 |
uint16(0) == 0x5A4D | 先頭2バイトが“MZ”=PE実行ファイルか、をファイル形式で確認。 |
誤検知を減らす“王道”は、「土俵を固めてから、しきい値で判断する」こと。まず uint16(0) や filesize で「そもそも対象の種類か」を絞り(PEでない画像ファイルを延々調べない)、そのうえで N of ($s*) で「特徴がいくつ重なったか」を見ます。1個の文字列一致では弱くても、3個重なれば偶然はまず起きません。pe モジュールを使えば、さらに踏み込んだ判定もできます。
▲ “文字列+ファイル形式+構造+インポートAPI”を重ねるほど、誤検知に強く“本物”を射抜く検知になります。peのほか、エントロピーを測るmathモジュールも難読化・暗号化の検出に便利です。
🎯 conditionの絞り込み——「土俵→しきい値→確証」でノイズを削る
もう一つ覚えておきたいのが「除外」の発想です。正規のソフトに偶然マッチしてしまうなら、その正規ソフトだけが持つ署名や文字列を not で引き算します(例:… and not pe.signatures[0].issuer contains "Microsoft")。Sigmaの filter と同じ“正常を引く”考え方で、これがアラートの質を大きく左右します。
⚙️ YARAを“動かす”:実行・スケール・メモリ
書いたルールは、走らせて初めて“検知”になります。1ファイルから、何百台・メモリまで。
YARAの基本はコマンド1つ。ルールファイル(.yar)と、調べたいファイルやフォルダを渡すだけです。-r を付ければ、フォルダを再帰的に掘って一気にスキャンします。
▲ 出力は「ルール名 ファイルパス」の形。どのルールに当たったかが一目で分かります。-s を付けると“どの文字列がどこで一致したか”まで見え、ルールのデバッグに重宝します。
プログラムに組み込むなら yara-python。ルールをコンパイルして、何度でも高速にマッチできます。自動トリアージや、独自ツールへの組み込みの土台になります。
そして、YARAが防御の現場で輝くのは“規模”と“場所”を広げたときです。同じルールが、いろいろな器の上で動きます。
共有ルールで“集合知”に乗る
LOKI/THOR、ClamAV、VirusTotalのRetrohunt等がYARAを採用。世界の研究者が公開したルールを取り込み、脅威インテリジェンスとして活用できます。
とくにメモリスキャンは、YARAならではの強みです。最近のマルウェアは、ディスク上では暗号化・難読化して姿を隠し、実行されたときだけメモリ上で本来のコードに“戻り”ます。だから動いている最中のメモリにルールを当てると、ディスクスキャンでは見えなかった文字列やコードが浮かび上がる。Volatilityのようなメモリ解析基盤と組み合わせると、ファイルレス攻撃の調査でも力を発揮します。
YARAの練習では検体を触りたくなりますが、実在マルウェアは取り扱いを誤ると、自分や周囲を感染させます。鉄則は4つ。①ネットから隔離した専用VM(スナップショット必須)で扱う/②絶対にダブルクリックで実行しない(YARAは“実行せずに中身を照らす”道具。スキャンに実行は不要)/③受け渡しは必ずパスワード付きZIP+ハッシュ(SHA-256)で、誤って開かない工夫を/④共有環境・本番端末・個人PCで開かない。安全なサンドボックス構築はINetSimを使ったマルウェア動的解析環境が参考になります。最初はEICARテスト文字列など、無害な題材でルールの“効き”を確かめるのが安全です。
🎛 良いルールの書き方と運用(誤検知を避ける)
ルールは「書いて終わり」ではありません。“強く・もろくなく・育てられる”ものを目指します。
YARAは書くこと自体は簡単ですが、“効くルール”を書くのは奥が深い世界です。陥りがちな失敗は両極端にあります。一方は「過剰適合(オーバーフィット)」——目の前の1検体に合わせすぎて、ほんの少し変わった亜種で空振りする。もう一方は「広すぎ」——ありふれた文字列を狙って、正規ソフトにまで誤爆する。良いルールは、そのちょうど中間、「その家系“だけ”が持つ、“変えにくい”特徴」を射抜きます。
検体を安全に観察し、特徴を洗い出す
隔離環境で strings やGhidraを使い、「この検体“らしさ”が出ている文字列・コード」を集める。可能なら複数検体を見比べ、共通する芯を探す。
“変えにくく・珍しい”材料を選ぶ
コンパイラやライブラリが誰の検体にも入れる定型文は避け、攻撃者の手癖・独自の設定・固有のミューテックス名などを狙う。短すぎる文字列・どこにでもある語は選ばない。
conditionで土俵としきい値を組む
uint16(0)・filesizeで対象を絞り、N of ($s*)で“複数重なり”を要求。1個一致で鳴らさない。meta に hash・reference・ATT&CK を残す。
2方向でテストする
検知側=狙った検体(と亜種)でちゃんと光るか。誤検知側=正規ソフトを集めた“クリーンな山(goodware)”で鳴らないか。両方を確かめて初めて“使える”。
運用し、チューニングし続ける
誤検知が出たら除外条件を足し、新しい亜種が出たら材料を見直す。検知は一度きりでなく、育て続けるもの。性能が重いルールは見直し対象に。
性能(パフォーマンス)も忘れてはいけない観点です。YARAは内部で「アトム」と呼ばれる短いバイト列を手がかりに高速化しています。そのため、極端に短い文字列(1〜2バイト)や、先頭が曖昧な正規表現は、エンジンが“あたり”を付けられず、スキャンが遅くなりがちです。「?? ばかりの16進」「/.*foo/ のような重い正規表現」は避け、4バイト以上の“固い”手がかりを1つは含める——これが速いルールのコツです。何百台・何TBを相手にするとき、この差は効いてきます。
YARAは“ペインピラミッド”の上のほうで戦える
MITRE ATT&CK総論で触れた「ペイン(痛み)のピラミッド」では、ハッシュやIPでの検知は攻撃者にとって“痛くない”(すぐ変えられる)。対してYARAが狙うツールや手口の“作りの特徴”は、攻撃者が変えるのに手間がかかる=上位の痛点です。だから良いYARAルール1本は、ハッシュ100個より長持ちし、亜種にも効きます。
最後に、新しい潮流にも触れておきます。YARAには近年、Rustで書き直された後継「YARA-X」が登場しました。より高速・安全で、既存のルール資産もおおむねそのまま使えます。これから本格的に学ぶなら、従来のYARAで考え方を身につけつつ、YARA-Xの動向も追っておくとよいでしょう。基本の文法(meta/strings/condition)は変わらないので、ここで学んだことはそのまま生きます。
□ ネットから隔離した検証環境を用意した(本番・個人PCで検体を扱わない)/□ まずはEICARテスト文字列など無害な題材で yara コマンドの動きを確かめた/□ 公式ドキュメントでmeta/strings/conditionの基本を読んだ/□ ②の例を真似て、自分で1本ルールを書いてみた/□ uint16(0) と N of ($s*) を使い、誤検知を抑える条件を組んでみた/□ 正規ソフトの山(goodware)に当てて誤検知テストをした。まずは「無害な題材で書く→当てる→絞る」。1本書ければ、ファイルの見え方が変わります。
📚 用語集・FAQ・次に読む
つまずきやすい用語と、よくある疑問をまとめました。
ここまでに登場した言葉の“答え合わせ”として、用語集とFAQをまとめました。YARAは奥が深い分野ですが、入口はこの記事の範囲で十分です。あとは安全な環境で手を動かしながら、少しずつ守備範囲を広げていきましょう。最初の1本を書き上げたとき、“怪しいファイルの山”が、急に怖くなくなります。
📖 用語集
| 用語 | 意味 |
|---|---|
| YARA | ファイル・メモリを特徴パターンで照合し、マルウェアを検知・分類するルール&ツール。 |
| rule / condition | ルールの宣言と、検知の最終ロジック(必須)。conditionが“当たり”の真偽を決める。 |
| strings | 探したいパターン(テキスト/16進/正規表現)の定義。$名前で参照する。 |
| meta | ルールのメモ欄(作者・説明・ハッシュ・参照)。検知に不使用だが運用の要。 |
| 修飾子(modifier) | nocase/wide/fullword/xorなど、一致のしかたを指定する記法。 |
| ワイルドカード/ジャンプ | 16進の ??(任意バイト)や [4-6](可変長読み飛ばし)。亜種の揺れを吸収する。 |
| pe / math モジュール | 実行ファイル構造やエントロピーを条件に使える拡張。importで呼ぶ。 |
| 過剰適合(オーバーフィット) | 1検体に合わせすぎて亜種に効かなくなること。広すぎると誤検知。中間を狙う。 |
| 誤検知(FP) | 正規ファイルを誤って“悪”と判定すること。goodwareでのテストで抑える。 |
| YARA-X | Rust製の後継実装。高速・安全で、既存ルールもおおむね流用可。 |
❓ よくある質問(FAQ)
プログラミング経験がなくても書けますか?
はい。YARAルールはプログラムというより「探したいものを箇条書きし、当たりの条件を式で書く」感覚に近いです。まずは公開されている既存ルールを読むところから。構造(meta/strings/condition)に慣れたら、お手本を真似て少しずつ書き換えれば、自然と身につきます。
YARAとSigma、Snortは何が違うの?
対象が違います。YARAはファイル/メモリ(=中身)、Sigmaはログ(=出来事)、Snort/Suricataはネットワークパケット(=通信)を見張ります。「ファイルはYARA、ログはSigma、通信はSnort」と覚えると整理しやすいでしょう。“シグネチャで悪を表現する”という発想は共通で、組み合わせると守りが立体的になります。
ルールはどこで手に入りますか?
研究者やベンダーが公開する多数のルール集(例:YARA-Rulesプロジェクト、各社の脅威レポート付属ルール、Florian Roth氏のsignature-baseなど)があります。まずは読んで学ぶ教材として最適です。ただし、出所と誤検知の実績を確かめ、自分の環境で必ずテストしてから運用に乗せましょう。脅威インテリジェンスの一部として配布されることも多いです。
誤検知が出ました。どうすれば?
まず、誤爆した正規ファイルが「なぜ当たったか」を yara -s で確認します。原因の文字列がありふれたものなら、より珍しい材料に差し替えるか、N of のしきい値を上げる、filesize や uint16(0) で土俵を絞る、正規ソフト固有の署名を not で除外する——といった手で調整します。誤検知テスト(goodware)を習慣化すると、こうした事故を未然に防げます。
メモリの中も調べられるって本当?
本当です。むしろそこがYARAの強みの一つ。ディスク上では暗号化・難読化していても、実行中はメモリ上で本来の姿に戻るため、メモリにルールを当てると正体が見えることがあります。VolatilityなどのメモリフォレンジックやVelociraptorと組み合わせると、ファイルレス攻撃の調査でも活躍します。
まず何から始めればいいですか?
隔離した検証環境+無害な題材(EICARテスト文字列など)から始めるのが安全でおすすめです。yara コマンドで「ルールがファイルにどう当たるか」を体感し、次に②③のお手本を真似て1本書く。本物の検体を扱うのは、⑤章の安全ルールを守れるようになってからにしましょう。DFIR完全ロードマップで全体像を押さえると、YARAの“居場所”も見えてきます。
🧭 次に読む
🗺️ 全体像と検知の仲間
🧬 マルウェア解析の土台
📚 参考・出典(一次情報)
- YARA 公式ドキュメント(yara.readthedocs.io)/VirtualTotal「VirusTotal/yara」リポジトリ(GitHub)
- YARA-X 公式ドキュメント(virustotal.github.io/yara-x)/VirusTotal Blog
- yara-python(GitHub: VirusTotal/yara-python)
- Volatility Foundation(メモリフォレンジックでのyarascan)/Velociraptor 公式ドキュメント(YARA artifacts)
- Florian Roth「signature-base」「LOKI / THOR」/YARA-Rules プロジェクト(コミュニティ・ルール集)
- MITRE ATT&CK(meta の手口タグが参照)/David Bianco「Pyramid of Pain」


コメント