日本時間で2/19の朝、Ruby on Rails 3.2.17, 4.0.3, 4.1.0beta2がリリースされました。
今回は、重要なセキュリティFixを含む一斉アップデートです。
なお、4.1についてはすでに4.1.0rc1がリリースされているので、そちらにアップデートしましょう。
今回は3件の修正(3系でのみ発生するものが1件、4系でのみ発生するものが1件、両方で発生するものが1件)が含まれています。
特に最後のDoS脆弱性(CVE-2014-0082)については、Rails 3.2を使用している幅広いサービスに影響があるため、確実に確認・アップデートしておきましょう。
CVE-2014-0080
影響を受けるRailsバージョン: 4.0, 4.1
ActiveRecordでPostgreSQLの配列型を使っている際の、データインジェクション脆弱性です。
レコードを削除したり任意のSQLを実行できる性質のものではありませんが、アプリケーションの動作に影響を及ぼすデータを注入される可能性があります。
PostgreSQLの配列型を使っていない場合は、この脆弱性の影響は無いので心配ありません。
Rails 3.2系もこの影響を受けないので、Rails 4系を使っている場合のみ対策が必要です。
もしアップデートできない場合、個別パッチが提供されているので適用しましょう。
https://groups.google.com/forum/#!topic/rubyonrails-security/Wu96YkTUR6s
個人的にはPostgreSQLをあまり使わないので、詳細確認していません。
CVE-2014-0081
影響を受けるRailsバージョン: 3.2, 4.0, 4.1
number_to_currency, number_to_percentage, number_to_humanのXSS脆弱性です。
formatパラメータがHTMLエスケープされないため、formatをユーザが指定できる環境ではXSSが成立します。
たとえば以下のようなコードです。
number_to_currency 50000, format: params[:format]
Rails 3.2, 4.0, 4.1すべてが影響を受けるので、アップデートするか、個別パッチを当てるか、formatを手動でエスケープしましょう。
個別パッチはこちらです。
https://groups.google.com/forum/#!topic/rubyonrails-security/tfp6gZCtzr4
ちなみに、アップデートしても、localeファイルで指定しているHTMLタグ付きformatはエスケープされないので、一般的には困らないと思います。
# config/locales/en.yml # このような指定をしていても、アップデート後に特に修正は不要です en: number: currency: format: format: "%n%u" unit: "<b>Yen</b>" separator: "." delimiter: "," precision: 0
CVE-2014-0082
影響を受けるRailsバージョン: 3.2
ActionViewでrender :textを使った際のDoS脆弱性です。
以下のようなコードはよくありますが、これでDoS攻撃が成立します。
class HogeController def hello render text: 'Hello world!' end end
HTTPリクエストのAcceptヘッダに応じてformatsが決定されますが、これは:htmlや:text, :jsのようなsymbolに変換されます。
ここで、Acceptヘッダに長い文字列を少しずつ変えながら大量にリクエストすると、symbolが大量生成されることになります。
symbolはGCで回収されないので、これだけで、OOM Killerが発動するまでメモリ使用量を無限に増大させることができ、DoS攻撃が成立します。
試してみましょう。
まず、わかりやすくするためにシンボル数をレスポンスに含めます。
def hello render text: "Hello world!, symbols=#{Symbol.all_symbols.count}" end
また、メモリ使用量を監視しておきます。
while true; do ps alx | grep rails | grep -v grep | awk '{print $8}'; sleep 2; done
試しにブラウザからアクセスしてみたら、初回はシンボル数15,166、メモリ使用量(RSS) 56,840でした。
次に、Acceptヘッダに長い文字列(とりあえず1KB程度)を入れて、毎回微妙に変えながら1万回ほどアクセスしてみます。
(念のため具体的なコードは避けますが、Rubistなら1行で書けるはずです)
メモリ使用量はこんな感じになりました。
途中GCが走って減る箇所もありますが、トータルでかなり増えてしまっています。
56840 56840 66476 72924 73900 76940 78980 80408 82708 (略) 246264 247560 248532 249304 251288 253240
また、シンボル数も25,164まで増えていました。要するにアクセス回数分増えています。
このペースだと、10分とかからずOOMを発生させることができそうです。
Rails 4.0系ではこの影響を受けないので、Rails 3.2を使っている場合のみ対策が必要です。
個別パッチはこちらです。
https://groups.google.com/forum/#!topic/rubyonrails-security/LMxO_3_eCuc
まとめ
未だRails 3.2は広く使われていることを考えると、(CVE-2013-6414でも似たようなことをやっていた気がしますが)CVE-2014-0082のDoS脆弱性は非常にインパクトがあります。
アップデートは早急に!