WordPressプラグインの概念実証ファザーであり、300以上の脆弱性の発見につながりました。これらの脆弱性は、約3000万サイトにインストールされているWordPressプラグインに存在していました。
使用された手法は https://kazet.cc/2022/02/03/fuzzing-wordpress-plugins.html で説明されています。
研究を続けたい場合は、人気の低いプラグインから始めてください。もしプラグインが2021年10月から2024年1月の間に少なくとも1万のアクティブインストールを達成した場合、私はおそらくファザーのレポートを確認しています(特に2万以上のアクティブインストールがあるプラグインに重点が置かれています)。ファザーの動作には多くのランダム性があるため、これらのプラグインに未発見の脆弱性が残っている可能性はありますが、数は少ないです。
ファザーのレポートには多くの誤検出が含まれています。そのほとんどは脆弱性を示すものではありません。レポートを見た後は、観察している動作が本当に脆弱性なのか、それとも誤検出なのかをまず分析してください。WPScanやベンダーに生のファザーレポートをスパム送信しないでください。代わりにPoCエクスプロイトを提供してください。
明白な理由により、例にはすでに修正された脆弱性のみを含めます。
responsive-vector-maps バージョン6.4.0をファジングしていると仮定します:
./bin/fuzz_object plugin responsive-vector-maps --version 6.4.0
(最新バージョンをファジングする場合は --version を省略してください)。
ファジングが終了したら(このプラグインでは10〜30分程度かかります)、以下を実行します:
./bin/print_findings data/object_fuzz_results/
すると、次のような出力が表示されます:

これは、ファザーが既知のペイロード上での fopen() の実行を検出したことを意味します。ペイロードのほとんどには GARLIC という単語が含まれており、出力内での自動検出を容易にしています。これらは docker_image/magic_payloads.php で確認・設定できます。
次に、ソースコードを調べると、 wp_ajax_rvm_import_markers エンドポイントがファイルの内容を出力のレンダリングに使用しているため、サーバー上の任意のファイルを読み取ることが可能であることがわかります: CVE-2021-24947。
白で表示されているのが注目すべきクラッシュです(crash_detectors.py で変更や追加が可能です)。緑はコンテキストです。青はレポートファイル名(プラグイン名付き)、プラグインの人気度、エンドポイント名(ここでは ajax アクション名)です。
黄色のデータは、どの変数にどのペイロードが注入されたかを示しています。
page-builder-add バージョン1.4.9.4をファジングしていると仮定します:
./bin/fuzz_object plugin page-builder-add --version 1.4.9.4
結果を表示すると、既知のペイロードがエコーバックされているのが確認できます:

その後、手動でこの場所(青でエンドポイント名、ここではメニューページ名が表示されています)がXSSに対して脆弱かどうかをテストできます。このケースでは脆弱です: CVE-2021-25067。
./bin/fuzz_object plugin duplicate-page-or-post --version 1.4.6
結果を表示すると、update_option が呼び出されていることがわかります:

