本文の内容は、2024年1月9日に MIGUEL HERNÁNDEZ が投稿したブログ(https://sysdig.com/blog/fuzzing-and-bypassing-the-aws-waf/)を元に日本語に翻訳・再構成した内容となっております。
Sysdig 脅威リサーチチーム は、特殊な DOM イベントを使用して AWS WAF をバイパスするテクニックを発見しました。ウェブアプリケーションファイアウォール(WAF)は、ウェブアプリケーションの防御の第一線として機能し、不正または悪意のある活動から保護するために、アプリケーションと受信するWebトラフィックの間でフィルタとして機能します。
このブログ記事では、最も一般的に使用されている Web アプリケーションファイアウォールの一つである AWS WAF を分析し、それをバイパスする方法を説明します。
タイムライン
2023-10-25: AWSセキュリティチームに脆弱性が報告される
2023-10-25: AWSチームからの承認
2023-12-13: 修正版の配布
2024-01-08: 情報公開とブログ投稿
AWS WAF 101: ハッキングされないためのABC
AWSコンソールでWAFを設定するのは簡単です。テストでは、実際のWebアプリケーションをホストするEC2インスタンス、AWS WAFのビルトインサポートを持つロードバランサー、および定義済みのルールセットで構成されるテスト環境を構築しました:
- AWS-AWSManagedRulesCommonRuleSet
- AWS-AWSManagedRulesKnownBadInputsRuleSet
- AWS-AWSManagedRulesSQLiRuleSet
一般的なルールセットは XSS 攻撃に対処し、不正な入力の識別は、認識されたパスと文字列(/bin/bash、/etc/passwd など)をフィルタリングすることで、Web アプリケーショ ンにおけるコマンド実行のような既知の脆弱性の悪用を防ぐのに役立ちます。最後に、SQLi ルールセットは、SQL インジェクションをブロックする役割を果たします(最近、別のバイパスが発見されまし たので、チェックしてみてください)。
AWSはプラグアンドプレイのセキュリティ対策のためにマネージドルールを提供していますが、これらのルールは特効薬ではないことに注意してください。通常、特定のエンコーディングメカニズムを悪用する攻撃を防ぐのに十分な強度を持たせるには、細かいチューニングが必要です。
WAFを深く掘り下げる:手動テスト、タグ、イベント
私たちのアプローチは当初、WAFがリクエストをブロックする原因となるすべての入力を特定することに基づいていました。これには、さまざまなタグと属性を組み合わせて、さまざまなテクニックを使って一連の手動テストを実施することが必要でした。この最初の調査によって、WAFの特定の動作と制限について洞察を得ることができ、より高度なテストのためのステップを設定することができました。

そして、AWS WAFは、何がマッチしたのか、どのルールがイベントを発生させたのかを理解するのに役立つメトリクスを提供してくれます。

悲しいことに、膨大な量のタグとイベントのために、WAFによってカバーされないエッジケースを見つけるためにペイロードのすべての順列と組み合わせをテストすることはほとんど不可能であることが判明しました。その結果、私たちは手法を変更し、独自のWAF ファザー(Wafer)の構築を開始することにしました。
カオスを自動化: SeleniumでWAFをファジング
私たちのファザーは、美しいPortSwigger XSSリファレンスに基づいており、最新のブラウザで動作することが確認されいる最新のペイロードが主に含まれています。
このツールは、フィルタリングされていないタグと属性を自動的に見つけ、それらを組み合わせて動作するペイロードを形成するように設計されています。このツールは、最初にタグと属性によって反復し、存在できない単語を認識した後、動作するペイロードを検索するためにファイアウォールがブロックしないキーワードを使用して順列を生成します。
しかし、ペイロードを生成した後は、それがブラウザ内で実行され、トリガーされるようにしなければなりません。これを行うために、アラートが呼び出されたことを検証し、入力フィールドやボタンのような要素をユーザがクリックするインタラクションをシミュレートするために、Selenium(ウェブブラウザを自動化するためのオープンソースのフレームワーク)を使用しました。

先に述べたように、アラートをキャッチする方法を見つけたり、ユーザーとの対話からXSSをトリガーすることが可能かどうかをチェックしたりするなど、開発中にいくつかの課題を克服しなければなりませんでした。
これらの問題を克服するために、次のようなアラート、確認、プロンプトのすべての呼び出しをキャッチするシンプルなフックを作成しました:
window.alert_trigger = false;
window.alert = function() {
window.alert_trigger = true;
};
window.confirm = window.alert;
window.prompt = window.alert;
Code language: JavaScript (javascript)
2つ目の問題(ページ内のすべての要素でユーザー インタラクションをトリガーする)は、blur、focus、click、drag & drop などの一般的なイベントを発生させる役割を持つ別の JS スクリプトをインジェクトすることで解決しました。
var ids = [IDs of the created elements]
for (var i = 0; i < ids.length; i++) {
var element = document.getElementById(ids[i]);
if(!element) continue;
// Trigger all possible events click, mouseover, etc.
var events = ['click', 'mouseover', 'mousedown', 'mouseup', 'mousemove', 'mouseout', 'mouseenter', 'mouseleave', 'dblclick', 'contextmenu', 'wheel', 'select', 'pointerdown', 'pointerup', 'pointermove', 'pointerover', 'pointerout', 'pointerenter', 'pointerleave', 'gotpointercapture', 'lostpointercapture'];
try {
for (var j = 0; j < events.length; j++) {{
var event = new MouseEvent(events[j], {{bubbles: true}});
element.dispatchEvent(event);
}}
element.focus();
element.blur();
element.dispatchEvent(new KeyboardEvent('keydown', {{ctrlKey: true, altKey: true, key: 'x'}}));
} catch (e) {}
}
Code language: JavaScript (javascript)
それとは別に、ファザーは、スペースや改行を使用してタグを分割したり、後で ASCII 表現に変換されるランダムな Unicode 文字を追加したりするなど、正規表現ベースのルールをバイパスしようとするさまざまな戦略を実装しています。 ファザーをリリースしました。こちらでご覧いただけます。
上記のナレッジで、私たちはファザーを起動したまま忘れていました。
ミッション・ポッシブル: AWS WAFバイパスPoC
数日後、結果を確認するために戻ってきたとき、JS実行のトリガーとなる可能性のあるペイロードを特定できたというファザーからのメッセージを見つけました。
簡単に確認したところ、onbeforetoggleイベントを使用していることがわかりました。

このペイロードはWAFの防御をうまくかいくぐり、同時にアラートボックスを実行することに成功しました。これは実験的な onbeforetoggle イベントに依存して、標準的な HTML ボタンを popover 要素にリンクし、それらの機能を連鎖させて任意の JavaScript コードを実行します。例えば、以下のペイロードは既存のWAFの保護をバイパスします。
<strong><button popovertarget=x>click me</button><test onbeforetoggle=alert(document.domain) popover id=x>aaa</aaa></strong>
Code language: HTML, XML (xml)
実際のシナリオでこの脆弱性が悪用された場合、攻撃者が脆弱なアプリケーションに悪意のあるスクリプトを埋め込み、機密性の高いユーザーデータやシステムの完全性を損なう可能性があります。
AWS WAFの機能と限界を分析する中で、AWS WAFが優れた防御の第一線として機能する一方で、私たちの実験は、どのようなセキュリティソリューションも万全とは言えないことを示しました。組織は、既成のソリューションだけに頼るべきでは決してなく、進化する脅威の先を行くために、セキュリティコントロールを常に適応させ、テストする必要があります。
この手法を F5 WAF および ModSecurity に対してテストしました。 どちらもそのようなペイロードを正しく識別してブロックできます。