セキュリテイ研修で「ReDos攻撃」という見慣れない言葉が出てきたので調査した。
ReDoS攻撃とは
正規表現におけるパターン処理の脆弱性をついた攻撃。計算にかかる負担が過度に増えることになる。
どのような攻撃か
正規表現の「+」や「*」を使うと、バックトラックというものが起きることがある。
詳細は参考のQiita記事にゆずるが、ざっくりいうと、検証中にマッチしないパターンが出現した時、ちょっと戻ってやり直すということが起きる。
これを意図的に起こすと、処理時間が指数関数的に増加する。
例
正規表現:/^(([a-zA-Z0-9])+)+$/
検証文字列:AbCdEfGh1JkLmN0pQR5TuAbCdEfGh1Jk@
挙動確認:https://regex101.com/debugger
step fowardすると、ある時点から、行ったり来たりしているのがわかる。
対策
- 正規表現によるパターンチェックの前に、文字列の長さのチェックを入れる
- ReDoS攻撃は文字列が長くなると、処理時間が伸びる
- 信頼できるバリデーションライブラリを使う
- 自分で正規表現を書くと、知らず知らずのうちに危険なパターンを使ってしまうかも
- 「+」「*」など、ReDoS攻撃の原因となるような文字を使わない