静的解析で曖昧なターゲット発見を自動化するためのフレームワーク
ソフトウェアでセキュリティ評価を実施する脆弱性研究者は、多くの場合、AFL ++やLibfuzzerなどの強力なツールを介してカバレッジ誘導ファジングの能力を活用します。これは、バスングプロセスを自動化し、ターゲットの利用可能な条件を迅速に明らかにするため、重要です。ただし、大規模で複雑なコードベースまたはクローズドソースバイナリに遭遇した場合、研究者は手動で監査してリバースエンジニアリングするために時間を費やして、ファジングベースの探索が役立つ機能を特定する必要があります。
Fuzzableは、C/C ++ソースコードとバイナリの両方を統合して、脆弱性研究者がファジングに実行可能な機能ターゲットを特定するのを支援するフレームワークです。これは、いくつかの静的分析ベースのヒューリスティックを適用して、ソフトウェアの危険な動作とそれらを実行する機能を特定することによって行われます。その後、研究者はフレームワークを利用して基本的なハーネステンプレートを生成します。これは、GoogleのOSS-Fuzzプロジェクトなど、脆弱性を探したり、連続的なファジングパイプラインの一部として統合するために使用できます。
スタンドアロンツールとしての実行に加えて、Fuzzableはバイナリニンジャアセンブラーのプラグインとして統合され、他の分解バックエンドのサポートが開発されています。
ここでツールを詳述した元のブログ投稿をご覧ください。これは、静的分析ヒューリスティックの技術仕様とこのツールがどのように生まれたかを強調しています。このツールは、Black Hat Arsenal USA 2022でも取り上げられています。
いくつかのバイナリターゲットには、いくらかの消毒が必要になる場合があります(つまり、署名マッチング、またはインライン化から機能を識別するため)。したがって、これらの問題を効果的に解決する能力があるため、主にバイナリニンジャを分解バックエンドとして使用します。したがって、スタンドアロンツールとプラグインの両方として使用できます。
バイナリ忍者はすべての人にアクセスできず、セキュリティ評価を利用してクラウドでスケールアップする可能性があるため、ANGRのフォールバックバックエンドもサポートされています。他の分解者も将来的に組み込むことを期待しています(優先度:Ghidra)。
バイナリニンジャコマーシャルがある場合は、スタンドアロンのヘッドレス使用のためにAPIをインストールしてください。
$ python3 /Applications/Binary Ninja.app/Contents/Resources/scripts/install_api.py
pipでインストール:
$ pip install fuzzable
依存関係の管理と建物に詩を使用しています。手動ビルドを行うには、サードパーティモジュールでリポジトリをクローンします。
$ git clone --recursive https://github.com/ex0dus-0x/fuzzable
手動でインストールするには:
$ cd fuzzable/
# without poetry
$ pip install .
# with poetry
$ poetry install
# with poetry for a development virtualenv
$ poetry shell
これで、ツールを使用してバイナリやソースコードを分析できるようになりました。
# analyzing a single shared object library binary
$ fuzzable analyze examples/binaries/libbasic.so
# analyzing a single C source file
$ fuzzable analyze examples/source/libbasic.c
# analyzing a workspace with multiple C/C++ files and headers
$ fuzzable analyze examples/source/source_bundle/
Binary Ninja > Manage Pluginsして検索することにより、バイナリニンジャプラグインマーケットプレイスを介してファズ可能なものを簡単にインストールできます。以下は、ファズ可能なプラグインの実行可能なプラグイン、ファジングのターゲットの識別、さらに脆弱性評価の例を示します。