エンドポイントのコードを分析すると、これが格納型XSS脆弱性につながることがわかります: CVE-2021-25075。
残念ながら、ほとんどのプラグインではファザーは興味深いクラッシュを発見できず、その他のプラグインでもレポートの大部分は誤検出です。たとえば、次のような表示が出た場合:
Call: wp_mail arguments={'to': '[email protected]', 'subject': '[Plugin contact] - http://GARLICGARLICGARLIC.example.com'}
これは wp_mail が確かに呼び出されていることを意味しますが、受信者や件名の大部分を制御できるわけではありません。確実に判断したい場合は、プラグインのソースを確認してください。
$_GET['page'] には何も注入できません。最初のファジングまたはテストの実行には約1時間かかる場合があります。これは、インストゥルメント化されたPHPとWordPressを含むDockerイメージをビルドする必要があるためです。
./bin/fuzz_object plugin PLUGIN_SLUG
./bin/fuzz_object theme THEME_SLUG
ローカルのzipファイルからプラグインをインストールすることもできます:
./bin/fuzz_object plugin PLUGIN_FILE_NAME.zip
ファザーが見つけた内容を表示するには、以下を使用します:
./bin/print_findings data/object_fuzz_results/
テストを実行するには、以下を使用します:
./bin/test
警告: テストは長時間(1時間以上)かかり、ファザーが脆弱性を見つけるかどうかをチェックするため、ある程度の確率で失敗します。
wpgarlic は pre-commit を使用してリンターを実行し、コードをフォーマットします。
pre-commit はCI上で実行され、コードが適切にフォーマットされていることを確認します。
ローカルで実行するには、以下を使用します:
pre-commit run --all-files
コミットのたびに pre-commit が実行されるように設定するには、以下を使用します:
pre-commit install
1つのプラグインだけがインストールされたテスト環境を起動するには、以下を使用します:
./bin/manual_testing PLUGIN_SLUG|PLUGIN_PATH.zip [version]
プラグインはスラッグまたはローカルのzipファイルからインストールできます。
http://127.0.0.1:8001/ で待機します。
データベースには2人のテストユーザーがいます:
このツールは概念実証です。このセクションでは、より多くの脆弱性を見つけるために改善できる箇所を示します。
filtering.py を編集するとよいでしょう。このファイルには、特定のクラッシュを重要とみなすかどうかのルールが含まれています。変更すると誤検出が増える可能性がありますが、より多くの脆弱性を見つけることもできます。たとえば、私が出力されたヘッダーの中で重要とみなしたのはLocationヘッダーだけで、Open Redirect脆弱性を検出するためです。これは一つのアイデアであり、他にもアイデアがあるかもしれません。
拡張する価値のあるもう一つのファイルは docker_image/patch_wordpress.sh です。これは、どの関数の呼び出しが興味深いとしてログに記録されるかを記述しています。
他のペイロードを注入したい場合(または注入確率を変更したい場合)は、docker_image/magic_payloads.php と docker_image/fuzz/config.py を編集してください。
crash_detector.py には、興味深いクラッシュや露出した情報(例:メールアドレス)を見つける正規表現が含まれています。
ログイン済み管理者としてRESTルートをファジングすることは、誤検出を引き起こすため無効になっています。これを変更するには、config.DEFAULT_ENABLED_FEATURES の rest_routes_admin をコメント解除してください。
一部のプラグインは他のプラグイン(例:woocommerce)を依存関係として必要とします。依存関係のあるプラグインをファジングする場合、選択したプラグインのみをファジングし、依存関係のAJAXアクション、RESTルート、メニューページをスキップしたいと考えます。woocommerceのアクション/ルート/ページは、woocommerceをファジング対象として選択した場合のみファジングします。
依存関係のアクション/ルート/ページのリストはブロックリストと呼ばれ、docker_image/blocklists/ にリストされています。common という名前のファイルにはWordPressコアのアクション/ルート/ページが含まれており、これらもファジングしないようにします。
これらのブロックリストを更新するには、./bin/update_blocklists を使用します。
可能性があります。プラグインをローカルのテスト環境(たとえば「手動テスト環境」のセクションで説明されているもの)にインストールし、バグを分析してください。
そうとは限りません。 ファザーはいくつかのクラスの脆弱性を見つけますが、限界もあります。
ほとんどのプラグインではファザーは何も見つけません。このツールの目的は、むしろ多数のWordPressプラグインを大量にスキャンすることであり、単一のプラグインの包括的なテストを行うことではありません。
可能です。ファザーはペイロードをランダムに選択し、他の場所でもランダム性を導入します(例:https://kazet.cc/2022/02/03/fuzzing-wordpress-plugins.html#patched-equality で説明されているケースでの==演算子の動作方法など)。
Githubのチケットを提出するか、メールしてください: [email protected]