Rails 4.0.2, 3.2.16リリース!重大なセキュリティFIXがあります

昨日、Ruby on Railsの重要なセキュリティアップデートである、Rails 4.0.2と3.2.16がリリースされました

このリリースには、5件(3.2.16には4件)のセキュリティFIXが含まれています。
重要度の高いものがあるため、早急なアップデートをしましょう。

CVE-2013-6416

simple_formatヘルパーのXSS脆弱性に関する修正です。
※4.0.2のみ。3.2系では元から発生しないため、3.2.16には含まれません。

simple_formatはhtml_optionsとしてHashを渡せますが、デフォルトで、このclass指定がHTMLエスケープされていませんでした。
class指定をユーザ入力による場合、容易にXSSが成立してしまいます。

simple_format "hello\nworld", class: '"><script>alert(1)</script>'
simple_formatの結果

simple_formatの結果

なお、該当の修正はこのコミットなのですが、小さいコミットで一瞬あれ?と思うけど面白いです。
SanitizeとEscapeは全然違うものなのに、うっかり混ざってしまっていたようですね。

何らかの理由でアップデートできない場合、simple_formatにclassを指定している箇所をすべてチェックし、手動でエスケープするようにしましょう。

https://groups.google.com/forum/#!topic/ruby-security-ann/5ZI1-H5OoIM

CVE-2013-6414

ActionViewのDoS脆弱性に関する修正です。

未修正の状態では、HTTPヘッダのformat部分を細工することで、ActionViewのキャッシュキーを操作することができます。
これにより、リクエストを繰り返すとキャッシュキーを無限に増大させることができ、最終的にメモリ不足によるサービス停止を引き起こすことが可能になります。

(具体的な攻撃方法はちょっと見ただけではわかりませんでした)

対策として、あらかじめ登録されている正当なMIMEタイプ以外は弾くように修正されました。

影響が大きいため、サポートが終了したRails 3.0と3.1系にもパッチが提供されています。
3.0/3.1を使っている場合や、何らかの理由でアップデートできない場合は、以下のパッチの適用を検討しましょう。
https://groups.google.com/forum/#!topic/ruby-security-ann/A-ebV4WxzKg

CVE-2013-6415

number_to_currencyのXSS脆弱性に関する修正です。

未修正の状態では、number_to_currencyに渡すunitはHTMLエスケープされません。
単位を「円」「ペリカ」「ゼニー」などユーザが変更できるようにしている場合、XSSが成立します。

対策として、デフォルトでunitはHTMLエスケープされるようになりました。html_safeした場合は従来通りの挙動になります。

number_to_currency 1000, unit: '<script>alert(1)</script>'
number_to_currencyの結果

number_to_currencyの結果

何らかの理由でアップデートできない場合、unitを手動でHTMLエスケープするようにしましょう。

number_to_currency 1000, unit: h(params[:unit])

https://groups.google.com/forum/#!topic/ruby-security-ann/9WiRn2nhfq0

CVE-2013-4491

反射型XSS脆弱性に関する修正です。

i18n gemが、以下のバージョン未満のときのみ発生します。つい最近作ったプロジェクトなら、問題ない可能性が高いです。

  • i18n-0.6.6 for Rails 4.0.x and 3.2.x applications
  • i18n-0.5.1 for Rails 3.1.x and 3.0.x applications

未修正の状態では、i18nで対応するキーが無い場合、デフォルトで以下のように見やすいHTML形式で結果が返ってきました。

t('hoge')
# => <span class="translation_missing" title="translation missing: hoge">hoge</span>

これは見やすくて便利なのですが、しかしi18nが上記対策バージョン未満の場合、このkeyがHTMLエスケープされません。

translationのキーをユーザが自由に入力できるパターンは少ないと思いますが、以下のような設定は多くのサイトで使われているのではないでしょうか。

I18n.locale = params[:locale]

そのため、たとえば以下のURLで、missing translationがある場合、ページの文字が大きくなったりします。

example.com/?locale="><h1>

対策として、デフォルトではHTML形式のmissing tranlation表示ではなく、プレインテキスト形式に変更になりました
仕様変更になりますので、ご注意ください。
HTML形式が必要な場合、rescue_format: :htmlを手動で指定しましょう。

何らかの理由でアップデートできない場合、以下の本文に記載のあるモンキーパッチをconfig/initializersに設置しましょう。
https://groups.google.com/forum/#!topic/ruby-security-ann/pLrh6DUw998

CVE-2013-6417

以前Techrachoでも紹介した、Rails 3.2.11で修正されたCVE-2013-0155ですが、対応が不完全だったため再修正されたものです。

Rails 3.2.11のときに、Rails::Requestは修正されていましたが、Rack::Requestのほうは未対策でした。
これにより、Rack Middlewareがパラメータを参照した場合に、従来と同じ問題が発生する可能性があります。一部のRack Middlewareでは、Railsに渡す前のパラメータを取得・加工していることがあるためです。

対策として、Rack::Requestでもdeep_munge(空ハッシュなどをnilに変換)されるようになりました。

何らかの理由でアップデートできない場合、Rack Middlewareがパラメータを参照している箇所を、慎重に検査するしかありません。
意外と多くのGemがRack Middlewareを追加しているので、注意が必要です。

https://groups.google.com/forum/#!topic/ruby-security-ann/niK4drpSHT4

まとめ

今回のセキュリティFIXは、潜在的というレベルではなく、多くのアプリで即座に影響のあるものが含まれています。
アップデートが容易になるよう、セキュリティFIXのみのリリースになっているほか、個別パッチもリリースされていますので、早急なアップデートをしたいところです。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。

高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。Ruby on Rails、PHP、Androidアプリ、Windows/Macアプリ、超縦書の開発などを気まぐれにやる。軽度の資格マニアで、情報処理技術者試験(15区分 + 情報処理安全確保支援士試験)、技術士(情報工学部門)、CITP、Ruby Programmer Goldなどを保有。

babaの書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