Exception#to_s/NameError#to_s および name_err_mesg_to_str() による $SAFE 機構をバイパス可能な脆弱性について (CVE-2012-4464, CVE-2012-4466)

Exception#to_s, NameError#to_s メソッドに $SAFE によるチェックを回避できる脆弱性が発見されました。 また、Ruby インタプリタが内部で利用する API である name_err_mesg_to_str() にも同様の脆弱性が発見されました。 脆弱性により、信頼されないコードによって任意の文字列の変更が可能です。

詳細

Ruby の $SAFE 機構では、セーフレベル4は信頼されないコードの実行に利用されます。 このため、セーフレベル4以上では、サンドボックスの外部のデータを信頼されないコードから保護するため、ある種の操作が制限されます。

Exception#to_s, NameError#to_s メソッドの処理にこの機構に関する問題が発見されました。 また、Ruby インタプリタが内部で利用する API である name_err_mesg_to_str() にも同様の問題が発見されました。 これらの処理によりセーフレベル機構が回避され、汚染されていない文字列が汚染された状態に破壊的に変更されます。 これによって、攻撃者は任意の文字列を変更することができます。

Ruby 1.8 については、以前に類似の脆弱性があり、Exception#to_s, NameError#to_s についてはこの問題は修正済みですが、name_err_mesg_to_str() API については依然として問題が存在しています。

影響のあるバージョン

  • Ruby 1.8.7 patchlevel 371 以前のバージョン
  • Ruby 1.9.3 patchlevel 286 以前のバージョン
  • Ruby 2.0 の開発版 (r37068 以前のリビジョン)

解決策

新しいバージョンにアップグレードして下さい。

クレジット

この脆弱性については Tyler Hicks 氏により報告されました。

更新履歴

  • 2012-10-12 18:56:40 (JST) 初版