YARAルールとは?マルウェア検知の仕組みと落とし穴
19,000件超のYARAルールを実運用して分かった、「広すぎるルール」が引き起こす誤検知の実例を交えて解説します。
YARAルールとは
YARA(Yet Another Recursive Acronym)は、ファイルの中に含まれる特定のバイト列・文字列・パターンを 条件式で記述し、マッチしたら「このルールに該当する」と判定する、マルウェア検知の業界標準ツールです。 シールドガードのようなアンチウイルスソフトの多くが、ハッシュ照合だけでは 検出できない亜種・改変されたマルウェアを見つけるために、YARAルールを組み込んでいます。
典型的なYARAルールはこのような形をしています。
rule ExampleMalware {
strings:
$s1 = "malicious_string_example"
$s2 = { 4D 5A 90 00 03 00 00 00 } // MZヘッダーの一部
condition:
$s1 or $s2
}
stringsセクションで検出したい文字列やバイト列を定義し、conditionセクションで
「どの条件が揃ったら検知とするか」を記述します。単純な文字列一致だけでなく、正規表現やファイルサイズ、
複数条件の組み合わせも表現できるため、非常に柔軟なルール記述が可能です。
シールドガードのYARA活用状況
シールドガードは、Elastic・ESET・Google Cloud Threat Intelligence・ReversingLabsなど複数の セキュリティベンダー・研究者が公開しているYARAルール集を定期的に同期し、自社の署名データベースと 組み合わせて利用しています。これにより、個人開発では到底書ききれない量・種類のマルウェアパターンを カバーできます。
落とし穴: 「検知用ではないルール」が紛れ込む
ここからが本記事の本題です。公開されているYARAルール集には、マルウェア検知を目的としたルール以外に、 「ファイルからドメイン名らしき文字列を抽出する」「IPアドレスらしき文字列を抽出する」といった、 本来は解析の補助・データ抽出のためのユーティリティルールが混在していることがあります。
実際にシールドガードの開発中、次のようなルールが紛れ込んでいるのを発見しました。
rule domain {
strings:
$domain_regex = /([\w\.-]+)/ wide ascii
condition:
$domain_regex
}
一見マルウェア検知ルールのように見えますが、正規表現 /([\w\.-]+)/ は
「英数字・アンダースコア・ドット・ハイフンが1文字以上連続する文字列」に一致します。
これは事実上、読み取り可能なテキストを含むほぼすべてのファイルにマッチしてしまう条件です。
同様に、ip(IPv4/IPv6らしき文字列にマッチ)、url(http(s)://で
始まる文字列にマッチ)、contains_base64(Base64らしき12文字以上の連続にマッチ)といった
ルールも同じ性質を持っており、実運用のマルウェア判定には使うべきではないと判断しました。
どう直したか
修正方針として、これらの「IOC抽出用ユーティリティルール」をファイル名で特定し、検出エンジンへの 読み込み対象から明示的に除外するようにしました。除外後は、無害なテキストファイルは正しく 「Clean」と判定され、業界標準のマルウェアテスト文字列(EICARテストファイル)は引き続き正しく 「Malicious」と判定されることを確認しています。
この経験から得られる教訓は、「YARAルールが1件マッチした」ことと「本当に悪意があるファイルだ」 ということは、イコールではないという点です。ルールの出自・目的を理解した上で、 検知の重み付けや除外リストを適切に設計することが、誤検知(false positive)を減らす上で欠かせません。
まとめ
- YARAルールは、文字列・バイト列パターンでマルウェアを検知する業界標準の仕組み
- 公開ルール集には、検知用ではない「ユーティリティルール」が紛れ込むことがある
- ルールの条件が広すぎると、無害なファイルまで誤検知してしまう
- ルールの出自を理解し、目的に合わないルールは除外することが重要