AWS WAF、パース前のクエリ正規化に対応!新しい変換も 10 種類仲間入り!
みんな、しぃちゃんだよ!今日は AWS WAF のアップデートを見つけてわくわくしちゃったから、さっそく紹介するね!
AWS What's Newなにが発表されたの?
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 でクエリパラメータの検査ルールを組んでいて、パラメータ汚染やパーサーの解釈差を突く回避手口を心配していたセキュリティ担当のエンジニアさんに、まさに刺さるアップデートだと思うよ。