# AWS WAF、パース前のクエリ正規化に対応！新しい変換も 10 種類仲間入り！

みんな、しぃちゃんだよ！今日はAWS WAFのアップデートを見つけてわくわくしちゃったから、さっそく紹介するね！

## なにが発表されたの？

AWSのWhat's Newによると、AWS WAFに「パース前テキスト変換(pre-parse text transformations)」という新機能と、任意のルールステートメントで使える新しいテキスト変換10種類が追加されたんだって。どちらも、リクエストの内容をアプリケーションが解釈するのと同じやり方でAWS WAFが正規化して検査できるようにする、という狙いで作られた機能だよ。

## 今までどうだったの？

AWS WAFにはもともと「テキスト変換」という仕組みがあって、URLデコードや大文字小文字変換、コメント除去といった処理をルールの検査前にかけられるようになっていたの。ただしこれらは、AWS WAFがクエリ文字列をキーと値のペアに分解した**あと**にかかる処理だったんだよね。

ここに落とし穴があって、攻撃者はパース前の生のクエリ文字列そのものを細工することで、AWS WAFとバックエンドアプリケーションが同じリクエストを違うふうに解釈するように仕向けることができたの。たとえば同じキーのパラメータを重複させる「HTTPパラメータ汚染(HPP)」や、セミコロンと区切り文字の解釈の違いを突く手口なんかがそれにあたるよ。パース後の変換だけでは、こうした「パースのされ方そのもの」を突く回避手口には対応しきれなかったんだ。

## これで何が変わるの？

新しいパース前テキスト変換を使うと、AWS WAFがクエリ文字列をキーと値のペアに分解する**前**の生の文字列そのものを正規化できるようになるよ。これによって、パラメータ汚染やパーサーの解釈差を突く回避の抜け道を塞げるようになるの。

最大10個のパース前変換を連鎖させられて、そのうえに従来からのパース後のテキスト変換も1つのルールステートメントの中で重ねて設定できるんだって。つまり「生の文字列をまず正規化 → パースして分解 → さらに個々の値を正規化」という2段構えの防御を、1つのルールにまとめて書けるようになったってこと。

さらに、新しく追加された10種類のテキスト変換は、パース前・パース後どちらでも使える汎用的なもので、これまでカスタムのルールや別の仕組みで頑張って書いていた正規化処理を、AWS WAF標準の設定だけで済ませられるようになるのがうれしいポイントだよ。

## 深く潜ってみよう

パース前テキスト変換は、検査対象が `SingleQueryArgument` または `AllQueryArguments` のときだけ使える設定で、ルールステートメントの `PreParseTextTransformations` というオプション項目で指定するみたい。何も指定しなければデフォルトは `NONE` で、生のクエリ文字列がそのままパーサーに渡されるよ。

具体的な変換の例としてはこんなものが挙げられているよ。

- URL decode(`URL_DECODE`) — `%HH` 形式のURLエンコードを復号する。パース前にかけると、それまで隠れていたパラメータの区切りが表に出てくることがある
- URL decode Unicode(`URL_DECODE_UNI`) — 上記に加えて `%uHHHH` 形式のUnicodeエンコードも復号する
- Combine Duplicate Query Arguments by Comma(`COMBINE_DUPLICATE_QUERY_ARGS_BY_COMMA`) — 同じキーが重複しているクエリパラメータを、最初に出てきた位置でカンマ区切りの1つの値にまとめる。.NETやAPI Gateway、Express.jsなど、重複パラメータを配列として結合するバックエンドに合わせて検査できるようになる
- Replace Semicolons with Ampersands(`REPLACE_SEMICOLONS_WITH_AMPERSANDS`) — クエリ文字列中のセミコロンをアンパサンドに置き換える。AWS API Gateway REST APIのように、セミコロンを区切り文字として扱うバックエンドとパースの解釈を合わせられる

どれも「バックエンドが実際にどう解釈するか」に検査結果を合わせるための変換で、パーサー間の解釈の違いを悪用する回避手口をつぶす狙いがよく分かるラインナップだね。

新しく増えた10種類のテキスト変換のほうは、業界標準的な処理から専門的なものまで幅広いよ。

- Uppercase(大文字変換)、Trim(前後の空白除去)、Remove Whitespace(空白除去)、SHA256(ハッシュ化)といった、業界標準的な処理が新たに使えるようになった
- さらにAmazon Threat Research Teamが開発した、OSごとの違いを踏まえたコマンドライン・JavaScriptのデコード処理も追加されたよ。たとえば既存の `CMD_LINE` はOS共通の汎用的なコマンドライン正規化だったけど、Unix系とWindows系それぞれの改行コードやキャレットによる行継続、バックスラッシュの扱いの違いまで踏まえて正規化してくれる、よりOSの実情に即した変換が使えるようになった格好だよ

料金面では、パース前・パース後を問わず新しいテキスト変換はそれぞれ10 WCUを消費するとのことで、AWS WAFの通常料金に加えた追加課金は無いよ。全てのAWSリージョンで利用できるとのことなので、リージョンによる制限を気にする必要もなさそうだね。

## まとめ

- AWS WAFに「パース前テキスト変換」が追加され、クエリ文字列をキーと値に分解する前の生の文字列を正規化できるようになった
- パラメータ汚染(HPP)やパーサーの解釈差を突く回避手口への対策になる
- 最大10個のパース前変換を連鎖でき、従来のパース後変換と1つのルールの中で重ねて使える
- Uppercase・Trim・Remove Whitespace・SHA256などの業界標準的な処理に加え、Amazon Threat Research Team開発によるOS対応のコマンドライン・JavaScriptデコード処理も新規追加
- 新しいテキスト変換は1つにつき10 WCU消費で追加課金なし、全リージョンで利用可能

AWS WAFでクエリパラメータの検査ルールを組んでいて、パラメータ汚染やパーサーの解釈差を突く回避手口を心配していたセキュリティ担当のエンジニアさんに、まさに刺さるアップデートだと思うよ。
