Vulnerabilità di Denial of Service e creazione insicura di oggetti in JSON (CVE-2013-0269)

È stata rilevata una vulnerabilità di denial of service e creazione insicura di oggetti nella versione di json inclusa in Ruby. L'identificativo CVE "CVE-2013-0269" è stato assegnato a questa vulnerabilità. Raccomandiamo fortemente di aggiornare Ruby.

Dettagli

Durante il parsing di alcuni documenti JSON, la gemma JSON (inclusa in Ruby) può essere utilizzata per creare dei simboli Ruby su un sistema. Dal momento che i simboli in ruby non sono gestiti tramite garbage collection, ciò può essere usato per provocare un attacco di Denial of Service.

La stessa tecnica può essere usata per creare oggetti in un sistema, in modo che si comportino come oggetti interni. Tali oggetti possono essere utilizzati per aggirare alcuni meccanismi di sicurezza, e come base per attacchi di tipo SQL injection in Ruby on Rails.

Il codice impattato è del tipo:

JSON.parse(user_input)

Dove la variabile `user_input` contiene un documento JSON come questo:

{"json_class":"foo"}

La gemma JSON proverà a cercare una costante chiamata "foo". La ricerca di questa costante creerà un simbolo.

In JSON versione 1.7.x, oggetti con attributi arbitrari possono essere creati utilizzando documenti JSON come questo:

{"json_class":"JSON::GenericObject","foo":"bar"}

Questo documento creerà un'istanza di JSON::GenericObject, con l'attributo "foo" con il valore "bar". Istanziare questi oggetti risulterà in una creazione di simboli arbitrari, e in alcuni casi potrebbe essere usata per aggirare misure di sicurezza.

NOTA BENE: questo comportamento non cambia quando viene usato `JSON.load`. `JSON.load` non dovrebbe mai essere usato per processare input provenienti da sorgenti sconosciute. Se devi processare del codice JSON proveniente da sorgenti sconosciute, usa sempre `JSON.parse`.

Tutti gli utenti che utilizzano una versione di Ruby soggetta a questa vulnerabilità dovrebbero o aggiornare Ruby o la gemma JSON immediatamente, oppure utilizzare uno dei workaround.

Workarounds

Per utenti che non possono aggiornare Ruby o la gemma JSON, cambiate il codice da questo:

JSON.parse(json)

A questo:

JSON.parse(json, :create_additions => false)

Se non puoi cambiare l'utilizzo di `JSON.parse` (per esempio se utilizzi una gemma che dipende da `JSON.parse` come multi_json), applica manualmente questa patch:

module JSON
  class << self
    alias :old_parse :parse
    def parse(json, args = {})
      args[:create_additions] = false
      old_parse(json, args)
    end
  end
end

Versioni soggette alla vulnerabilità

  • Tutte le versioni di Ruby 1.9 precedenti a 1.9.3 patchlevel 392
  • Tutte le versioni di Ruby 2.0 precedenti a 2.0.0 patchlevel 0
  • Tutte le versioni precedenti alla trunk revision 39208

Crediti

Un ringraziamento enorme va alle seguenti persone, per averci notificato in maniera responsabile il problema, e per aver lavorato con il team di Rails per correggerlo:

  • Thomas Hollstegge of Zweitag (www.zweitag.de)
  • Ben Murphy

Cronologia

  • Originariamente pubblicato il giorno 2013-02-22 alle ore 12:00:00 (UTC)