ReDoS
正規表現によるDoS
参考
正規表現の脆弱性「ReDoS」徹底解説 ~原理と対策から、Perlでの最適化まで(1)/ 2022-10-17
対策
Ruby 3.2以上にアップデートする
キャッシング機構により大幅に改善する
その上でRegexp.timeoutを設定する
リクエストへのタイムアウトを設定する
Unicorn
Rack::timout
読み込み箇所に注意
RE2の使用
検知
recheck
CodeQL
修正
絶対最大量指定子を指定する
前後の空白を検出するだけであれば、String#stripを使用する
StringScannerを使用する
未検証
ReDoSへの言語側からの対策
Regexp.timeout
Regexp.linear_time?
キャッシュによるRubyの正規表現のマッチングの高速化の紹介 / 2022-12-12
Ruby3.2で導入されたキャッシング
Ruby3.2.0で導入されたReDoS対策の効果を確認 / 2022-12-26
Make Regexp#match much faster
https://www.youtube.com/watch?v=IbMFHxeqpN4&list=PLbFmgWm555yYvWS7VGTFipF7ckduvSeT-&index=8
https://www.youtube.com/watch?v=CEvSx1D3dFQ
https://www.ruby-lang.org/ja/news/2021/11/15/date-parsing-method-regexp-dos-cve-2021-41817/
この修正では、正規表現を変更するのではなく、入力値をデフォルトで 128 バイトまでに制限するようにしています。
Date.parseへの制限追加
Ruby on Railsでは対象外となった
https://hackerone.com/rails/policy_versions?type=team&change=3741477