
Cake Fuzzerは、特定のフレームワークに基づいて作成されたWebアプリケーションの脆弱性を、偽陽性を非常に抑えながら自動的かつ継続的に発見するのに役立つプロジェクトです。
最新リリース: 1.0
ライセンス: GNU GPL v3.0
Cake Fuzzer は、特定のフレームワークに基づいて作成された Web アプリケーションの脆弱性を、非常に少ない誤検知で自動的かつ継続的に発見することを目的としたプロジェクトです。現在は Cake PHP フレームワークをサポートするように実装されています。
調査プロセスの詳細については、次の記事シリーズをご覧ください: CakePHP アプリケーション サイバーセキュリティ調査
以下は、Cake Fuzzer によって発見されたバグの一部です:
| タイトル | 重要度 | リンク |
|---|---|---|
| Cerebrate のブラインド SQL インジェクション | 9.8 Critical | https://zigrin.com/advisories/cerebrate-blind-sql-injection/ |
| CRUD コンポーネントの SQL インジェクション | 8.8 High | https://zigrin.com/advisories/misp-sql-injection-in-crud-component/ |
| DOM ベース XSS | 6.1 Medium | https://zigrin.com/advisories/misp-dom-based-xss/ |
| order パラメータのブラインド SQL インジェクション | 8.8 High | https://zigrin.com/advisories/misp-blind-sql-injection-in-order-parameter/ |
| 配列入力パラメータのブラインド SQL インジェクション | 8.8 High | https://zigrin.com/advisories/misp-blind-sql-injection-in-array-input-parameters/ |
| /Logs/index の Time-based SQL インジェクション | 7.2 High | https://zigrin.com/advisories/misp-time-based-sql-injection-in-logs-index/ |
Webアプリケーションにおける自動ツールを使用した脆弱性発見の典型的なアプローチは次のとおりです:
どちらの方法にも欠点があります。SAST は誤検知率が高く、脆弱性ではないか、悪用可能ではない発見が多いです。DAST は誤検知は少ないものの、情報が限られているため発見される脆弱性は少なくなります。また、アプリケーションに関するある程度の知識と、スキャンを実行する人のセキュリティに関する背景が必要です。多くの場合、アプリケーションごとにカスタムスキャン設定が必要で、適切に動作させるにはそれが必要です。
Cake Fuzzer プロジェクトは、両方のアプローチの利点を組み合わせ、上記の欠点を排除することを目的としています。このアプローチは IAST (Interactive Application Security Testing) と呼ばれます。
プロジェクトの目標は次のとおりです:
注: 一部の脆弱性クラスは Cake Fuzzer の対象外であるため、Cake Fuzzer はそれらを検出できません。そのようなクラスの例としては、ビジネスロジックの脆弱性やアクセス制御の問題があります。

