1. はじめに
AWS WAFでリクエストボディを検査する際、意図しない通信を許可/ブロックしてしまう可能性があったためこちらで紹介させていただきます。
2. WAFリクエストボディ検査の2つの注意点
注意点① リクエストボディ検査ルールでは、まず「オーバーサイズ処理(Oversize handling)」が評価されます。
注意点② 「オーバーサイズ処理」のMatch/No Match設定は、本来のルール評価をスキップさせます。
3. 「オーバーサイズ処理」とは何か?
WAFのリクエストボディの検査サイズには上限があり、デフォルトで16KB、最大で64KBの上限値を持っています。
※上限値は利用サービスによって異なりますが、本記事ではAPI Gateway の利用を想定しております。
この上限値を超えたリクエストをどう扱うかを決めるのが「オーバーサイズ処理」になります。
「オーバーサイズ処理」の各オプションについて以下に示します。
- Continue :リクエストボディ検査サイズの制限内のリクエストコンポーネントの内容を検査する
- Match :設定しているリクエストボディ検査サイズの上限を超えるリクエストはすべてルールに一致したものとして扱う
- No Match :設定しているリクエストボディ検査サイズの上限を超えるリクエストはすべてルールに一致しないものとして扱う
4. 挙動のパターン
シナリオ1:「Continue」設定と実際の検査範囲
- 条件① リクエストボディの検査サイズの上限:16KB
- 条件② オーバーサイズ処理:Continue
- 条件③ リクエストボディにSQLインジェクションパターンを含む場合Blockする
| リクエストボディサイズ | SQLインジェクションの有無 | 判定 | 詳細 | |
|---|---|---|---|---|
| #1 | 10KB | 無 | Allow | リクエストは正常に通過 |
| #2 | 10KB | 有 | Block | リクエストは正常にブロック |
| #3 | 50KB | 有(検査対象の16KB以内) | Block | リクエストは正常にブロック |
| #4 | 50KB | 有(検査対象の16KBの外) | Allow | 攻撃コードは16KB地点にはないため発見できず、リクエストは通過 |
ポイント: Continue はあくまで「評価を続行する」という意味であり、検査範囲がボディ全体に拡張されるわけではないです。
シナリオ2:「Match/No Match」設定と実際の検査範囲
- 条件① リクエストボディの検査サイズの上限:16KB
- 条件② オーバーサイズ処理:Match/No Match
- 条件③ リクエストボディにSQLインジェクションパターンを含む場合Blockする
| リクエストボディサイズ | オプション | SQLインジェクションの有無 | 判定 | 詳細 | |
|---|---|---|---|---|---|
| #1 | 10KB | Match/No Match | 無 | Allow | リクエストは正常に通過 |
| #2 | 10KB | Match/No Match | 有 | Block | リクエストは正常にブロック |
| #3 | 50KB | Match | 有/無 | Block | Matchのオプションにより、リクエストはブロック |
| #4 | 50KB | No Match | 有/無 | Allow | No Matchのオプションにより、リクエストは通過 |
ポイント: WAFの評価順序においてはオーバーサイズ処理が先に適用されます。
5. まとめ
以上のような挙動となりますので、AWS WAF を利用したリクエストボディを検査する場合には、リクエストボディの検査サイズの上限値やオーバーサイズ処理の考慮が必要となります。
本記事が皆様の開発の一助となれば幸いです。

