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.

http://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.

Artikel Selengkapnya…

Jalinan Apple dan Ruby Semakin Mesra

Sejak gempar Mac OS X (Leopard) dirilis tahun lalu beserta dukungan penuh untuk Ruby dan Ruby on Rails berupa included dengan Sistem Operasi, sepertinya relasi Apple dan berkelebatnya Ruby semakin melaju dengan mesra.

Ada artikel di InfoQ yang menggarisbawahi beberapa cara menggunakan Ruby di Apple yang mungkin Anda lewatkan adalah sebagai berikut:

  • iPhone Configuration Web Utility - Sebuah tool yang ditulis dengan Ruby on Rails supaya customer enterprise bisa memanage iPhone.
  • SproutCore JavaScript framework - yang didesain untuk aplikasi-aplikasi yang mirip Desktop untuk Web dan digunakan aplikasi baru Apple MobileMe. SproutCore terinstalasi sebagai gem, menggunakan generator yang ditulis dengan Ruby untuk menciptakan resource-resource dan menggunakan Merb untuk generate karya HTML.
  • Proyek MacRuby - Apple port Ruby pada runtime Objective-C - yang membuat integrasi Cocoa untuk pengembangan aplikasi Desktop menjadi semakin mudah.

Sudah adakah di antara teman-teman di komunitas Ruby yang sudah mencoba bereksperimen dan menggunakan aplikasi web MobileMe dan SproutCore? Bagaimana pendapat Anda? Silakan ikut serta aktif bersuara lewat blog Anda dan pasang link Anda kesini.

Sumber Tulisan: RubyInside. Apple And Ruby: The Ongoing Relationship diterjemahkan ke Bahasa Indonesia oleh ariekeren

Artikel Selengkapnya…

Bandung Ruby on Rails Workshop, 28 - 29 Juli 2008

Dengan didukung oleh PT INTI (PT. Industri Telekomunikasi Indonesia (Persero)), KlariTI (Klaster Industri Telematika Indonesia), RICE (Regional IT Centre of Excellence) Bandung, OpenSUSE Indonesia, Klub Linux Bandung, Ubuntu Indonesia, dan IGOSCenter, Komunitas Ruby Indonesia mengadakan workshop Ruby on Rails Fundamental.

Tempat : Gedung Pusat Teknologi PT INTI (Persero), Jl. Moh. Toha 77, Bandung

Waktu : 28 – 29 Juli 2008, pukul 09.00 – 17.00 Waktu Indonesia Barat

Pendaftaran : railstraining@narayana.co.id

Tidak dipungut biaya, namun tempat sangat terbatas. Jika semua slot sudah terisi, pendaftaran mungkin tetap dibuka bagi yang benar-benar antusias terhadap Ruby on Rails (konfirmasi terlebih dahulu via email di atas). Peserta tambahan tidak mendapat fasilitas (PC, lunch, sertifikat dll.) seperti para pendaftar pertama, tapi kami coba mungkinkan untuk bisa ikut serta menggali ilmu bersama (kami sarankan membawa laptop sendiri).

Pelatihan Workshop Ruby on Rails Fundamental ini langsung dibimbing oleh Arie Kusuma Atmaja bertindak sebagai mentor.

Kegiatan workshop ini adalah untuk menjawab “kurangnya” kegiatan Ruby Indonesia terutama dalam bentuk kopdar atau pertemuan offline yang melakukan penekanan terutama pada sessions untuk newbies/pemula agar semua SDM Indonesia bisa maju dan tumbuh kembang bersama.

Publikasi:

Artikel Selengkapnya…

21 Trik-Trik Ruby

