はじめに
こんにちは。@koheiawaです。
AWS WAFを有効化すると8KBを超えるリクエストがブロックされてしまったという状況に遭遇したことはありますか?よく見かける事例なのかなと個人的には思います。ただ、ブロックする理由はあまり注目されていないのかなと個人的に思っており、本ブログではこの件を深掘りしていきたいと思います。
リクエストがブロックされてしまう原因とその対処法
深掘りの前に、AWS WAFで8KBを超えるリクエストがブロックされてしまう原因とその対処法についての説明を挟んでおきます。
8KBを超えるリクエストを送った際のログを確認すると、AWS WAFのコアルールセット(CRS)マネージドルールグループ AWSManagedRulesCommonRuleSetのSizeRestrictions_BODYルールに合致したため8KB(8,192バイト)を超えるBodyを持つリクエストがブロックされていることがわかります。WAFはデフォルトで8KBを超えるリクエストをブロックしているわけではなく、自分が適用したルールによってブロックされているということですね。
よって、単純に考えると、この事象への対処は検知時の動作をOverride to Countに変更する、となります。※1
※1 Override to Count:リクエストをカウントはするが、許可、ブロックは行わないという動作モードです。本番ワークロードへの導入前のテストなどに利用されます。詳細はこちら。
本当にそれでよいのか?
Override to Countに変更している事例をたまに見かけますが、本当にそれでよいのか?というのは一歩立ち止まって考えるべきだと個人的には思います。なぜならば、WAFのマネージドルールとして存在する以上は、なんらかのセキュリティ上の理由があると考えるべきだと思うからです。
巷ではWAFが8KBを超えるリクエストを検査できないからブロックしている、などとという理由が考えられているようですが、個人的には腹落ちできません。
そこで大きなリクエストをブロックしたほうが良い理由をChatGPTに聞いてみました。
これは素晴らしい解答ですね!WAFのサイズ制限はWAFの性能云々ではなく、裏側のリソースを守るためにあったことがわかります。
セキュリティの観点では、大きなサイズのリクエストは様々なセキュリティ上のリスク要因となりえます。それは例えば以下のようなものです。
- バッファオーバーフロー攻撃
リクエストサイズが予想よりも大きい場合、バッファオーバーフロー攻撃が発生する可能性があります。この攻撃では、攻撃者が意図的に大きなリクエストを送信して、サーバー上のメモリ領域を破壊し、システムの安定性やセキュリティに影響を与える可能性があります。 - DoS攻撃
大きなリクエストは、サーバーのリソース(CPU、メモリ、ネットワーク帯域幅など)を消費するため、DoS攻撃の一形態となります。攻撃者が大量の大きなリクエストを送信することで、正常なユーザーがサービスにアクセスできなくなる可能性があります。 - インジェクション攻撃
大きなリクエストは、インジェクション攻撃の対象となる可能性があります。例えば、SQLインジェクションやクロスサイトスクリプティング (XSS) などの攻撃では、攻撃者がリクエストに悪意のあるコードを埋め込むことができます。大きなリクエストはこれらの攻撃に使用されることがあります。 - アップロードされたファイルのリスク
リクエストに含まれる大きなファイルは、悪意のあるコードやマルウェアが含まれている可能性があります。これらのファイルがサーバーにアップロードされると、システムが侵害されるリスクが高まります。
よって、上記で説明したOverride to Countへの変更は、潜在的に上記のリスクを受容しているということになるのです。
改善案
システムの都合上、どうしても回避しなければいいけない場合もあると思います。その場合、スコープダウンステートメントを使用すると範囲の絞り込みが可能です。
スコープダウンステートメント
スコープダウンステートメントとは、ルールグループの適用範囲を限定する機能を提供しています。すべてのマネージドルールグループで利用可能で、特定のリクエストパターンのみルールグループを適⽤する場合、または除外する場合に活⽤できます。(以下は設定イメージです。)
実際の設定手順は、以下などを参照ください。
- AWS公式のBlackBelt
- AWS CDKでAWS WAFのスコープダウンステートメントを実装する
まとめ
WAFのマネージドルールは一つ一つが意味を持っており、それを回避するというのはリスクを受容することだということは常に意識する必要があります。今回取り上げたSizeRestrictions_BODYルールはバッファオーバーフローなどの脅威からリソースを保護するためにあり、回避させる際はスコープダウンステートメントの使用をまず検討するようにしましょう。