Ruby on Rails 3.2.17, 4.0.3がリリースされました!重要なDoS脆弱性が修正されています

日本時間で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脆弱性は非常にインパクトがあります。
アップデートは早急に!

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

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。得意分野はWeb全般、Ruby on Rails、Androidアプリケーションなど。最近はBlinkと格闘中。軽度の資格マニアで、情報処理技術者試験(高度10区分)などを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