Sewaktu mengurus Ruby Inside pengurusnya sering melihat banyak sekali code Ruby. Kebanyakan sih sangat bagus, tetapi kadang-kadang kita lupa kalau sebetulnya ada jalan pintas beserta trik-trik Ruby yang bisa digunakan daripada reinvent the wheel (maksudnya: menemukan sesuatu yang sudah ada). Berikut adalah 21 trik-trik Ruby yang beraneka-ragam, mulai dari yang biasa digunakan sehari-hari oleh Ruby Developer berpengalaman maupun juga yang belum banyak ditemukan. Sebelum menulis posting ini sebenarnya Penulis RubyInside bahkan belum dapat ide buat trik yang nomor 2! Pokoknya apapun level Ruby Anda, semoga dengan penyegaran dan pencerahan posting ini di kemudian hari dapat bermanfaat buat Anda di kemudian hari bila menemukan kasus serupa.

1 – Cara Cepat Mengekstraksi hasil match regexp

Cara yang biasa digunakan untuk mengekstrak data dari teks pakai regexp adalah dengan menggunakan metode match. Nah sebetulnya ada shortcut yang bisa dipakai agar proses hidup lebih sejahtera.

email = "Fred Bloggs <fred@bloggs.com>"
email.match(/<(.*?)>/)[1] # => “fred@bloggs.com”
email[/<(.*?)>/, 1] # => “fred@bloggs.com”
email.match(/(x)/)[1] # => NoMethodError [:(]
email[/(x)/, 1] # => nil
email[/([bcd]).*?([fgh])/, 2] # => “g”

2 – Shortcut buat Array#join

Sudah mafhum bagi kebanyakan kita Rubyist bila menggunakan Array#* dengan angka, untuk memproses kali dari besarnya array banyak elemen, tetapi jarang diketahui kalau sebenarnya kita bisa menggunakan Array#* buat string ketimbang memakai Array#join!

