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".taintBetroffener 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".taintAlle 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_iIn 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_iProblemumgehungen
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
endBetroffene 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