Inserito da Fabio Cevasco il 2011-02-27
Il metodo Exception#to_s può essere usato per bypassare il controllo $SAFE, e ciò rende possibile la modifica di stringhe arbitrarie tramite codice untrusted.
Descrizione dettagliata
Secondo le semantiche della variabile $SAFE, un safe level di 4 è usato per eseguire codice untrusted (come ad esempio un plugin). In questo modo, per i livelli superiori, alcune operazioni sono proibite per prevenire codice untrusted dall'attaccare dati trusted.
Il metodo Exception#to_s si è rivelato problematico in questo ambito. Il metodo può bypassare il meccanismo dei safe level e modificare in maniera distruttiva una stringa untained in modo che diventi tainted. In questo modo, un utente con cattive intenzioni può modificare stringhe untainted arbitrarie, così:
$secret_path = "foo"
proc do
$SAFE = 4
Exception.new($secret_path).to_s
$secret_path.replace "/etc/passwd"
end.call
open($secret_path) do
...
end
Versioni soggette a questa vulnerabilità
Fortunatamente questo tipo di attacco non ha effetto per le versioni 1.9.x di Ruby. Le versioni affette sono ristrette alle seguenti:
- Ruby 1.8.6 patchlevel 420 e tutte le versioni precedenti
- Ruby 1.8.7 patchlevel 330 e tutte le versioni precedenti
- Versioni di sviluppo di Ruby 1.8 (1.8.8dev)
Soluzioni
Aggiornamento ad una nuova versione.
Aggiornamenti
- 1.8.7-334 è stato rilasciato per correggere questo problema. Tutti gli utenti d Ruby 1.8.7 sono pregati di aggiornare la propria installazione.