Umgehung der Objekt-Taintung in DL und Fiddle in Ruby (CVE-2013-2065)

Gepostet von usa am 14. Mai 2013

Es gibt eine Schwachstelle in DL und Fiddle in Ruby, bei der getaggte Strings von Systemaufrufen unabhängig vom in Ruby eingestellten $SAFE-Level verwendet werden können. Diese Schwachstelle wurde unter der CVE-Kennung CVE-2013-2065 zugewiesen.

Auswirkungen

Native Funktionen, die in Ruby mit DL oder Fiddle exponiert werden, überprüfen nicht die Taint-Werte der übergebenen Objekte. Dies kann dazu führen, dass markierte Objekte als Eingabe akzeptiert werden, wenn stattdessen eine SecurityError-Ausnahme ausgelöst werden sollte.

Betroffener DL-Code sieht ungefähr so aus

def my_function(user_input)
  handle    = DL.dlopen(nil)
  sys_cfunc = DL::CFunc.new(handle['system'], DL::TYPE_INT, 'system')
  sys       = DL::Function.new(sys_cfunc, [DL::TYPE_VOIDP])
  sys.call user_input
end

$SAFE = 1
my_function "uname -rs".taint

Betroffener Fiddle-Code sieht ungefähr so aus

def my_function(user_input)
  handle    = DL.dlopen(nil)
  sys = Fiddle::Function.new(handle['system'],
                             [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
  sys.call user_input
end

$SAFE = 1
my_function "uname -rs".taint

Alle Benutzer, die eine betroffene Version ausführen, sollten entweder ein Upgrade durchführen oder umgehend eine der Problemumgehungen verwenden.

Beachten Sie, dass dies die Verwendung von numerischen Speicheradressen als Zeigerwerte *nicht* verhindert. Zahlen können nicht markiert werden, daher kann Code, der eine numerische Speicheradresse übergibt, nicht überprüft werden. Zum Beispiel:

def my_function(input)
  handle    = DL.dlopen(nil)
  sys = Fiddle::Function.new(handle['system'],
                             [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
  sys.call input
end

$SAFE = 1
user_input = "uname -rs".taint
my_function DL::CPtr[user_input].to_i

In diesem Fall wird die Speicheradresse übergeben, und die Taint-Fähigkeit des Objekts kann von DL / Fiddle nicht bestimmt werden. In diesem Fall überprüfen Sie bitte die Taint-Fähigkeit der Benutzereingabe, bevor Sie die Speicheradresse übergeben.

user_input = "uname -rs".taint
raise if $SAFE >= 1 && user_input.tainted?
my_function DL::CPtr[user_input].to_i

Problemumgehungen

Wenn Sie Ruby nicht aufrüsten können, kann dieser Monkey-Patch als Workaround verwendet werden

class Fiddle::Function
  alias :old_call :call
  def call(*args)
    if $SAFE >= 1 && args.any? { |x| x.tainted? }
      raise SecurityError, "tainted parameter not allowed"
    end
    old_call(*args)
  end
end

Betroffene Versionen

  • Alle Ruby 1.9-Versionen vor Ruby 1.9.3 patchlevel 426
  • Alle Ruby 2.0-Versionen vor Ruby 2.0.0 patchlevel 195
  • vor Trunk-Revision 40728

Ruby 1.8-Versionen sind nicht betroffen.

Credits

Vielen Dank an Vit Ondruch für die Meldung dieses Problems.

Verlauf

  • Ursprünglich veröffentlicht am 2013-05-14 13:00:00 (UTC)

Aktuelle Nachrichten

Ruby 4.0.0 veröffentlicht

Wir freuen uns, die Veröffentlichung von Ruby 4.0.0 bekannt zu geben. Ruby 4.0 führt „Ruby Box“ und „ZJIT“ ein und bringt viele Verbesserungen mit sich.

Veröffentlicht von naruse am 25. Dez 2025

Ein neuer Look für Rubys Dokumentation

Nach dem Redesign von ruby-lang.org gibt es weitere Neuigkeiten zur Feier des 30-jährigen Jubiläums von Ruby: docs.ruby-lang.org hat ein komplett neues Erscheinungsbild mit Aliki – dem neuen Standard-Theme von RDoc.

Veröffentlicht von Stan Lo am 23. Dez 2025

Neues Website-Erscheinungsbild

Wir freuen uns, ein umfassendes Redesign unserer Website bekannt zu geben. Das Design für dieses Update wurde von Taeko Akatsuka erstellt.

Veröffentlicht von Hiroshi SHIBATA am 22. Dez 2025

Ruby 4.0.0 preview3 veröffentlicht

Wir freuen uns, die Veröffentlichung von Ruby 4.0.0-preview3 bekannt zu geben. Ruby 4.0 führt Ruby::Box und „ZJIT“ ein und bringt viele Verbesserungen mit sich.

Veröffentlicht von naruse am 18. Dez 2025

Weitere Neuigkeiten...