Rails version 3.2.7 has been released!

security fixです。

CVE

Ruby on Rails DoS Vulnerability in authenticate_or_request_with_http_digest (CVE-2012-3424) - Google グループ

digest認証 を利用している場合に影響があるようです。

ざっくり

CVE-2012-3424

authenticate_or_request_with_http_digestにDoS脆弱性があったもようです。
回避策はないようなのでupdateしましょう。

こんなやつ。

    class MyController < ApplicationController 
      def index 
        authenticate_or_request_with_http_digest(REALM) do |uname| 
          # ... 
        end 
      end 
    end 
実装は

こちら
HashをHashWithIndifferentAccessに変更しているのと
headerから取得したkey(ユーザ名)をto_symしています。



ソース見てもどこがポイントかよくわかんなかったのでCVEでググってみると
JVNDB-2009-002526 - JVN iPedia - 脆弱性対策情報データベース
がありました。

Ruby on Rails のダイジェスト認証の機能の事例コードには、
ユーザが存在しない場合の authenticate_or_request_with_http_digest 定義に関して不備があるため、
パスワードなしの無効なユーザ名を送信することでアプリケーションの認証を回避される脆弱性が存在します。

なるほど、Headerから取得したkeyをto_symしてるとこがまずいようです。

余談ですが

HashWithIndifferentAccess がよくわからないのでソースを見てみます。

# activesupport-3.2.7/lib/active_support/hash_with_indifferent_access.rb
    def []=(key, value)
      regular_writer(convert_key(key), convert_value(value))
    end

    protected
      def convert_key(key)
        key.kind_of?(Symbol) ? key.to_s : key
      end

      def convert_value(value)
        if value.is_a? Hash
          value.nested_under_indifferent_access
        elsif value.is_a?(Array)
          value.dup.replace(value.map { |e| convert_value(e) })
        else
          value
        end
      end

keyがSymbolでも対応できるようにto_sしています。

    def nested_under_indifferent_access
      self
    end

actionpack

・名前付きrouteに/が含めれるようになったっぽい
Add support for optional root segments containing slashes · 71d274d · rails/rails

get '/(page/:page)', :to => 'pages#index', :as => :root
activemodel

・validates_inclusion_of / validates_exclusion_of で:withinオプションが可能(alias :in)

activerecord

deprecate祭り。


・finder_sql / counter_sql(代わりはscope)

・has_and_belongs_to_manyのinsert_sql/delete_sql (代わりはhas_many :through)

・composed_of
 rails4で無くなるそうです。(代わりはaccessors/mutatorsで。)

    def balance
      @balance ||= Money.new(value, currency)
    end

    def balance=(balance)
      self[:value] = balance.value
      self[:currency] = balance.currency
      @balance = balance
    end

(これmutatorって呼ぶの?)


・update_attribute (代わりはupdate_column。)