Denial of Service dan Kerentanan Penciptaan Unsafe Object pada JSON (CVE-2013-0269)

Ada kerentanan denial of service dan penciptaan object unsafe pada json dibundel dengan Ruby. Kerentanan ini telah ditetapkan CVE dengan identifier CVE-2013-0269. Kami sangat menyarankan untuk meng-upgrade ruby.

Rincian

Ketika memparse dokumen JSON tertentu, gem JSON (termasuk yang dibundel dengan Ruby) dapat dipaksakan untuk menciptakan simbol Ruby dalam sistem target. Karena simbol Ruby tidak masuk pada GC, hal ini dapat mengakibatkan serangan denial of service.

Teknik yang sama dapat digunakan untuk membuat objek dalam sistem target yang bertindak seperti objek internal. Ini objek "palsu" ini digunakan untuk melewati mekanisme keamanan tertentu dan dapat digunakan untuk serangan injeksi SQL di Ruby on Rails.

Kode yang dapat menyebabkan masalah di atas terlihat seperti ini:

JSON.parse(user_input)

Di mana variabel `user_input` akan memiliki sebuah dokumen JSON seperti di bawah ini.

{"json_class":"foo"}

Gem JSON akan mencoba untuk mencari konstanta "foo". Mencari konstanta itu akan membuat sebuah simbol.

Pada JSON versi 1.7.x, objek dengan berbagai macam attribut dapat dibuat dengan menggunakan dokumen JSON seperti di bawah ini.

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

Dokumen ini akan membuat sebuah instance dari JSON::GenericObject, dengan attribut "foo" yang memiliki nilai "bar". Menginstansi objek ini akan menghasilkan berbagai macam pembuatan simbol dan dalam beberapa kasus dapat digunakan untuk mem-bypass keamanan.

HARAP PERHATIKAN: perilaku ini tidak berubah ketika menggunakan `JSON.load`. `JSON.load` sebaiknya tidak pernah diberikan input dari sumber tak dikenal. Jika Anda memproses JSON dari sumber tak dikenal, selalu gunakan `JSON.parse`.

Semua pengguna menjalankan rilis yang terkena dampak ini harus meng-upgrade atau menggunakan salah satu dari solusi-solusi lain.

Solusi Lain

Untuk para pengguna yang tidak dapat meng-upgrade Ruby atau Gem JSON, ganti kode Anda dari seperti di bawah ini:

JSON.parse(json)

menjadi:

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

Jika Anda tidak dapat mengganti penggunaan `JSON.parse` (contohnya ketika Anda menggunakan gem yang bergantung pada `JSON.parse` seperti multi_json), maka gunakan monkey patch berikut.

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

Versi yang Terkena Dampak

  • Semua ruby versi 1.9 sebelum Ruby 1.9.3 patchlevel 392
  • Semua ruby versi 2.0 sebelum Ruby 2.0.0 patchlevel 0
  • Sebelum trunk revision 39208

Ucapan Terima Kasih

Terima kasih besar pergi ke orang-orang berikut untuk bertanggung jawab mengungkapkan masalah ini dan bekerja sama dengan tim Rails untuk memperbaiki masalah ini.

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

History

  • Awalnya diterbitkan pada 2013-02-22 12:00:00 (UTC)