
rhabdomancer v0.10.0
バイナリファイル内の潜在的に安全でないAPI関数への呼び出しを特定する脆弱性調査アシスタント。
rhabdomancer
"The road to exploitable bugs is paved with unexploitable bugs."
-- Mark Dowd
Rhabdomancerは、バイナリファイル内の潜在的に安全でないAPI関数への呼び出しを特定する、超高速なIDAヘッドレスプラグインです。監査担当者はこれらの候補ポイントからバックトレースを行い、信頼できない入力へのアクセスを可能にする経路を見つけることができます。

機能
- IDA 9.xとidalib-rs Rustバインディングによる、超高速のヘッドレスユーザーエクスペリエンス。
- IDAが実装するあらゆるアーキテクチャ向けにコンパイルされたC/C++バイナリターゲットをサポート。
- 問題のあるAPI関数の呼び出し箇所は標準出力に出力され、IDB内でマークされます。
- IDAが認識したライブラリコード内の呼び出し箇所(例:FLIRTシグネチャでマッチした静的リンクされたランタイム)には
(lib)というラベルが付きます。 - スタブを経由した呼び出し(例:ELFバイナリの
.pltエントリ、またはPEおよびMach-Oバイナリのインポートスタブで、サンクとしてリストされるもの)は、呼び出し元までトレースバックされます。 - ELFバイナリでは、関数は同じ呼び出し箇所を持つものとして意図的に2回リストされます。1回は
.pltスタブ(サンクとしてマーク)として、もう1回はそのインポートとしてです。各呼び出し箇所はIDB内で1回だけマークされます。
- IDAが認識したライブラリコード内の呼び出し箇所(例:FLIRTシグネチャでマッチした静的リンクされたランタイム)には
- 既知の問題のあるAPI関数は、監査作業の優先順位付けに役立つよう、危険度の階層にグループ化されています。
- [BAD 0] 高優先度 - 一般に安全でないと見なされる関数。
- [BAD 1] 中優先度 - 安全でない使用例がないか確認すべき興味深い関数。
- [BAD 2] 低優先度 - これらの関数を含むコードパスは慎重に確認すべきです。
- 既知の問題のあるAPI関数のリストは組み込みであり、
conf/rhabdomancer.tomlに基づく設定ファイルで簡単にカスタマイズできます。 - 関数名は、以下の装飾を除いてマッチングされます:先頭のドットとアンダースコア(例:
_strcpy)、ライブラリアリアスのプレフィックス(例:Universal CRTの__o_malloc、glibcの__libc_systemおよび__GI___snprintf)、そしてスタブおよびそのようなエイリアスに限り、既に使用されている名前にIDAが付加する数値サフィックス(例:memset_0)。
[!NOTE] 強化関数(例:
_FORTIFY_SOURCEを指定してビルドした際にstrcpyの代わりに使用される__strcpy_chk)は、リストされた関数のチェック済みバリアントであるため、意図的にマッチングされません。それらの呼び出しもマークするには、カスタム設定に明示的に追加してください(例:strcpyと同じ優先度で"__strcpy_chk"を追加)。
記事
- https://hex-rays.com/blog/streamlining-vulnerability-research-idalib-rust-bindings
- https://hnsecurity.it/blog/streamlining-vulnerability-research-with-ida-pro-and-rust
関連情報
- https://github.com/0xdea/ghidra-scripts/blob/main/Rhabdomancer.java
- https://docs.hex-rays.com/release-notes/9_0#headless-processing-with-idalib
- https://github.com/idalib-rs/idalib
- https://books.google.it/books/about/The_Art_of_Software_Security_Assessment.html
インストール
最新リリースを入手する最も簡単な方法は、crates.io経由です:
- IDA をダウンロード、インストール、設定します(https://hex-rays.com/ida-pro を参照)。
- LLVM/Clang をインストールします(https://rust-lang.github.io/rust-bindgen/requirements.html を参照)。
- Linux/macOS では、次のようにインストールします:
Windows では、代わりに次のコマンドを使用してください:export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo install rhabdomancer --locked$env:LIBCLANG_PATH="\path\to\clang+llvm\bin" $env:PATH="\path\to\ida;$env:PATH" $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations cargo install rhabdomancer --locked
コンパイル
あるいは、ソースからビルドすることもできます:
- IDAをダウンロード、インストール、設定します(https://hex-rays.com/ida-pro を参照)。
- LLVM/Clangをインストールします(https://rust-lang.github.io/rust-bindgen/requirements.html を参照)。
- Linux/macOSでは、次のようにコンパイルします:
Windows では、代わりに次のコマンドを使用してください:git clone --depth 1 https://github.com/0xdea/rhabdomancer cd rhabdomancer export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo build --release --lockedgit clone --depth 1 https://github.com/0xdea/rhabdomancer cd rhabdomancer $env:LIBCLANG_PATH="\path\to\clang+llvm\bin" $env:PATH="\path\to\ida;$env:PATH" $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations cargo build --release --locked
使用方法
- IDA が有効なライセンスで適切に設定されていることを確認してください。
- 必要に応じて、既知の不正 API 関数のリストをカスタマイズします。
conf/rhabdomancer.tomlをコピーし(組み込みリストの正確な内容については、インストール済みのバージョンに一致するタグを選択してください)、コピーを編集して、RHABDOMANCER_CONFIG環境変数にそのパスを設定します。ファイルにはhigh、medium、lowの配列のみを定義する必要があり、他のキーを含めてはなりません。 そうでない場合は、ビルド時にconf/rhabdomancer.tomlからバイナリに埋め込まれた組み込みリストが使用されます(そのファイルを編集するには再ビルドが必要です)。 - IDA のインストール先が標準以外の場所にある場合は、
IDADIR環境変数が設定されていることを確認してください。 - 次のように実行します:
既存のrhabdomancer <binary_file>.i64IDB ファイルは更新されます。存在しない場合は、新しい IDB ファイルが作成されます。 - 生成された
.i64IDB ファイルを IDA で開きます。 View>Open subviews>Bookmarksを選択します。- 結果が IDA ウィンドウに便利にまとめられていることを確認してください。
[!NOTE] Rhabdomancer はマークされた呼び出し箇所にコメントも追加します。ブックマークとコメントはどちらも
[BAD n] <function_name>としてタグ付けされます。ここでnは優先度ティア(0 = 高、1 = 中、2 = 低)であり、 スクリプトが IDB 内でそれらを検索できるようにするためです。この形式はリリース間で安定しています。
互換性
公式にサポートされているのは最新の IDA リリースのみですが、古いバージョンでも動作する場合があります。次の表は、 各 IDA バージョンに対応する最新の互換リリースをまとめたものです:
| IDAバージョン | 最新の互換リリース |
|---|---|
| v9.0.240925 | v0.2.4 |
| v9.0.241217 | v0.3.5 |
| v9.1.250226 | v0.6.2 |
| v9.2.250908 | v0.7.6 |
| v9.3.260213 | v0.8.1 |
| v9.3.260327 | v0.9.0 |
| v9.3.260421 | v0.9.3 |
| v9.4.260714 | 現在のリリース |
| v9.4.260915 | 現在のリリース |
[!NOTE] 追加情報については idalib-rs のドキュメントを確認してください。
クレジット
このプロジェクトの開発は、以下の組織によって支援されています:
変更履歴
TODO
- 既知の悪性 API 関数リストをさらに充実させる(https://github.com/0xdea/semgrep-rules を参照)。
.pltセグメント外のサンク(例:MSVC のインクリメンタルリンクによるj_サンク)を介した呼び出しを追跡する。- IDA が認識したライブラリコード内の呼び出し箇所のマーキングをスキップすることを検討する(現在は
(lib)とラベル付けされるのみ)。 - 自動解析と分析を容易にするため、シリアライズされた出力を実装する。
- VulFi および VulnFanatic のスタイルに倣った基本的なルールセットを実装する。