Vulnerabilità DoS in REXML

Esiste una vulnerabilità DoS nella libreria REXML inclusa nella Libreria Standard di Ruby. Una tecnica di attacco cosiddetta "esplosione di entità XML" può essere usata per disabilitare remotamente un'applicazione che processa XML immesso dall'utente utilizzando REXML.

Molte applicazioni Rails risultano essere vulnerabili poichè Rails processa XML immesso dall'utente tramite REXML per default.

Impatto

Un utente malintenzionato può causare un denial of service facendo processare a REXML un documento contenente entità annidate ricorsivamente, come per esempio:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE member [
  <!ENTITY a "&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;">
  <!ENTITY b "&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;">
  <!ENTITY c "&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;">
  <!ENTITY d "&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;">
  <!ENTITY e "&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;">
  <!ENTITY f "&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;">
  <!ENTITY g "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">
]>
<member>
&a;
</member>

Versioni vulnerabili

serie 1.8

  • 1.8.6-p287 e precedenti
  • 1.8.7-p72 e precedenti

serie 1.9

  • tutte le versioni

Soluzione

Per favore scaricare il la seguente monkey patch per correggere il problema.

Dopodichè è necessario correggere un applicazione in modo che carichi rexml-expansion-fix2.rb prima di usare REXML:

require "rexml-expansion-fix2"
...
doc = REXML::Document.new(str)
...

Se hai un'applicazione sviluppata con Rails, copia rexml-expansion-fix2.rb in una directory inclusa nel load patch (ad esempio RAILS_ROOT/lib/), ed inserisci la riga seguente in config/environment.rb

require "rexml-expansion-fix2"

Se la tua applicazione usa Rails 2.1 o successivo, puoi semplicemente copiare rexml-expansion-fix2.rb in RAILS_ROOT/config/initializers ed verrà richiesto automaticamente.

Per default, il limite dell'espansione delle entità XML è 10000. Puoi cambiarlo aggiornando REXML::Document.entity_expansion_limit. Per esempio:

REXML::Document.entity_expansion_limit = 1000

Questa correzione sarà resa disponibile come gemma e usata perle future versioni di Rails, ma gli utenti dovrebbero intraprendere azioni correttive immediatamente.

Crediti

Un sincero ringraziamento a Luka Treiber e Mitja Kolsek di ACROS Security per notificare il problema ai team di sicurezza di Ruby e Rails.

Grazie a Michael Koziarski del Rails Core Team per creare la monkey patch per correggere questa vulnerabilità

Cambiamenti

  • 2008-08-29 18:46 +09:00 corretto il summary per specificando che la vulnerabilità non riguarda solo Rails.
  • 2008-11-09 12:40 +09:00 corretto un baco nella monkey patch.