操作して学ぶ

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・ログ処理)が狙われる。