操作して学ぶ
ReDoS可視化
たった1つの正規表現が、1本の入力でCPUを固めることがあります。破滅的バックトラッキング(ReDoS)です。 脆弱な (a+)+$ の試行回数が、入力の長さでどれだけ指数爆発するかを、実際に照合しながら確かめられます。
入力: aaaaaaaaaaaaaaaaaaaa!
/(a+)+$/ ← 脆弱バックトラック 約 104.9 万 回/a+$/ ← 安全(線形)照合 20 回バーは対数スケール。(a+)+ は「a の並びをどう区切るか」の全通り(約 2n-1)を末尾一致失敗のたびに試すため、 n が20を超えるあたりから1本の入力でCPUを固めます。これが 2019年の Cloudflare 全球障害の原理です。
なぜ危険なのか
- ネスト量子化子(
(a+)+など)は、同じ文字列の分け方を無数に試せてしまう。 - 末尾でマッチが失敗すると、全ての分け方をやり直す=約 2n 回の試行に膨れ上がる。
- ユーザー入力を正規表現に通す箇所(バリデーション・WAF・ログ処理)が狙われる。