昨日、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>'
なお、該当の修正はこのコミットなのですが、小さいコミットで一瞬あれ?と思うけど面白いです。
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>'
何らかの理由でアップデートできない場合、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のみのリリースになっているほか、個別パッチもリリースされていますので、早急なアップデートをしたいところです。