はじめに
この記事の内容は以下のページを機械翻訳したものを一部引用しています。合わせて原文も参照すると理解が深まると思います。
脆弱性の内容
Date.parse
は、内部でRegexpsを使用しており、その一部は正規表現のサービス拒否に対して脆弱です。
このようなメソッドを信頼できない入力に適用するアプリケーションとライブラリが影響を受ける可能性があります。
脆弱性に対する修正内容
この修正により、正規表現を変更する代わりにデフォルトで入力長が最大128バイトに制限されます。
これは、'date' gemが多くの正規表現を使用しており未発見の脆弱な正規表現がまだ存在する可能性があるためです。
互換性を維持するには次のようにlimitキーワードに明示的にnilを渡すことで制限を取り除くことができますが解析に時間がかかる場合があることに注意してください。
Date.parse(str, limit: nil)
脆弱性への対応
💡 2021-11-25追記: 2021-11-25 にruby 3.0.3がリリースされました。このリリースには、gem 'date'の3.1.3がバンドルされています。
そのため、まだこちらの対応をしていない場合はrubyのバージョンアップのみで対応できます。
既に対応している場合は、rubyのバージョンアップを行うことでGemfileから明示的なgem 'date'の指定を削除できます。
- ruby '3.0.2'
+ ruby '3.0.3'
- gem 'date'
💡2021-11-19追記: 以下「この対応をしたことにより新たに発生するエラーと注意点」に記載したTypeError
が発生それバグが修正されバージョン3.2.2
がリリースされたので今からインストールされる際には3.2.2
以上を指定してください
'date' gemをバージョン3.2.1、3.1.2、3.0.2、および2.0.1以降に更新してください。
gem update date
コマンドを実行して更新することができます。
bundlerを使用している場合は、Gemfileに以下を追加してください。
gem "date", ">= 3.2.2"
この対応をしたことにより新たに発生するエラーと注意点
💡2021-11-19追記: こちらのバクはバージョン3.2.2
で修正されています。
Date#_iso8601
で引数にnil
が指定された場合に空のハッシュ{}
が返却されていましたが、この変更によりTypeError
が発生します。
# Before
>> Date._iso8601(nil)
=> {}
# After
>> Date._iso8601(nil)
(irb):2:in `_iso8601': no implicit conversion of nil into String (TypeError)
この問題はすでにruby
, rails
では報告されており対応がされています。
- https://github.com/ruby/date/issues/39
- https://github.com/ruby/date/pull/40
- https://github.com/rails/rails/pull/43643
他にもFaraday
など複数のgemで同様のエラーが発生するようになった報告がコメントされています。
this breaks some applications and gems like faraday.