7
1

More than 1 year has passed since last update.

gem 'date'のReDos脆弱性についての内容と対応の注意点 [CVE-2021-41817]

Last updated at Posted at 2021-11-16

はじめに

この記事の内容は以下のページを機械翻訳したものを一部引用しています。合わせて原文も参照すると理解が深まると思います。

脆弱性の内容

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'の指定を削除できます。

Gemfile
- 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では報告されており対応がされています。

他にもFaradayなど複数のgemで同様のエラーが発生するようになった報告がコメントされています。

this breaks some applications and gems like faraday.

引用

7
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1