はじめに
Amazon API Gateway の REST API に、AWS WAF のコアルールセット(CRS)マネージドルールグループを設定しています。
リクエストボディにバイナリデータを格納してこの API をリクエストすると、コアルールセット(CRS)マネージドルールグループに含まれるCrossSiteScripting_BODY
ルールでリクエストがブロックされることがありました。
なぜバイナリデータでクロスサイトスクリプティング?と疑問に思い、色々調べてわかったことをまとめます。
コアルールセット(CRS)マネージドルールグループとは
一般的な Web アプリに必要になるであろうファイアウォールのルールを、ひとまとめにしてくれている AWS WAF のマネージドルールグループです。
公式ドキュメントには「すべての AWS WAF ユースケースでこのルールグループを使用することを検討してください」と記載されており、AWS WAF を使う場合はとりあえずこのルールグループを設定しておくと良さそうです。
今回はリージョン Web ACL に本ルールグループを設定しています。
CrossSiteScripting_BODY ルールとは
AWS WAF クロスサイトスクリプティング攻撃ルールステートメントを用いて、リクエストボディに一般的なクロスサイトスクリプティングパターンが含まれていないかを検査するルールです。
リージョン Web ACL の場合、検査の対象はリクエストボディに格納されたデータの先頭から 8KB 分のみになります。
なぜブロックされたのか
AWS re:Post に答えがありました。
要約すると「ファイルや画像(バイナリデータ)のメタデータに含まれるランダムな文字列は、SQLインジェクションやクロスサイトスクリプティングの攻撃に含まれる文字列と類似しているため、WAF で誤検出されることがある」とのことです。
どう対応したか
今回構築する Web アプリではクロスサイトスクリプティング攻撃によるリスクは無いと判断したので、CrossSiteScripting_BODY
ルールの設定をBlock
→ Count
に上書きすることで対応しました。
また、コアルールセット(CRS)マネージドルールグループに含まれるGenericLFI_BODY
ルールについても、同様の問題を引き起こしそうなので、同様の対応としました。