Обхід таїнтування об'єкта в DL та Fiddle в Ruby (CVE-2013-2065)
Опублікував usa 14-05-2013
Переклав: Andrii Furmanets
Є вразливість у DL та Fiddle в Ruby, де таїнтовані рядки можуть бути використані системними викликами незалежно від рівня $SAFE, встановленого в Ruby. Цій вразливості присвоєно ідентифікатор CVE CVE-2013-2065.
Вплив
Нативні функції, виставлені до Ruby з DL або Fiddle, не перевіряють значення таїнтування , встановлені на об’єктах, переданих. Це може призвести до прийняття таїнтованих об’єктів як вхідних даних, коли повинен бути викликаний виняток SecurityError.
Зачеплений код DL виглядатиме приблизно так:
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Зачеплений код Fiddle виглядатиме приблизно так:
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Всі користувачі, які запускають зачеплений випуск, повинні або оновитися, або використовувати один з обхідних шляхів негайно.
Зверніть увагу, що це не запобігає використанню числових зміщень пам’яті як значень покажчика. Числа не можуть бути таїнтованими, тому код, який передає числове зміщення пам’яті , не може бути перевірений. Наприклад:
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У цьому випадку передається місце розташування пам’яті, і таїнтування об’єкта не може бути визначено DL / Fiddle. У цьому випадку, будь ласка, перевірте таїнтування вхідних даних користувача перед передачею місця розташування пам’яті:
user_input = "uname -rs".taint
raise if $SAFE >= 1 && user_input.tainted?
my_function DL::CPtr[user_input].to_iОбхідні шляхи
Якщо ви не можете оновити Ruby, цей monkey patch може використовуватися як обхідний шлях:
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Зачеплені версії
- Всі версії ruby 1.9 до ruby 1.9.3 рівня патчу 426
- Всі версії ruby 2.0 до ruby 2.0.0 рівня патчу 195
- до ревізії trunk 40728
версії ruby 1.8 не зачеплені.
Подяка
Дякуємо Vit Ondruch за повідомлення про цю проблему.
Історія
- Спочатку опубліковано 2013-05-14 13:00:00 (UTC)
Останні новини
Вийшов Ruby 3.2.10
Вийшов Ruby 3.2.10.
Опублікував hsbt 14-01-2026
Вийшов Ruby 4.0.1
Вийшов Ruby 4.0.1.
Опублікував k0kubun 13-01-2026
Вийшов Ruby 4.0.0
Ми раді повідомити про випуск Ruby 4.0.0. Ruby 4.0 представляє “Ruby Box” та “ZJIT”, а також додає багато покращень.
Опублікував naruse 25-12-2025
Новий вигляд документації Ruby
Слідом за ре-дизайном ruby-lang.org, ми маємо більше новин, щоб відсвяткувати 30-річчя Ruby: docs.ruby-lang.org має повністю новий вигляд завдяки Aliki — новій темі за замовчуванням для...
Опублікував Stan Lo 23-12-2025