CVE-2015-7551: Fiddle と DL における tainted 文字列使用時の脆弱性について

Ruby の標準添付ライブラリである Fiddle と DL に、信用できない tainted な文字列の使用に関する脆弱性が発見されました。 この脆弱性は、CVE-2015-7551 として登録されています。

詳細

Ruby の標準添付ライブラリである Fiddle と DL で、信用できない tainted な文字列を使用すると、本来禁止されるべき危険な操作が可能となる問題が発見されました。

この問題は、元々は DL において CVE-2009-5147 として報告され、修正が行われていました。 しかし、DL が Fiddle と libffi を用いて再実装された際に、同じ問題が再び発生してしまいました。 また、DL に関しても、Ruby 1.9.1 ではこの問題は修正されましたが、他のバージョンでは修正が行われなかったため、その後にリリースされた DL を含むバージョンには依然として同じ問題が残されていました。

この問題の影響を受けるコードは以下のようなものです:

handle = Fiddle::Handle.new(dangerous_user_input)

または:

handle = Fiddle::Handle.new(some_library)
function_pointer = handle[dangerous_user_input]

この問題の影響を受けるバージョンの Ruby のユーザーは、速やかに問題の修正されたバージョンに更新するか、または何らかの回避策を採ってください。

影響を受けるバージョン

  • Ruby 1.9.2 および 1.9.3 の全てのパッチリリース (DL および Fiddle に関して)
  • Ruby 2.0.0 patchlevel 648 より前の全ての Ruby 2.0.0 系列 (DL および Fiddle に関して)
  • Ruby 2.2.4 より前の全ての Ruby 2.2 系列 (Fiddle に関して)
  • Ruby 2.3.0 preview 1 および preview 2 (Fiddle に関して)
  • revision 53153 より前の開発版 (Fiddle に関して)

回避策

もし何らかの事情で Ruby を更新できない場合は、以下のモンキーパッチによって Fiddle については問題を回避することができます:

class Fiddle::Handle
  alias :old_initialize :initialize

  def initialize file, *args
    raise SecurityError if file.tainted? && $SAFE > 0
    old_initialize file, *args
  end

  alias :sym :[]
  alias :old_call :[]

  def [] fun
    raise SecurityError if fun.tainted? && $SAFE > 0
    old_call fun
  end
end

DL を使用している場合は、Fiddle を使うようにしてください。

クレジット

この脆弱性は Christian Hofstaedtler zeha@debian.org によって報告されました。

更新履歴

  • 2015-12-16 21:00:00 (JST) 初版