railsの脆弱性への対応をパッチで対応する。

作業中ですが、記録のために、、、

自分は、rails2.3.12を使ってますが、rubyが1.8.6から上げられない状況にあるが故に(検証とパフォーマンスの問題)、パッチ対応を選択しました。

railsの脆弱性に関するパッチ対応

  • 内容を読みつつパッチをダウンロード

  • パッチファイルは、$HOME/tmp 以下に置いてあるとして、、、

  • パッチをドライラン

    % cd /path/to/gems/
    % patch -p0 --dry-run < $HOME/tmp/2-3-xml_parsing.txt
    (Stripping trailing CRs from patch.)
    patching file actionpack-2.3.12/test/controller/webservice_test.rb
    (Stripping trailing CRs from patch.)
    patching file activesupport-2.3.12/CHANGELOG
    (Stripping trailing CRs from patch.)
    patching file activesupport-2.3.12/lib/active_support/core_ext/hash/conversions.rb
    
  • パッチをあてる(patchのオプションは。。。)

    % cd /path/to/gems/
    % sudo patch -p0 < $HOME/tmp/2-3-xml_parsing.txt
    [sudo] password for admin:
    (Stripping trailing CRs from patch.)
    patching file actionpack-2.3.12/test/controller/webservice_test.rb
    (Stripping trailing CRs from patch.)
    patching file activesupport-2.3.12/CHANGELOG
    (Stripping trailing CRs from patch.)
    patching file activesupport-2.3.12/lib/active_support/core_ext/hash/conversions.rb
    
  • 環境内のアプリケーション/railsのワーキングコピーでテスト

    • アプリケーションのテストの場合、主にはfunctional/integrationが該当。
  • 気になるリクエストを動作テスト

    • 通常のリンクをたどるリクエストは関係ない。
    • formデータも、今回の修正には関係ない。
    • 例えば、、、swfuploadは挙動するか? => 挙動してた。。。
    • 例えば、、、ajaxは挙動するか? => 挙動してる。。。

修正された内容について

  • 中心的な修正は、1箇所のみ。他はテスト

    • controllerな修正は含まれないが、使用しているロジックが修正され、結果的に修正されている。
    • 今回の脆弱性に関する、ケースレベルでの確認する場合は、activesuport/test/core_ext/hash_ext_test.rb
  • activesupport/lib/active_spport/core_ext/hash/conversions.rb

    • ハッシュを生成するロジックに、disallowed_typeというロジックが加わっている。
    • from_xmlという、リクエストから主にparamsハッシュを生成するロジックがある。
      • その第2引数にdisallowed_typeが設定可能になる。
      • 未設定==デフォルト、では、DISALLOWED_TYPE=%W(symbol yaml)disallowed_typeとなる。
    • 実際に、disallowed_typeを見て処理するのは、typecast_xml_valueという変換ロジック内。
    • disallowed_typeなものが渡された場合、例外DisallowedTypeが発生する。