%w{ariekeren lagi ngetes} * ", "          # => "ariekeren, lagi, ngetes"
h = { :name => "ArieKeren“, :age => 27 }
h.map { |i| i *
"=" } * "\n" # => “age=27\nname=ArieKeren”

3 – Cara Cepat Memformat Angka Desimal

Memformat angka float ke bentuk yang biasa digunakan untuk harga bisa dicapai dengan sprintf atau bisa juga dengan cara alternatif, yaitu dengan formatting interpolation:

duit = 9.5
"%.2f" % duit # => “9.50″

4 – Cara Cepat Mengapit Teks

Teknik formatting interpolation dari nomor ketiga keluar lagi, kali ini adalah bagaimana menyisipkan suatu string ke string yang lain:

"[%s]" % "stringnya pindah doang" # => “[stringnya pindah doang]”

Anda juga bisa menggunakan elemen-elemen dari array untuk mengganti penempatan string tersebut:

x = %w{p ketemulagi p}
"<%s>%s</%s>" % x # => “<p>ketemulagi</p>"

5 – Menghapus direktori beserta seluruh isinya

Jangan sortir ulang dengan menggunakan shell. Ruby punya library file utilities yang nyaman dipakai untuk operasi file seperti menghapus direktori berikut seluruh isinya:

require 'fileutils'
FileUtils.rm_r 'somedir'

Hati-hati kalau Anda menggunakan cara ini!

6 – Menyatukan dan Memisahkan enumerable

Tanda bintang juga bisa digunakan untuk menyatukan dan memisahkan enumerable (berfungsi untuk array maupun hash) daripada menggunakan metode flatten. Kita akan langsung lihat dari contoh berikut bicara ini saja biar jelas:

Contah dengan Array:

a = %w{a b}
b = %w{c d}
[ a + b ] # => [[”a”, “b”, “c”, “d”]]
[ *a + b ] # => [”a”, “b”, “c”, “d”]

Contoh dengan Hash:

a = { :name => "ArieKeren", :age => 27 } 
# => {:name=>"ArieKeren", :age=>27}

[a]
# => [{:name=>"ArieKeren", :age=>27}]

[*a]
# => [[:name, "ArieKeren"], [:age, 27]]

Contoh dengan tangkapan parameter paralel:

a = %w{a b c d e f g h}
# => ["a", "b", "c", "d", "e", "f", "g", "h"]

b = [0, 5, 6]
# => [0, 5, 6]

a.values_at(*b)
# => ["a", "f", "g"]

7 – Persingkat definisi variabel lokal

Daripada mendefinisikan variabel lokal dengan beragam konten awal (sering hanya berupa hash kosong ataupun array kosong), Anda sebenarnya bisa langsung mendefinisikan variabel lokal “sekaligus” ketika operasi sedang berlangsung:

(z ||= []) << 'coba'

8 – Penggunaan yang-bukan-string maupun yang-bukan-simbol sebagai hash key

Sangat jarang kita lihat seseorang menggunakan yang-bukan-string maupun yang-bukan-simbol sebagai hash key. Padahal itu semua bisa dilakukan, dan kadang-kadang berguna (dan, tidak, contoh berikut bukan contoh yang dahsyat):

does = is = { true => 'Yes', false => 'No' }
does[10 == 50]
# => “No”

is[10 > 5]
# => “Yes”

9 – Gunakan ‘and’ dan ‘or’ untuk mengelompokkan operasi satu baris

Trik ini adalah trik yang biasa dipakai oleh Ruby Developer dengan penuh percaya diri untuk memperpadat, mempersingkat, dan menghilangkan terlalu banyaknya baris-baris kode yang sebetulnya berisikan statement-statement yang pendek-pendek:

queue = []
%w{hello x world}.each do |word|
  queue << word and puts "Added to queue" unless word.length < 2
end
puts queue.inspect
# Output:
# Added to queue
# Added to queue
# [”hello”, “world”]

10 – Menentukan eksekusi kode

Trik berikut merupakan pattern yang biasa digunakan Ruby Developer berpengalaman. Kalau Anda menulis Ruby script yang dapat digunakan sebagai library maupun langsung dari command line, Anda bisa menggunakan trik ini untuk menentukan apakah Anda sedang menjalankan script langsung atau tidak:

if __FILE__ == $0
  # Do something.. run tests, call a method, etc. We're direct.
end

11 – Mempercepat assignment sekaligus (mass assignment)

Mass assignment merupakan trik yang Ruby Developer pelajari dari awal-awal ya, tetapi adalah sesuatu yang amazing dan menyenangkan betapa jarang trik ini digunakan:

a, b, c, d = 1, 2, 3, 4

Trik ini bisa dipakai di banyak kasus seperti menangkap parameter argumen suatu metode yang berupa array dengan tanda * (bintang) :

def my_method(*args)
  a, b, c, d = args
end

12 – Gunakan range daripada perbandingan rumit untuk angka

Tidak ada lagi kode omong kosong seperti if x > 1000 && x < 2000.

year = 1972
puts case year
        when 1970..1979: "Tujuhpuluhan"
        when 1980..1989: "Delapanpuluhan"
        when 1990..1999: "Sembilanpuluhan"
      end

13 – Gunakan Enumeration untuk menghindari kode-kode berulang

%w{rubygems daemons eventmachine}.each { |x| require x }

14 – Operator Ternary

Trik lain yang biasa dipelajari di awal-awal oleh Ruby Developer tetapi sesuatu yang sebenarnya jarang kelihatan digunakan oleh Ruby Developer berpengalaman adalah operator ternary. Operator ternary bukan hammer, tetapi terkadang bisa membuat banyak hal menjadi singkat dan padat.

puts x == 10 ? "x adalah sepuluh" : "x bukan sepuluh"

# Atau.. bisa juga digunakan untuk assignment yang bersandar pada hasil operator ternary
LOG.sev_threshold = ENVIRONMENT == :development ? Logger::DEBUG : Logger::INFO

15 – Operator Ternary Bersarang (Nested Ternary Operators)

Trik ini bisa jadi membuat kode menjadi rumit dibaca. Tetapi sebenarnya hanya urusan return obyek saja sama seperti banyak obyek lain di Ruby.

qty = 1
qty == 0 ? 'none' : qty == 1 ? 'one' : 'many'
# Hanya sebagai ilustrasi saja supaya tidak bingung:
(qty == 0 ? 'none' : (qty == 1 ? 'one' : 'many'))

16 – Maksimalkan penggunaan fitur bawaan logis di Ruby

Ada sering banyak metode yang menggunakan pattern kurang lebih sebagai berikut:

def is_odd(x)
  # Terlalu panjang..
  if x % 2 == 0
    return false
  else
    return true
  end
end

Mungkin kita bisa saja menggunakan operator ternary untuk improve?

def is_odd(x)
  # Jangan sekali-sekali menaruh false dan true pada operator ternary!!
  x % 2 == 0 ? false : true
end

Ya, kode barusan tadi memang lebih pendek, dan saya sering melihat pattern seperti itu, padahal sebenarnya Anda seharusnya bisa selangkah lebih maju dan menyandarkan diri pada hasil respon dari operator comparison Ruby yang berupa true maupun false langsung!

def is_odd(x)
  # Gunakan hasil logis yang sudah disediakan Ruby secara otomstis untuk Anda..
  x % 2 != 0
end

17 – Perhatikan seluruh exception backtrace

def do_division_by_zero; 5 / 0; end
begin
  do_division_by_zero
rescue => exception
  puts exception.backtrace
end

18 – Manfaatkan obyek tunggal DAN array agar dapat dienumerasikan

[*items].each do |item|
  # …
end

19 – Rescue yang berada dalam blok tidak perlu diapit ‘begin’

def x
  begin
    # …
  rescue
    # …
  end
end
def x
  # …
rescue
  # …
end

20 – Komentar format blok

Di Ruby kita bisa dengan bebas sesuai selera untuk berkomentas di kode dengan pagar ataupun menggunakan blok begin dan end:

puts "x"
=begin
  ini adalah blok komentar
  Anda dapat menaruh apa saja yang Anda suka disini!

  puts “y”
=end

puts "z"

21 – Rescue satu baris

h = { :age => 10 }
h[:name].downcase # ERROR
h[:name].downcase rescue "No name" # => “No name”

Jika Anda ingin mem-posting daftar trik-trik Ruby di blog Anda, kirimkan trackback kesini atau berkomentarlah lewat media milis ID Ruby maupun blog Anda, nanti kami akan melink semua posting. Alternatif lain, seperti yang sudah sering didengung-dengungkan di komunitas Ruby Indonesia, Anda dapat menghubungi kami bila Anda mempunyai artikel, tulisan tentang Ruby, maupun trik-trik Ruby untuk kami pasang disini, semua hal seperti komentar, maupun kritik dan hal-hal lain demi kebaikan dan kemajuan kita bersama. Terima kasih.

Sumber tulisan dari RubyInside – 21 Ruby Tricks You Should Be Using In Your Own Code dengan penyesuaian seperlunya oleh ArieKeren

Artikel Selengkapnya…

Rubinius On Rails: Rubinius Telah Menjadi Implementasi Ruby Ketiga yang Menjalankan Rails

Evan Phoenix telah mengumumkan bahwa proyek Rubinius telah mencapai major milestone: Rubinius bisa menjalankan Rails! Ini berarti telah membuat Rubinius menjadi yang ketiga yang telah mengimplementasikan penggabungan rails (setelah MRI dan JRuby) dan tentu akan mengangkat reputasi Rubinius menjadi lebih baik, ini telah menjadi implementasi kunci untuk diperhatikan di masa yang akan datang. Chad Fowler bahkan memberitakan bahwa dalam waktu satu tahun kedepan, Rubinius akan digunakan dalam production deployment dan akan segera menjadi implementasi standar Ruby secara de facto.

Sekarang kita melihat pada implementasi yang ada pada Microsoft, IronRuby, IronRuby juga boleh jadi akan segera bergabung dengan klub Rails segera.

Sumber: Rubinius On Rails: Rubinius Becomes 3rd Ruby Implementation to Run Rails

Artikel Selengkapnya…

Arsip Tahun 2008…