Kerentanan Hilangnya $SAFE terkait Exception#to_s / NameError#to_s (CVE-2012-4464, CVE-2012-4466)

Beberapa kerentanan ditemukan pada Exception#to_s, NameError#to_s, dan name_err_mesg_to_s() yang merupakan API internal interpreter Ruby. Kode pengguna jahat dapat mem-bypass cek $SAFE dengan menggunakan salah satu dari beberapa kelemahan keamanan tersebut.

Rincian

Mekanisme $SAFE Ruby memungkinkan kode pengguna yang tak terpercaya untuk berjalan dalam mode $SAFE >= 4. Ini adalah sejenis sandbox, jadi beberapa operasi dibatasi dalam mode itu untuk melindungi data lain di luar sandbox.

Masalahnya ditemukan di sekitar mekanisme ini. API internal interpreter Exception#to_s, NameError#to_s, dan name_err_mesg_to_s() tidak menangani dengan benar bit $SAFE, jadi sebuah object String yang tidak di-taint dapat ditandai secara destruktif sebagai di-taint dengan menggunakan method-method itu. Dengan itu, kode tak terpercaya di sebuah sandbox dapat mengubah string yang tadinya tidak di-taint secara destruktif.

Ruby 1.8 pernah mengalami masalah keamanan yang mirip sekali. Itu telah memperbaiki Exception#to_s dan NameError#to_s, tetapi masalah name_err_mesg_to_str() masih ada pada perbaikan keamanan sebelumnya.

Versi yang Terkena Dampak

  • semua Ruby 1.8.7 sebelum patchlevel 371
  • semua Ruby 1.9.3 sebelum patchlevel 286
  • semua branch development Ruby 2.0 sebelum revisi r37068

Solusi

Harap upgrade ke versi terbaru.

Ucapan Terima Kasih

Kerentanan ini ditemukan oleh Tyler Hickes.

Update

  • Awalnya diterbitkan pada tanggal 2012-10-12 19:17:50 JST.