XSSの「終わりなき泥沼」:WAFシグネチャとSIEMによる検知の深淵
巷にあふれる「XSS対策の教科書」は、往々にしてタグを弾けという類のものばかりだ。しかし、現場の最前線にいる諸君なら知っているはずだ。現代のXSSは、もはや古典的なタグ挿入の域を超え、DOMベースの難読化や、ブラウザのエンコーディングの挙動を悪用した「ブラインド・インジェクション」へと進化している。
今日は、WAFの正規表現(Regex)という薄い防波堤をどう強化し、SIEMを用いて攻撃の「予兆」をどう炙り出すか、その泥臭い実務論を語ろう。
1. WAFシグネチャの限界と「文脈」への回帰
WAFの正規表現でをマッチングさせるのは、もはや時代遅れだ。攻撃者はeval()、setTimeout()、あるいはテンプレートエンジンの構文を突き、JSONPのコールバックやjavascript:疑似プロトコルを多用する。
効果的なシグネチャは、特定の単語ではなく「構造の異常」を検知するものであるべきだ。例えば、以下のようなパターンをWAFに組み込む際、単なる拒否ではなく「スコアリング」を行うのが現代的なアーキテクチャだ。
悪意ある可能性が高いイベントハンドラの連鎖とエンコーディングの混在
(?i)(on\w+\s=|javascript:|data:text\/html|eval\(|expression\(|document\.cookie|base64)
重要なのは、これを静的なルールとして実装するのではなく、ModSecurity等のエンジンで「スコア加算」することだ。
単発のalert()はノイズになり得る。しかし、onmouseoverとbase64が同じリクエストに含まれていれば、それは「攻撃の試行」とみなして即座に遮断(Blocking)または管理者のアラートを飛ばすべきだ。
2. SIEM連携による「プロトコル構造」の可視化
SIEMに送るべきは、単なる「403 Forbidden」のログではない。攻撃者はWAFの検知を避けるために、リクエストを分割したり、多重のURLエンコードをかけたりする。
SIEMで分析すべき「異常の兆候」
- エンコードの深さ:
URLDecodeを2回、3回と繰り返さないと解釈できないリクエストは、ほぼ間違いなく攻撃だ。 - User-Agentの不整合: ブラウザの振る舞いと、実際のHTTPヘッダーの順序やCookieの形式が乖離していないか。
- Refererの不自然な欠如: 認証済みセッション内で、Refererが空、あるいはドメイン外の怪しいURLを参照している場合は、反射型XSSの標的となっている可能性が高い。
ログ分析のクエリ例(Elasticsearch/KibanaのDSLを想定)
// 連続するエンコーディング異常を検知するクエリ
{
"query": {
"bool": {
"must": [
{ "match_phrase": { "request_uri": "%25" } }, // 二重エンコードの予兆
{ "range": { "response_code": { "gte": 400 } } }
]
}
}
}
3. 生成AI時代の「ガードレイル」と攻撃の盲点
今、我々が直面している最大の脅威は、生成AIが生成した「人間には判別困難な難読化コード」を、アプリケーションがDOMへ書き込んでしまうことだ。
防御層の再設計:Content Security Policy (CSP) の厳格化
WAFはあくまで「入口」に過ぎない。真のセキュリティアーキテクトは、ブラウザ側での実行を制限するContent-Security-Policyを「防御の最終層(ガードレイル)」として配置する。
推奨するCSPの例:nonce(乱数)を用いたインラインスクリプトの無効化
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-R4nd0mStr1ng'; object-src 'none';
これさえあれば、どれほど巧妙にWAFを回避したペイロードが届いても、ブラウザは「信頼できないスクリプト」として実行を拒否する。
最後に:泥臭いインシデントハンドリングの極意
技術的な防壁をどれだけ高くしても、攻撃者は常に「人間の不注意」という最大の脆弱性を突いてくる。
現場の運用で最も重要なのは、「検知して終わり」にしないことだ。 SIEMでアラートが鳴った瞬間、そのパケットがどのエンドポイントを叩き、どのセッションIDを盗もうとしたのかを即座に特定し、関連する全てのログをフォレンジック・スナップショットとして保存する。
WAFやSIEMは、あくまで「敵の動きを可視化するレンズ」だ。そのレンズのピントをどこに合わせるか。それが、君たちアーキテクトの腕の見せ所となる。
コードを信じるな。ログを疑え。そして、常に攻撃者の思考の「一歩先」にあるメモリ上の挙動を想像しろ。それが、この過酷なサイバー空間で生き残る唯一の術だ。
コメント