#### Dampak

Hal ini terkait dengan kompleksitas komputasional. Seri String yang
dibuat secara spesial yang saling menabrak nilai hash mereka secara sengaja
telah ditemukan. Dengan urutan itu, penyerang dapat menyebabkan serangan
denial of service dengan, contohnya, memberi mereka parameter POST dari
permintaan HTTP untuk aplikasi Rails Anda.

#### Penjelasan Rinci

Situasi ini mirip dengan yang ditemukan pada Perl pada tahun 2003. Pada
seri Ruby 1.8, kami menggunakan fungsi hash deterministik untuk meng-hash
sebuah string. Dalah hal ini, \"deterministik\" berarti tidak ada informasi
lain selain string itu sendiri untuk membuat sebuah nilai hash. Jadi, Anda
dapat melakukan prekalkulasi nilai hash string sebelumnya. Dengan mengumpulkan
seri string yang memiliki nilai hash sama, penyerang dapat membiarkan proses Ruby
membentrokkan tabel hash (termasuk instance class `Hash`). Atribut amortisasi O(1)
tabel hash bergantung pada keseragaman distribusi nilai hash. Dengan memberikan
input yang dibuat sedemikian rupa, penyerang dapat membuat tabel hash jauh lebih
lambat dari yang diharapkan (yaitu O(n<sup>2</sup>) untuk membuat tabel dengan
n elemen dalam hal ini).

#### Versi yang Terkena Dampak

* Ruby 1.8.7-p352 dan semua versi sebelumnya.

Semua seri Ruby 1.9 tidak terkena dampak serangan seperti ini. Mereka tidak
berbagi implementasi hash dengan seri Ruby 1.8.

#### Solusi

Solusi kami adalah mengacak fungsi hash string dengan bit acak yang dibuat
PRNG. Dengan melakukan itu, nilai hash string tidak lagi deterministik.
Yakni, hasil `String#hash` konsisten untuk lifetime proses saat ini dan
akan membuat angka yang berbeda pada boot selanjutnya. Untuk merusak situasi
ini, penyerang harus membuat string yang dapat menangani pengacakan tersebut.
Hal ini diyakini cukup sulit.

Harap upgrade ke [ruby 1.8.7-p357][1].

#### Catatan

* Ingat bahwa solusinya *tidak berarti* algoritma hash kami aman secara
  kriptografis. Dengan kata lain, kami memperbaiki tabel hash tetapi
  tidak memperbaiki kelemahan `String#hash`. Penyerang mungkin tetap
  mengeksploitasinya ketika ia mendapat sepasang string dan nilai hash
  yang dikembalikan `String#hash`. Anda *tidak boleh* memberi tahu
  keluaran `String#hash`. Jika Anda perlu melakukan hal itu, harap
  pertimbangkan penggunaan algoritma hash aman. Beberapa dari algoritma
  tersebut (seperti SHA256) disediakan di library standar Ruby.

* Untuk yang mengetahui algoritma hash alternatif di dalam kode kami:
  kami tidak mendukungnya (kode itu dinonaktifkan secara default). Dengan
  memilih mereka, kami anggap Anda dapat membaca C, dan Anda dapat mengerti
  hal yang salah dengan yang default. Pastikan pilihan Anda aman untuk resiko
  Anda sendiri.

#### Ucapan Terima Kasih

Terima kasih kepada Alexander Klink
[alexander.klink@nruns.com](mailto:alexander.klink@nruns.com) dan Julian
Waelde
[jwaelde@cdc.informatik.tu-darmstadt.de](mailto:jwaelde@cdc.informatik.tu-darmstadt.de)
untuk melaporkan masalah ini.

**PERBAIKAN** beberapa tautan terkait:

* [CVE-2011-4815][2] ditetapkan pada masalah ini.
* oCERT.org menerbitkan [sebuah laporan][3] tentang hal ini.
* JRuby merilis [versi 1.6.5.1][4] untuk memperbaiki masalah yang sama. Alternatif
  Ruby lain mungkin juga mendapat masalah yang sama.
* Akun Twitter [@hashDoS][5] mengumpulkan informasi tentang serangan bentrok hash.



[1]: http://mla.n-z.jp/?ruby-talk=391606
[2]: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4815
[3]: http://www.ocert.org/advisories/ocert-2011-003.html
[4]: http://jruby.org/2011/12/27/jruby-1-6-5-1
[5]: https://twitter.com/#!/hashDoS
