yara-rule-authoring
マルウェア検出のための高品質なYARA-Xルール作成を支援するスキルです。YARAルールの新規作成・レビュー・最適化を行う際に使用します。命名規則、文字列の選定、パフォーマンス最適化、旧来のYARAからの移行、誤検知の低減まで幅広くカバーします。
description の原文を見る
> Guides authoring of high-quality YARA-X detection rules for malware identification. Use when writing, reviewing, or optimizing YARA rules. Covers naming conventions, string selection, performance optimization, migration from legacy YARA, and false positive reduction. Triggers on: YARA, YARA-X, malware detection, threat hunting, IOC, signature, crx module, dex module.
SKILL.md 本文
YARA-X ルール作成
マルウェアを検出しつつ、誤検知の洪水に溺れないための検出ルールを作成しましょう。
このスキルは YARA-X をターゲットとしています。YARA-X はレガシー YARA の Rust ベースの後継で、VirusTotal の本番システムを支える推奨実装です。既存ルールがある場合は、レガシー YARA からの移行 を参照してください。
コア原則
-
文字列は良好なアトムを生成する必要がある — YARA は高速マッチング用に 4 バイトの部分列を抽出します。バイトの繰り返し、一般的なシーケンス、または 4 バイト未満の文字列は、多数のファイルに対して遅いバイトコード検証を強制します。
-
カテゴリではなく、特定のファミリーをターゲットにする — 「ランサムウェアを検出」はあらゆるものを検出し、何も検出しません。「LockBit 3.0 の設定抽出ルーチンを検出」は、あなたが必要とするものを検出します。
-
デプロイ前に正規ウェアに対してテストする — Windows システムファイルで発火するルールは無用です。VirusTotal の正規ウェア コーパスまたは独自のクリーンファイルセットで検証してください。
-
安価なチェックで最初にショートサーキットする — 高額な文字列検索またはモジュール呼び出しの前に、
filesize < 10MB and uint16(0) == 0x5A4Dを配置します。 -
メタデータはドキュメント — 将来のあなたとチームメンバーは、これが何をキャッチするのか、なぜ、サンプルがどこから来たのかを知る必要があります。
使用するケース
- マルウェア検出用の新しい YARA-X ルールを作成する
- 既存ルールの品質またはパフォーマンスの問題をレビューする
- 遅いルールセットを最適化する
- IOC または脅威インテリジェンスを検出シグネチャに変換する
- 誤検知の問題をデバッグする
- 本番デプロイメント用のルールを準備する
- レガシー YARA ルールを YARA-X に移行する
- Chrome 拡張機能を分析する (crx モジュール)
- Android アプリを分析する (dex モジュール)
使用しないケース
- 逆アセンブリが必要な静的分析 → Ghidra/IDA スキルを使用
- 動的マルウェア分析 → サンドボックス分析スキルを使用
- ネットワークベースの検出 → Suricata/Snort スキルを使用
- Volatility を使用したメモリフォレンジクス → メモリフォレンジクス スキルを使用
- シンプルなハッシュベースの検出 → ハッシュリストのみを使用
YARA-X の概要
YARA-X はレガシー YARA の Rust ベースの後継です:正規表現が 5~10 倍高速、エラーが向上、組み込みのフォーマッター、より厳密な検証、新しいモジュール (crx、dex)、99% のルール互換性。
インストール: brew install yara-x (macOS) または cargo install yara-x
重要なコマンド: yr scan、yr check、yr fmt、yr dump
プラットフォームの考慮事項
YARA はすべてのファイルタイプに対応しています。パターンをターゲットに適応させてください:
| プラットフォーム | マジックバイト | 悪い文字列 | 良い文字列 |
|---|---|---|---|
| Windows PE | uint16(0) == 0x5A4D | API 名、Windows パス | ミューテックス名、PDB パス |
| macOS Mach-O | uint32(0) == 0xFEEDFACE (32 ビット)、0xFEEDFACF (64 ビット)、0xCAFEBABE (ユニバーサル) | 一般的な Obj-C メソッド | キーロガー文字列、永続化パス |
| JavaScript/Node | (不要) | require、fetch、axios | オブファスケータのシグネチャ、eval+デコード チェーン |
| npm/pip パッケージ | (不要) | postinstall、dependencies | 疑わしいパッケージ名、exfil URL |
| Office ドキュメント | uint32(0) == 0x504B0304 | VBA キーワード | マクロ自動実行、エンコードペイロード |
| VS Code 拡張機能 | (不要) | vscode.workspace | 一般的でない activationEvents、隠しファイルアクセス |
| Chrome 拡張機能 | crx モジュールを使用 | 一般的な Chrome API | パーミッション悪用、マニフェスト異常 |
| Android アプリ | dex モジュールを使用 | 標準 DEX 構造 | オブファスケートされたクラス、疑わしいパーミッション |
macOS マルウェア検出
専用の Mach-O モジュールはまだ存在しません。マジックバイト チェック + 文字列パターンを使用してください:
マジックバイト:
// Mach-O 32 ビット
uint32(0) == 0xFEEDFACE
// Mach-O 64 ビット
uint32(0) == 0xFEEDFACF
// ユニバーサル バイナリ (fat バイナリ)
uint32(0) == 0xCAFEBABE or uint32(0) == 0xBEBAFECA
macOS マルウェアの良好なインジケータ:
- キーロガー アーティファクト:
CGEventTapCreate、kCGEventKeyDown - SSH トンネル文字列:
ssh -D、tunnel、socks - 永続化パス:
~/Library/LaunchAgents、/Library/LaunchDaemons - 認証情報の盗難:
security find-generic-password、keychain
Airbnb BinaryAlert からのサンプルパターン:
rule SUSP_Mac_ProtonRAT
{
strings:
// ライブラリ インジケータ
$lib1 = "SRWebSocket" ascii
$lib2 = "SocketRocket" ascii
// 動作 インジケータ
$behav1 = "SSH tunnel not launched" ascii
$behav2 = "Keylogger" ascii
condition:
(uint32(0) == 0xFEEDFACF or uint32(0) == 0xCAFEBABE) and
any of ($lib*) and any of ($behav*)
}
JavaScript 検出の判定木
JavaScript ルールを書きますか?
├─ npm パッケージ?
│ ├─ package.json パターンを確認
│ ├─ postinstall/preinstall フックを探す
│ └─ exfil パターンをターゲット:fetch + env アクセス + 認証情報パス
├─ ブラウザ拡張機能?
│ ├─ Chrome:crx モジュールを使用
│ └─ その他:マニフェスト パターン、バックグラウンド スクリプト動作をターゲット
├─ スタンドアロン JS ファイル?
│ ├─ オブファスケーション マーカーを探す:eval+atob、fromCharCode チェーン
│ ├─ ミニファイ後も残る一意な関数/変数名をターゲット
│ └─ パック/エンコードされたペイロードを確認
└─ ミニファイ/webpack バンドル?
├─ バンドル後も残る一意な文字列をターゲット (URL、マジック値)
└─ 関数名を避ける (マングル化される)
JavaScript 固有の良好な文字列:
- Ethereum 関数セレクタ:
{ 70 a0 82 31 }(transfer) - ゼロ幅文字 (ステガノグラフィ):
{ E2 80 8B E2 80 8C } - オブファスケータ シグネチャ:
_0x、var _0x - 特定の C2 パターン:ドメイン名、webhook URL
JavaScript 固有の悪い文字列:
require、fetch、axios— 一般的すぎるBuffer、crypto— 至るところで正規用途process.envのみ — 特定の環境変数名が必要
必須ツールキット
| ツール | 用途 |
|---|---|
| yarGen | 候補文字列を抽出:yarGen.py -m samples/ --excludegood → yr check で検証 |
| FLOSS | オブファスケートされた/スタック文字列を抽出:floss sample.exe (yarGen が失敗した場合) |
| yr CLI | 検証:yr check、スキャン:yr scan -s、検査:yr dump -m pe |
| signature-base | 品質の高い例を研究 |
| YARA-CI | デプロイメント前に正規ウェア コーパス テストを実施 |
これら 5 つをマスターしてください。ツール カタログに気を取られないでください。
避けるべき言い訳
これらの考えが浮かんだら、止めて再検討してください。
| 言い訳 | 専門家の回答 |
|---|---|
| 「この一般的な文字列は十分にユニーク」 | 正規ウェアに対してテストしてください。あなたの直感は間違っています。 |
| 「yarGen がこれらの文字列をくれた」 | yarGen は提案し、あなたが検証します。各文字列を手動で確認してください。 |
| 「10 のサンプルで動作する」 | 10 サンプル ≠ 本番環境。VirusTotal 正規ウェア コーパスを使用してください。 |
| 「すべてのバリアントをキャッチするための 1 つのルール」 | FP 洪水を引き起こします。特定のファミリーをターゲットにしてください。 |
| 「FP が発生したら、より具体的にしよう」 | 最初から厳密なルールを書いてください。FP は信頼を失わせます。 |
| 「このパターンはユニーク」 | 1 つのサンプルでユニーク ≠ マルウェア エコシステム全体でユニーク。 |
| 「パフォーマンスは重要でない」 | 1 つの遅いルールがルールセット全体を遅くします。アトムを最適化してください。 |
| 「PEiD ルールはまだ機能する」 | 廃止されました。32 ビット パッカーは関連性がありません。 |
| 「後で条件を追加しよう」 | デプロイされた弱いルール = ダメージが発生しました。 |
| 「これはハンティング用のみ」 | ハンティング ルールが検出ルールになります。同じ品質基準が適用されます。 |
| 「API 名が悪意のあることを示している」 | 正規ソフトウェアも同じ API を使用しています。行動文脈が必要です。 |
| 「一般的な文字列の場合は any of で問題ない」 | 一般的な文字列 + any = FP 洪水。個別にユニークな文字列にのみ any of を使用してください。 |
| 「このレジェックスは十分に具体的」 | /fetch.*token/ はすべての認証コードにマッチします。exfil 宛先の要件を追加してください。 |
| 「JavaScript はクリーンに見える」 | 攻撃者は正規のコードに悪意あるコードを混ぜます。eval+デコード チェーンを確認してください。 |
| 「.* を使用して柔軟性を持たせよう」 | 無制限の正規表現 = パフォーマンス災害 + メモリ爆発。.{0,30} を使用してください。 |
| 「どこでも --relaxed-re-syntax を使用しよう」 | 実際のバグをマスクします。正規表現を修正して、問題を隠さないようにしてください。 |
判定木
この文字列は十分か?
この文字列は十分か?
├─ 4 バイト未満?
│ └─ NO — より長い文字列を見つける
├─ 繰り返しバイトを含む (0000、9090)?
│ └─ NO — 周囲のコンテキストを追加
├─ API 名 (VirtualAlloc、CreateRemoteThread)?
│ └─ NO — 呼び出しサイトの 16 進パターンを使用
├─ Windows システム ファイルに表示される?
│ └─ NO — 一般的すぎます。ユニークな何かを見つけてください
├─ 一般的なパス (C:\Windows\、cmd.exe)?
│ └─ NO — マルウェア固有のパスを見つける
├─ このマルウェア ファミリーに固有?
│ └─ YES — 使用する
└─ 他のマルウェアにも表示される?
└─ おそらく — ファミリー固有のマーカーと組み合わせる
"all of" と "any of" をいつ使うか
すべての文字列を要求するか、任意を許可するか?
├─ 文字列は個別にマルウェアに固有?
│ └─ any of them (それぞれが疑わしい)
├─ 文字列は一般的だが組み合わせが疑わしい?
│ └─ all of them (完全なパターンを要求)
├─ 文字列の信頼度レベルが異なる?
│ └─ グループ:all of ($core_*) and any of ($variant_*)
└─ 多くの誤検知を見ている?
└─ 厳密化:any → all に変更、必須文字列をさらに追加
本番環境のレッスン: any of ($network_*) を使用するルールでは、文字列が "fetch"、"axios"、"http" を含めると、事実上すべてのウェブアプリケーションにマッチしました。認証情報パス AND ネットワーク呼び出し AND exfil 宛先を要求するように切り替えることで、FP を排除しました。
ルール アプローチを放棄するタイミング
これらの場合に停止してピボットしてください:
-
yarGen が API 名とパスのみを返す → 文字列が失敗したとき、構造にピボット を参照
-
3 つのユニークな文字列が見つからない → パック化されている可能性があります。未パック版をターゲットにするか、パッカーを検出してください。
-
ルールが正規ウェア ファイルにマッチする → 文字列はユニークではありません。1~2 回のマッチ = 調査して厳密化、3~5 回のマッチ = 異なるインジケータを見つける、6 回以上 = 最初からやり直す。
-
パフォーマンスが最適化後でも悪い → アーキテクチャの問題です。複数の的を絞ったルールに分割するか、厳密なプリフィルタを追加してください。
-
説明が書きにくい → ルールが不明確です。何をキャッチするかを説明できない場合、キャッチしすぎています。
誤検知のデバッグ
FP 調査フロー:
│
├─ 1. どの文字列がマッチしたか?
│ 実行:yr scan -s rule.yar false_positive.exe
│
├─ 2. それは正規ライブラリに存在するか?
│ └─ 追加:not $fp_vendor_string 除外
│
├─ 3. 共通の開発パターンか?
│ └─ より具体的なインジケータを見つけ、文字列を置き換える
│
├─ 4. 複数の一般的な文字列が一緒にマッチしているか?
│ └─ すべてを要求するよう厳密化 + ユニークなマーカーを追加
│
└─ 5. マルウェアが共通テクニックを使用しているか?
└─ テクニック ではなく、マルウェア固有の実装詳細をターゲット
16 進数 vs テキスト vs 正規表現
どの文字列タイプを使うべき?
│
├─ 正確な ASCII/Unicode テキスト?
│ └─ TEXT:$s = "MutexName" ascii wide
│
├─ 特定のバイト シーケンス?
│ └─ HEX:$h = { 4D 5A 90 00 }
│
├─ 変動のあるバイト シーケンス?
│ └─ ワイルドカード付き HEX:{ 4D 5A ?? ?? 50 45 }
│
├─ 構造を持つパターン (URL、パス)?
│ └─ 有界正規表現:/https:\/\/[a-z]{5,20}\.onion/
│
└─ 不明なエンコーディング (XOR、base64)?
└─ 修飾子付き TEXT:$s = "config" xor(0x00-0xFF)
サンプルはパック化されているか? (最初に確認)
文字列ベースのルールを書く前に:
サンプルはパック化されているか?
├─ エントロピー > 7.0?
│ └─ おそらくパック化 — 未パック化層を最初に見つける
├─ 読み取り可能な文字列が少ない/ない?
│ └─ おそらくパック化 — エントロピー、PE 構造、またはパッカー シグネチャを使用
├─ UPX/MPRESS/カスタム パッカーが検出された?
│ └─ 未パック化ペイロード OR パッカー自体を検出
└─ 読み取り可能な文字列が利用可能?
└─ 文字列ベースの検出を進める
専門家のガイダンス: パック化レイヤーに対するルールを書かないでください。パッキングは変わります。ペイロードは変わりません。
文字列が失敗したとき、構造にピボット
yarGen が API 名と一般的なパスのみを返す場合:
文字列抽出が失敗 — 次は?
├─ 高エントロピー セクション?
│ └─ 特定セクションで math.entropy() を使用
├─ 異常なインポート パターン?
│ └─ インポート ハッシュ クラスタリングに pe.imphash() を使用
├─ 一貫した PE 構造の異常?
│ └─ セクション名、サイズ、特性をターゲット
├─ メタデータが存在?
│ └─ バージョン情報、タイムスタンプ、リソースをターゲット
└─ ユニークなものがない?
└─ このサンプルは YARA だけでは検出できない可能性があります
専門家のガイダンス: 「メタデータ、エントロピー、インポート ハッシュ、その他の一定で留まるデータなど、他のファイル プロパティを使用できます。」— Kaspersky Applied YARA Training
専門家のヒューリスティクス
文字列選択: ミューテックス名は金、C2 パスは銀、エラー メッセージは銅です。スタック文字列はほぼ常にユニークです。6 個以上の文字列が必要な場合、オーバーフィッティングしています。
条件設計: filesize < で開始し、その後マジック バイト、次に文字列、最後にモジュール。5 行以上の場合は、複数のルールに分割してください。
品質シグナル: yarGen 出力は 80% フィルタリングが必要です。バリアントの <50% にマッチするルールは狭すぎ、正規ウェアにマッチするルールは広すぎです。
修飾子の規律:
- 推測で
nocaseまたはwideを使用しない — サンプルでケース/エンコーディングが変わることを確認した場合のみ nocaseはアトム生成を 2 倍に、wideは文字列マッチングを 2 倍にします — どちらも実際のコストがあります- 「これらの修飾子を使用する明確な理由がない場合は、使用しないでください。」— Kaspersky Applied YARA
正規表現のアンカリング:
- 4+ バイトのリテラル部分文字列のない正規表現 は、すべてのファイル オフセットで評価されます — 壊滅的なパフォーマンス
- 常に正規表現を特別なリテラルにアンカーしてください:
/mshta\.exe http:\/\/.../ではなく/http:\/\/.../ - アンカーできない場合は、代わりにワイルドカードを使用した 16 進パターンを検討してください
ループの規律:
- 常にループを filesize でバウンドしてください:
filesize < 100KB and for all i in (1..#a) : ... - アンバウンドの
#aは大規模ファイルで数千になる可能性があります — 指数関数的な減速
YARA-X ヒント: $_unused 警告を抑制するため、private $s 出力から隠す、すべてのコミット前に yr check + yr fmt を実行。
モジュールと バイト チェックを使うべき時
モジュールまたはバイト チェックを使うべき?
├─ imphash/rich ヘッダー/authenticode が必要?
│ └─ PE モジュールを使用 — 複製するには複雑すぎます
├─ マジック バイトまたはシンプルなオフセットをチェック?
│ └─ uint16/uint32 を使用 — より高速、モジュール オーバーヘッドなし
├─ セクション名/サイズをチェック?
│ └─ PE モジュール がクリーンですが、マジック バイト フィルタを最初に追加
├─ Chrome 拡張パーミッションをチェック?
│ └─ crx モジュールを使用 — 文字列解析は脆弱です
└─ LNK ターゲット パスをチェック?
└─ lnk モジュールを使用 — LNK フォーマットは複雑です
専門家のガイダンス: 「magic モジュールを避けてください — 代わりに明示的な 16 進チェックを使用してください。」— Neo23x0。この原則を適用してください:uint32() で行える場合は、モジュールを読み込まないでください。
YARA-X の新機能
最近のリリースの主な追加:
- プライベート パターン (v1.3.0+):
private $helper = "pattern"— マッチしますが出力から隠す - 警告抑制 (v1.4.0+):
// suppress: slow_patternインラインコメント - 数値アンダースコア (v1.5.0+):
filesize < 10_000_000可読性向上 - 組み込みフォーマッター:
yr fmt rules/標準化フォーマット用 - NDJSON 出力:
yr scan --output-format ndjsonツール用
YARA-X ツーリング ワークフロー
YARA-X はレガシー YARA にない診断ツールを提供します:
ルール開発サイクル:
# 1. 初期ルールを作成
# 2. 詳細なエラーで構文をチェック
yr check rule.yar
# 3. 一貫性をフォーマット
yr fmt -w rule.yar
# 4. モジュール出力をダンプしてファイル構造を検査 (ダミー ルール不要)
yr dump -m pe sample.exe --output-format yaml
# 5. タイミング情報でスキャン
time yr scan -s rule.yar corpus/
yr dump を使う時:
- 利用可能な PE/ELF/Mach-O フィールドを調査
- モジュール条件がマッチしない理由をデバッグ
- 新しいモジュール (crx、lnk、dotnet) をルール作成前に探索
YARA-X 診断の利点: エラー メッセージには正確なソース位置が含まれます。yr check が行 15 を指す場合、問題は実際に行 15 にあります (レガシー YARA と異なります)。
Chrome 拡張機能分析 (crx モジュール)
crx モジュールは悪意のある Chrome 拡張機能の検出を可能にします。YARA-X v1.5.0+ (基本)、v1.11.0+ (permhash() 用) が必要です。
主要 API: crx.is_crx、crx.permissions、crx.permhash()
危険信号: nativeMessaging + downloads、debugger パーミッション、<all_urls> のコンテンツ スクリプト
import "crx"
rule SUSP_CRX_HighRiskPerms {
condition:
crx.is_crx and
for any perm in crx.permissions : (perm == "debugger")
}
完全な API リファレンス、パーミッション リスク評価、ルール例については、crx-module.md を参照してください。
Android DEX 分析 (dex モジュール)
dex モジュールは Android マルウェア検出を可能にします。YARA-X v1.11.0+ が必要です。レガシー YARA の dex モジュールとは互換性がありません — API は完全に異なります。
主要 API: dex.is_dex、dex.contains_class()、dex.contains_method()、dex.contains_string()
危険信号: 1 文字のクラス名 (オブファスケーション)、DexClassLoader リフレクション、暗号化されたアセット
import "dex"
rule SUSP_DEX_DynamicLoading {
condition:
dex.is_dex and
dex.contains_class("Ldalvik/system/DexClassLoader;")
}
完全な API リファレンス、オブファスケーション検出、ルール例については、dex-module.md を参照してください。
レガシー YARA からの移行
YARA-X には 99% のルール互換性がありますが、より厳密な検証を実施します。
クイック移行:
yr check --relaxed-re-syntax rules/ # 問題を特定
# 各問題を修正してから:
yr check rules/ # relaxed モード なしで検証
一般的な修正:
| 問題 | レガシー | YARA-X 修正 |
|---|---|---|
正規表現のリテラル { | /{/ | /\{/ |
| 無効なエスケープ | \R サイレント リテラル | \\R または R |
| Base64 文字列 | 任意の長さ | 3+ 文字必須 |
| 負のインデックス | @a[-1] | @a[#a - 1] |
| 重複修飾子 | 許可 | 重複を削除 |
注:
--relaxed-re-syntaxは診断ツールとしてのみ使用してください。relaxed モードに頼らず、問題を修正してください。
クイック リファレンス
命名規則
{CATEGORY}_{PLATFORM}_{FAMILY}_{VARIANT}_{DATE}
一般的なプレフィックス: MAL_ (マルウェア)、HKTL_ (ハッキング ツール)、WEBSHELL_、EXPL_、SUSP_ (疑わしい)、GEN_ (汎用)
プラットフォーム: Win_、Lnx_、Mac_、Android_、CRX_
例: MAL_Win_Emotet_Loader_Jan25
完全な規則、メタデータ要件、命名例については、style-guide.md を参照してください。
必須メタデータ
すべてのルールに必要:description (「Detects」で開始)、author、reference、date。
meta:
description = "Detects Example malware via unique mutex and C2 path"
author = "Your Name <email@example.com>"
reference = "https://example.com/analysis"
date = "2025-01-29"
文字列選択
良好: ミューテックス名、PDB パス、C2 パス、スタック文字列、設定マーカー 悪い: API 名、一般的な実行可能ファイル、フォーマット指定子、一般的なパス
完全な判定木と例については、strings.md を参照してください。
条件パターン
条件を短絡化するための順序:
filesize < 10MB(即座)uint16(0) == 0x5A4D(ほぼ即座)- 文字列マッチ (安価)
- モジュール チェック (高価)
詳細な最適化パターンについては、performance.md を参照してください。
ワークフロー
- サンプルを収集 — 複数のサンプル。単一サンプルのルールは脆弱です
- 候補を抽出 —
yarGen -m samples/ --excludegood - 品質を検証 — 判定木を使用、yarGen は 80% フィルタリングが必要
- 初期ルールを作成 — テンプレートに従い適切なメタデータを使用
- Lint とテスト —
yr check、yr fmt、リンタ スクリプト - 正規ウェア検証 — VirusTotal コーパスまたはローカル クリーン ファイル
- デプロイ — 完全なメタデータをリポジトリに追加、FP を監視
サンプル収集からデプロイメントまですべてのフェーズをカバーする包括的なステップバイステップ ガイドについては、rule-development.md を参照してください。
一般的なミス
| ミス | 悪い | 良い |
|---|---|---|
| インジケータとしての API 名 | "VirtualAlloc" | 呼び出しサイトの 16 進パターン + ユニークなミューテックス |
| アンバウンド正規表現 | /https?:\/\/.*/ | /https?:\/\/[a-z0-9]{8,12}\.onion/ |
| ファイルタイプ フィルタがない | pe.imports(...) 最初 | uint16(0) == 0x5A4D and filesize < 10MB 最初 |
| 短い文字列 | "abc" (3 バイト) | "abcdef" (4+ バイト) |
| エスケープなしの波括弧 (YARA-X) | /config{key}/ | /config\{key\}/ |
パフォーマンス最適化
クイック ウィン: filesize を最初に配置、nocase を避ける、有界正規表現 {1,100}、16 進数を正規表現より優先。
危険信号: 4 バイト未満の文字列、アンバウンド正規表現 (.*)、ファイルタイプ フィルタなしのモジュール。
詳細なアトム理論と最適化については、performance.md を参照してください。
リファレンス ドキュメント
| トピック | ドキュメント |
|---|---|
| 命名とメタデータ規則 | style-guide.md |
| パフォーマンスとアトム最適化 | performance.md |
| 文字列タイプと判定 | strings.md |
| テストと検証 | testing.md |
| Chrome 拡張モジュール (crx) | crx-module.md |
| Android DEX モジュール (dex) | dex-module.md |
ワークフロー
| トピック | ドキュメント |
|---|---|
| 完全なルール開発プロセス | rule-development.md |
ルール例
examples/ ディレクトリには、ベストプラクティスを実証する実在で属性付けされたルールが含まれています:
| 例 | デモンストレーション | ソース |
|---|---|---|
MAL_Win_Remcos_Jan25.yar | PE マルウェア:段階的な文字列数、ファミリーごとに複数のルール | Elastic Security |
MAL_Mac_ProtonRAT_Jan25.yar | macOS:Mach-O マジック バイト、マルチカテゴリー グループ化 | Airbnb BinaryAlert |
MAL_NPM_SupplyChain_Jan25.yar | npm サプライ チェーン:実際の攻撃パターン、ERC-20 セレクタ | Stairwell Research |
SUSP_JS_Obfuscation_Jan25.yar | JavaScript:オブファスケータ検出、密度ベースのマッチング | imp0rtp3、Nils Kuhnert |
SUSP_CRX_SuspiciousPermissions.yar | Chrome 拡張:crx モジュール、パーミッション | 教育用 |
スクリプト
uv run {baseDir}/scripts/yara_lint.py rule.yar # スタイル/メタデータを検証
uv run {baseDir}/scripts/atom_analyzer.py rule.yar # 文字列品質をチェック
詳細なスクリプト ドキュメントについては、README.md を参照してください。
品質チェックリスト
ルールをデプロイする前に:
- 名前が
{CATEGORY}_{PLATFORM}_{FAMILY}_{VARIANT}_{DATE}フォーマットに従っている - 説明が「Detects」で開始し、何/どのように説明しているかを説明
- すべての必須メタデータが存在 (作成者、参照、日付)
- 文字列がユニーク (API 名、一般的なパス、フォーマット文字列ではない)
- すべての文字列が 4+ バイトで良好なアトム可能性を持つ
- Base64 修飾子は 3+ 文字の文字列のみ
- 正規表現パターンが
{をエスケープし、有効なエスケープシーケンスを持つ - 条件が安価なチェック (filesize、マジック バイト) で開始
- ルールがすべてのターゲット サンプルにマッチ
- ルールが正規ウェア コーパスで 0 回のマッチ
-
yr checkがエラーなしで完了 -
yr fmt --checkが完了 (一貫性のあるフォーマット) - リンタがエラーなしで完了
- ピア レビューが完了
リソース
品質 YARA ルール リポジトリ
本番環境ルールから学習。これらのリポジトリには、よくテストされ、適切に属性付けされたルールが含まれています:
| リポジトリ | フォーカス | メンテナー |
|---|---|---|
| Neo23x0/signature-base | 17,000+ 本番ルール、マルチプラットフォーム | Florian Roth |
| Elastic/protections-artifacts | 1,000+ エンドポイント テスト済みルール | Elastic Security |
| reversinglabs/reversinglabs-yara-rules | 脅威研究ルール | ReversingLabs |
| imp0rtp3/js-yara-rules | JavaScript/ブラウザ マルウェア | imp0rtp3 |
| InQuest/awesome-yara | キュレート済みリソース インデックス | InQuest |
スタイル & パフォーマンス ガイド
| ガイド | 目的 |
|---|---|
| YARA スタイル ガイド | 命名規則、メタデータ、文字列プレフィックス |
| YARA パフォーマンス ガイドライン | アトム最適化、正規表現バウンド |
| Kaspersky Applied YARA Training | 本番用途の専門家テクニック |
ツール
| ツール | 目的 |
|---|---|
| yarGen | サンプルから候補文字列を抽出 |
| FLOSS | オブファスケート済みとスタック文字列を抽出 |
| YARA-CI | 自動正規ウェア テスト |
| YaraDbg | ウェブベースのルール デバッガー |
macOS 固有リソース
| リソース | 目的 |
|---|---|
| Apple XProtect | /System/Library/CoreServices/XProtect.bundle/ の本番 macOS ルール |
| objective-see | macOS マルウェア研究とサンプル |
| macOS セキュリティ ツール | リファレンス リスト |
マルチ インジケータ クラスタリング パターン
本番環境ルールはしばしば種類別にインジケータをグループ化します:
strings:
// カテゴリ A:ライブラリ インジケータ
$a1 = "SRWebSocket" ascii
$a2 = "SocketRocket" ascii
// カテゴリ B:動作 インジケータ
$b1 = "SSH tunnel" ascii
$b2 = "keylogger" ascii nocase
// カテゴリ C:C2 パターン
$c1 = /https:\/\/[a-z0-9]{8,16}\.onion/
condition:
filesize < 10MB and
any of ($a*) and any of ($b*) // 両方のカテゴリから証拠を要求
これが機能する理由: 異なるインジケータ種は異なる信頼度レベルを持ちます。単一の C2 ドメインは確実性があります。一方、複数のライブラリ インポートで確実になります。$a*、$b*、$c* でグループ化することで、段階的な要件を表現できます。
ライセンス: CC-BY-SA-4.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- trailofbits
- リポジトリ
- trailofbits/skills
- ライセンス
- CC-BY-SA-4.0
- 最終更新
- 不明
Source: https://github.com/trailofbits/skills / ライセンス: CC-BY-SA-4.0
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。