Fuzzableには、分析をよりよく調整するのに役立つさまざまなオプションが付属しています。将来の計画と機能のリクエストでさらにサポートされます。
曖昧性を判断するために、ファズ可能なものはいくつかのヒューリスティックを利用して、どのターゲットが動的分析のために最も実行可能であるかを判断します。これらのヒューリスティックはすべて、SCIKIT基準ライブラリを使用してすべて異なる重み付けされており、マルチ基準の決定分析を利用して最良の候補者を決定します。これらのメトリックとウェイトはここに見ることができます:
| ヒューリスティック | 説明 | 重さ |
|---|---|---|
| ファズに優しい名前 | シンボル名は、ファイル/バッファ入力を摂取する動作を意味します | 0.3 |
| 危険なシンク | 危険な呼び出しに流れるという議論(すなわち、memcpy) | 0.3 |
| ナチュラルループ | ドミナンスフロンティアで検出されたループの数 | 0.05 |
| 環状複雑さ | エッジ +ノードに基づく関数ターゲットの複雑さ | 0.05 |
| カバレッジの深さ | ターゲットが移動するCalleesの数 | 0.3 |
前述のように、これらのメトリックが利用される理由と方法をより詳細に調べるために、テクニカルブログ投稿をご覧ください。
多くの指標は、0-KnowledgeファジングでのVincenzo Iozzoのオリジナル作品に大きく触発されました。
分析したいすべてのターゲットは多様であり、曖昧になり、プログラムターゲットのすべてのエッジケースの動作を説明できません。したがって、分析中にこれらの重みを適切に調整して、異なる結果がユースケースに対してより意味があるかどうかを確認することが重要かもしれません。 CLIでこれらの重みを調整するには、 --score-weights引数を指定するだけです。
$ fuzzable analyze <TARGET> --score-weights=0.2,0.2,0.2,0.2,0.2
デフォルトでは、ファズ可能なものは、次の基準に基づいて関数ターゲットを除外します。
staticで、ヘッダーを介して公開されない関数。ファズ可能で除外された通話を見るには、 --list_ignoredフラグを設定します。
$ fuzzable analyze --list-ignored <TARGET>
バイナリNinjaでは、この設定をSettings > Fuzzable > List Ignored Calls変えることができます。
ファズ可能な場合--include-*分析する必要がある重要な呼び出しを誤って除去する場合、実行中にそれらを含めるために使用することをお勧めします。
# include ALL non top-level calls that were filtered out
$ fuzzable analyze --include-nontop <TARGET>
# include specific symbols that were filtered out
$ fuzzable analyze --include-sym <SYM> <TARGET>
バイナリニンジャでは、これは設定>ファズ可能>> Symbols to Exclude Settings > Fuzzable > Include non-top level calls介してサポートされます。
ファズの理想的な候補者を見つけたので、ファズ可能なハーネスを生成するのにも役立ちます。これは、ファイルベースのファザー(つまり、AFL ++、Honggfuzz)またはインメモリーファッツァー(Libfuzzer)のいずれかで使用するために(ほぼ)機器とコンパイルする準備ができています。 CLIでそうするために:
# generate harness from a candidate
$ fuzzable create-harness target --symbol-name=some_unsafe_call
# make minimal and necessary modifications to the harness
$ vim target_some_unsafe_call_harness.cpp
# example compilation for AFL-QEMU, which is specified in the comments of the generated harness
$ clang target_some_unsafe_call_harness.cpp -no-pie -o target_some_unsafe_call_harness -ldl
# create your base seeds, ideally should be more well-formed for input
$ mkdir in/
$ echo "seed" >> in/seed
# start black box fuzzing
$ afl-fuzz -Q -m none -i in/ -o out/ -- ./target_some_unsafe_call_harness
このターゲットがソースコードベースの場合、汎用ソーステンプレートが使用されます。
ターゲットがバイナリの場合、一般的なブラックボックステンプレートが使用されます。これは、理想的にはAFL-QEMUのようなファジングエミュレーションモードで使用できます。シンボルが直接エクスポートdlopenれていない場合、バイナリのコピーも共有オブジェクトとして作成されます。
現時点では、この機能は非常に初歩的なものであり、適切なパラメーターが入力されたスタンドアロンC ++ハーネスを作成し、実行時の動作に必要なコード(つまり、インスタンス化および解放構造)に自動生成されないためです。ただし、ファズ可能なために作成されたテンプレートは、すぐに実行されるようになるはずです。ここに、私が将来的に実装したい野心的な機能がいくつかあります:
ファズ可能なサポートは、さまざまな形式でレポートを生成します。サポートされている現在のものは、JSON、CSV、およびMarkdownです。これは、シリアル化可能な形式で出力を摂取したい自動化の一部としてこれを利用している場合に役立ちます。
CLIでは、適切な拡張機能を備えたファイル名で--export引数を渡すだけです。
$ fuzzable analyze --export=report.json <TARGET>
バイナリNinjaでは、 Plugins > Fuzzable > Export Fuzzability Report > ...そして、それを記述するパスを選択します。
このツールは継続的に開発され、外部のマンタナーからの助けが高く評価されます!
Fuzzableは、MITライセンスに基づいてライセンスされています。