DoS vulnerability di REXML

Terdapat DoS vulnerability di library REXML yang digunakan oleh Rails untuk memparse request XML yang datang. Rentan masalah ini biasa disebut sebagai teknik serangan "XML entity explosion" yang bisa digunakan secara remote untuk membuat aplikasi apa saja tidak bisa memparse XML yang sudah disediakan oleh user. Kebanyakan aplikasi Rails rentan dengan serangan ini.

Akibat

Penyerang dapat melakuka denial of service yang menyebabkan REXML memparse dokumen yang berisikan entitas bersarang rekursif seperti:

<?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>

Versi Vulnerable

seri 1.8

  • 1.8.6-p287 dan semua versi sebelumnya
  • 1.8.7-p72 dan semua versi sebelumnya

seri 1.9

  • semua versi

Solusi

Silakan mendownload monkey patch berikut untuk membenahi masalah ini.

https://www.ruby-lang.org/security/20080823rexml/rexml-expansion-fix.rb

Kemudian benahi aplikasi untuk meload rexml-expansion-fix.rb sebelum menggunakan REXML.

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

Kalau Anda memiliki aplikasi Rails, copy file rexml-expansion-fix.rb ke direktori yang berada di load path (misalkan di RAILS_ROOT/lib/), dan tambahkan baris-baris kode berikut ini ke config/environment.rb.

require "rexml-expansion-fix"

Kalau aplikasi Anda menggunakan Rails 2.1 atau lebih baru, Anda bisa dengan mudah mengcopy file rexml-expansion-fix.rb ke dalam direktori RAILS_ROOT/config/initializers dan file monkey patch tersebut akan dipanggil dan disertakan secara otomatis.

Secara default, batas XML entity expansion adalah 10000. Anda bisa menggantinya dengan cara mengubah REXML::Document.entity_expansion_limit. Misalkan:

REXML::Document.entity_expansion_limit = 1000

Pembenahan ini akan tersedia sebagai gem dan digunakan di rails versi berikutnya, tetapi pengguna Ruby termasuk aplikasi terkait (seperti Rails) seharusnya mengambil langkah preventif sesegera mungkin untuk membenahi aplikasinya.

Kredit

Kredit untuk Luka Treiber dan Mitja Kolsek dari ACROS Security yang telah membeberkan rahasia sekuriti ini ke Tim Sekuriti Ruby dan Rails.

Kredit untuk Michael Koziarski dari Tim Utama Rails yang telah membuatkan monkey patch untuk membenahi vulnerability masalah keamanan ini.