
変数のバックワードスライシングをドライバとして静的テイント分析を行うBinary Ninjaプラグイン
Mole は、バイナリ内の興味深い実行パスを特定するために設計された Binary Ninja プラグインです。Binary Ninja の Medium Level Intermediate Language (MLIL)(Static Single Assignment (SSA) 形式)を使用して変数の後方スライシングを実行し、静的汚染解析の基礎を形成します。
Mole において、パスとは、定義されたソースとシンクの間のデータの流れを指します。「興味深い」パスとは何かは分析の目的に依存します。たとえば、脆弱性を検索する場合、信頼されていない入力(ソース)が潜在的に危険な方法で機密操作(シンク)に影響を与えるパスを探すことがあります。
以下は、Mole の現在の機能の一部です:
操作モード:Mole は Binary Ninja の UI 内、またはヘッドレスモードのいずれかで実行できます。ヘッドレスモードは、多数のバイナリをスクリプトで解析する場合に特に便利です。一方、UI 内で Mole を使用すると、検出されたパスを詳細に調査するのに最適です。
パス特定:
.bndb 形式)に直接保存できます。パスはエクスポートすることもでき、たとえばファイルシステム上の多数のバイナリに対してヘッドレス解析を実行する場合に、特定されたパスを後でインポートして Binary Ninja 内でより簡単に調査できるようになります。AI によるパス解析:Mole は、OpenAI API を介してローカルまたはリモートの大規模言語モデル(LLM)と対話できます(使用方法を参照)。これらのモデルは、特定されたパスを分析し、そのパスが悪用可能な脆弱性に対応するかどうかを推論するために使用されます。LLM は脆弱性の分類と重大度レベルの割り当てを試み、これによりアナリストがどのパスをさらに調査する価値があるかを優先順位付けするのに役立ちます。Mole は、LLM が解析対象のバイナリに関する追加情報を要求するために使用できる基本的なツールセットを提供します。
手続き間変数スライシング:Mole は、関数境界を越えた MLIL 変数 のスライシングをサポートしています。これはいくつかの課題を提示します。たとえば、関数の有効な呼び出し元を静的に決定することは困難または不可能な場合がよくあります。その結果、実装されたアプローチは近似です。完璧ではありませんが、さまざまな実用的シナリオでかなり良好に機能します。
基本ポインタ解析:Mole は現在、ポインタの使用を追跡するための簡略化された戦略を実装しています。手続き間スライシングと同様に、このアプローチは本質的に制限がある単純化です(たとえば、グローバル変数を追跡できません)。それでも、多くの実用的なケースで良好に機能し、将来のバージョンで改善される予定です。
Mole が CVE-2021-4045(TP-Link Tapo C200 IP カメラにおける認証なしのコマンドインジェクションの欠陥)を明らかにする動作をご覧ください(以下の画像をクリックして YouTube で視聴):
Mole は現在開発中です。バグに遭遇した場合、誤検知や見逃しを明らかにする有用な新しい単体テストがある場合、または新機能の提案がある場合は、Issue を開くか、プルリクエストを介してコントリビュートしてください。また、現在の 単体テスト は linux-x86_64 と linux-armv7 バイナリでのみ検証されていることに注意してください。
Mole の助けを借りて脆弱性を発見するなど、興味深い成功事例があれば、ぜひお聞かせください。お気軽に体験を共有してください。