Drawio: Cake Fuzzer アーキテクチャ
Cake Fuzzer は 3 つの主要な (かなり独立した) サーバーで構成され、これらが連携して CakePHP アプリケーションの動的な脆弱性テストを可能にします。
その他のコンポーネントは次のとおりです:
Cake Fuzzer は IAST (Interactive Application Security Testing) の概念に基づいています。事前定義された攻撃セットを含み、実行前にランダムに変更されます。Cake Fuzzer は Cake PHP フレームワークのおかげでアプリケーション内部に関する知識を持っているため、攻撃はアプリケーションのすべての可能なエントリポイントに対して発射されます。
攻撃中、Cake Fuzzer はアプリケーションと基盤システムのさまざまな側面を監視します。たとえば:
これらの情報源により、Cake Fuzzer はより多くの脆弱性を特定し、より高い確実性で報告できます。
以下のセクションでは、ターゲットが CVE-2021-41326 に対して脆弱な古い MISP v2.4.146 である Cake Fuzzer 開発環境をセットアップする手順を説明します。
ホストオペレーティングシステムで以下のコマンドを実行し、古い MISP VM をダウンロードします:
cd ~/Downloads # MISP VM を保存したい場所があれば適宜変更
wget https://vm.misp-project.org/MISP_v2.4.146@0c25b72/[email protected] -O MISP.zip
unzip MISP.zip
rm MISP.zip
mv VMware/ MISP-2.4.146
VMWare GUI で以下の操作を行い、ホスト OS と MISP 間で Cake Fuzzer ファイルを共有できるようにします:
ホスト OS で以下のコマンドを実行します (MISP_IP_ADDRESS を先にメモした IP アドレスに置き換えてください):
ssh-copy-id misp@MISP_IP_ADDRESS
ssh misp@MISP_IP_ADDRESS
MISP に SSH で接続したら、以下のコマンド (MISP ターミナル内) を実行して、ホスト OS と MISP 間での Cake Fuzzer ファイル共有の設定を完了します:
sudo apt update
sudo apt-get -y install open-vm-tools open-vm-tools-desktop
sudo apt-get -y install build-essential module-assistant linux-headers-virtual linux-image-virtual && sudo dpkg-reconfigure open-vm-tools
sudo mkdir /cake_fuzzer # 注: このパスはインストルメンテーション (パッチの 1 つ) にハードコードされているため固定です
sudo vmhgfs-fuse .host:/cake_fuzzer /cake_fuzzer -o allow_other -o uid=1000 -o max_write=61440
# max_write は奇妙なファイルコピーバグを修正します: https://github.com/vmware/open-vm-tools/issues/437#issuecomment-669663891
ls -l /cake_fuzzer # すべてがうまくいけば、ホスト OS の Cake Fuzzer ディレクトリの内容が表示されるはずです。ホスト OS での変更は VM 内に反映され、その逆も同様です。
簡単なテストのために MISP を準備します (MISP ターミナル内):
CAKE=/var/www/MISP/app/Console/cake
SUDO='sudo -H -u www-data'
$CAKE userInit -q
$SUDO $CAKE Admin setSetting "Security.password_policy_length" 1
$SUDO $CAKE Admin setSetting "Security.password_policy_complexity" '/.*/'
$SUDO $CAKE Password [email protected] admin --override_password_change
最後に Cake Fuzzer の依存関係をインストールし、venv を準備します (MISP ターミナル内):
source /cake_fuzzer/precheck.sh
Cake Fuzzer は /cake_fuzzer/strategies フォルダ内の脆弱性をスキャンします。
新しい攻撃を追加するには、strategies フォルダに新しい new-attack.json ファイルを追加する必要があります。
各脆弱性には 2 つの主要フィールドがあります: Scenarios と Scanners。Scenarios は攻撃ペイロードの基本フォームを保存します。一方、Scanners は応答、stdout、stderr、ログ、結果を検出する正規表現やフレーズを保持します。
Scenarios のペイロード作成ペイロードを作成するには、まず脆弱性と、可能な限り少ないペイロードでそれを検出する方法を理解する必要があります。
__cakefuzzer__new-attack_§CAKEFUZZER_PAYLOAD_GUID§__ のようなカナリア値を使用することをお勧めします。
カナリア値には固定文字列 (例: __cakefuzzer__new-attack_) と、ファザーによって動的に変更される動的識別子 (GUID 部分 §CAKEFUZZER_PAYLOAD_GUID§) が含まれます。最初のカナリア部分は、ペイロードが Scanners によって検出されることを保証するために使用されます。2 番目のカナリア部分 (GUID) は、ペイロードが実行されるたびに擬似ランダム値に変換されます。したがって、ペイロードがアプリケーションで使用されるパラメータに注入されるたびに、カナリアは __cakefuzzer__new-attack_8383938__ のように変更され、8383938 は他のすべての攻撃間で一意になります。Scanners の検出と生成スキャナーを作成するには、まず脆弱性がトリガーされたときにアプリケーションがどのように動作するかを理解する必要があります。利用できるスキャナーの種類には、response、sterr、logs、files、processes などがあります。各スキャナーは異なる目的を果たします。
たとえば、XSS のスキャナーを構築する場合、アプリケーションの HTML 応答内で脆弱性の兆候を探します。ResultOutputScanner スキャナーを使用してカナリア値とペイロードを探すことができます。一方、SQL インジェクションの脆弱性はエラーログを介して検出できます。その目的には LogFilesContentsScanner と ResultErrorsScanner を使用できます。
Scanner 正規表現の最後の属性は、効率的な正規表現を生成することです。すべてのケースに一致する .* や .+ のような正規表現は避けてください。これらは非常に時間がかかり、スキャン全体の完了時間を大幅に増加させます。前述のように、効率性は脆弱性の重要な部分です。Scenarios と Scanners はどちらもできるだけ少ない要素を含む必要があります。これは、Cake Fuzzer がすべてのシナリオを検出されたすべての可能なパスで複数回実行するためです。一方、すべての応答、新しいログエントリなどがスキャナーによって常にチェックされます。多くのパラメータ、パス、エンドポイントが検出されるため、ペイロードや Scanner を多く使用すると効率にかなり影響します。
特定の脆弱性クラスをスキャンしたくない場合は、指定された json ファイルを strategies フォルダから削除し、データベースをクリーンアップして、ファザーを再度実行します。
たとえば、アプリケーションを SQL インジェクション脆弱性に対してスキャンしたくない場合は、次の手順を実行します:
まず、準備された攻撃シナリオを削除します。これを達成するには、/cake_fuzzer/databases フォルダ内のすべてのファイルを削除します:
rm /cake_fuzzer/databases/*
その後、/cake_fuzzer/strategies から sqlinj.json ファイルを削除します:
rm /cake_fuzzer/strategies/sqlinj.json
最後に、SQL インジェクション攻撃を実行せずにファザーとすべての cake_fuzzer 実行プロセスを再実行します。
git clone https://github.com/Zigrin-Security/CakeFuzzer /cake_fuzzer
警告 Cake Fuzzer が
/cake_fuzzer以外のパスにある場合、正しく動作しません。ファイルシステムのルートディレクトリの下、/root、/tmpなどの隣に配置する必要があることに注意してください。
cd /cake_fuzzer
仮想環境に入っていない場合は、仮想環境に入ります:
source /cake_fuzzer/precheck.sh
または
source venv/bin/activate
cp config/config.example.ini config/config.ini
config/config.ini を設定します:
WEBROOT_DIR="/var/www/html" # テスト対象アプリケーションの `webroot` ディレクトリへのパス
CONCURRENT_QUEUES=5 # [オプション] 同時に実行される攻撃の数
ONLY_PATHS_WITH_PREFIX="/" # [オプション] ファザーはこのプレフィックスで始まる攻撃のみを生成します
EXCLUDE_PATHS="" # [オプション] ファザーはこの正規表現に一致するすべてのパスをスキャンから除外します。空の場合はすべてのパスが処理されます
PAYLOAD_GUID_PHRASE="§CAKEFUZZER_PAYLOAD_GUID§" # [オプション] 攻撃の直前に一意のペイロード ID に置き換えられる内部キーワード
INSTRUMENTATION_INI="config/instrumentation_cake4.ini" # [オプション] アプリケーションのカスタムインストルメンテーションへのパス
警告 Cake Fuzzer スキャン中、アプリケーションの多くの機能が制御不能な方法で複数回呼び出されます。これにより、アプリケーションが接続されている外部サービスへの接続や、外部サービスとのデータのプッシュ/プルが発生する可能性があります。機密性の高い外部サービスにアクセスできない、隔離された制御環境で Cake Fuzzer を実行することを強くお勧めします。
注 Cake Fuzzer はブラックホーリング、CSRF 保護、承認をバイパスします。すべての攻撃をデータベースの最初のユーザーの権限で送信します。このユーザーが最も高い権限を持つことをお勧めします。
アプリケーションはいくつかのコンポーネントで構成されています。
警告 すべての cake_fuzzer コマンドは root として実行する必要があります。
ファザーを開始する前に、ターゲットアプリケーションが完全にインストルメント化されていることを確認してください:
python cake_fuzzer.py instrument check
未適用の変更がある場合は、以下で適用します:
python cake_fuzzer.py instrument apply
cake fuzzer を実行するには、次の手順を実行します (少なくとも 3 つの別々のターミナルを使用することをお勧めします):
# 最初のターミナル
python cake_fuzzer.py run fuzzer # 攻撃を生成し、QUEUE に追加し、新しい SCANNERS を登録します (その後終了)
python cake_fuzzer.py run periodic_monitors # 監視を担当します (スキャン終了時に CTRL+C で停止して終了)
# 2 番目のターミナル
python cake_fuzzer.py run iteration_monitors # 監視を担当します (スキャン終了時に CTRL+C で停止して終了)
# 3 番目のターミナル
python cake_fuzzer.py run attack_queue # ATTACK QUEUE を開始します (スキャン終了時に CTRL+C で停止して終了)
# すべての攻撃が実行された後
python cake_fuzzer.py run registry # 発見された脆弱性に基づいて `results.json` を生成します
注: 現在、ログ (またはターゲット Web アプリのその他の動的に変更されるファイル) の所有者を変更する可能性があるバグがあります。これにより、Web アプリケーションを通常どおり使用するときにエラーが発生したり、将来の Cake Fuzzer 実行で誤検知が発生したりする可能性があります。MISP の場合は、ファザーを実行するたびに以下を実行することをお勧めします:
sudo chown -R www-data:www-data /var/www/MISP/app/tmp/logs/
スキャンが完了したら、インストルメンテーションを元に戻します:
python cake_fuzzer.py instrument revert
cake fuzzer を再度実行するには、次の手順を実行します:
アプリケーションのログを削除します (例として、MISP ログは /var/www/MISP/app/tmp/logs に保存されます)
rm /var/www/MISP/app/tmp/logs/*
/cake_fuzzer/databases フォルダ内のすべてのファイルを削除します
rm /cake_fuzzer/databases/*
cake_fuzzer/results.json ファイルを削除します (以前のスキャン結果は事前に保存または確認することを忘れないでください)
rm /cake_fuzzer/results.json
最後に、3 つのターミナルで以前の実行プロセスを再度実行します
Attack queue は実行された攻撃をデータベース内で 'executed' としてマークするため、スイート全体を再度実行するにはデータベースを削除して攻撃を再度追加する必要があります。
データベースを削除する前に、モニターと攻撃キューを確実に停止してください。
rm database.db*
python cake_fuzzer.py run fuzzer
python cake_fuzzer.py run attack_queue
これはおそらく、以前のログファイルが root によって上書きされたためです。Cake Fuzzer は root として動作するため、新しいログファイルは root を所有者として作成されます。それらを削除します:
chmod -R a+w /var/www/MISP/app/tmp/logs/*
Cake fuzzer をホストマシンと共有する VM を使用する場合、ホストディレクトリがゲスト VM に適切にアタッチされていることを確認してください:
sudo vmhgfs-fuse .host:/cake_fuzzer /cake_fuzzer -o allow_other -o uid=1000
Cake Fuzzer はマシンのルートディレクトリの下に配置する必要があり、ベースディレクトリ名は特に cake_fuzzer である必要があります。
mv CakeFuzzer/ /cake_fuzzer
instrument apply 実行中の "Patch" エラーインストルメンテーションプロセスは Cake Fuzzer 実行フローの一部です。instrument apply の後に instrument check を実行すると、両方のコマンドで同じ数の変更が発生するはずです。
"patch" エラーが発生した場合は、パッチを手動で適用し、問題のあるパッチファイルを削除できます。パッチは /cake_fuzzer/cakefuzzer/instrumentation/pathces ディレクトリにあります。
インストール中または実行中に Python の依存関係エラーが発生した場合は、仮想環境に切り替えた後、手動で依存関係をインストールします。
まず仮想環境に切り替えます
source venv/bin/activate
その後、pip3 で依存関係をインストールできます。
pip3 install -r requriments.txt
このプロジェクトは以下に触発されました:
このプロジェクトは以下によって委託されました: