\n\n\n\n\n\n\n\n\n\n\n
flawopen.com/Simulator/Heartbleed Buffer Overread
Simulator memori interaktif di peramban yang mendemonstrasikan bagaimana panjang TLS Heartbeat tanpa validasi memicu kebocoran memori heap server secara visual.
Bayangkan Anda memberikan 4 huruf kata 'BIRD' kepada burung beo terlatih dan berkata: 'Ulangi kata saya, tetapi buat jawabanmu sepanjang 64.000 huruf.' Burung beo berkicau 'BIRD' lalu langsung melanjutkan dengan mengoceh 63.996 huruf berikutnya yang tersimpan di memorinya—termasuk kata sandi rahasia, kunci privat SSL, dan percakapan rahasia pengunjung lain. Pada Heartbleed, OpenSSL mempercayai panjang pesan yang diklaim klien tanpa memeriksa ukuran paket sebenarnya, menyalin memori mentah server kembali ke penyerang.
Penyerang mengirim Heartbeat dengan muatan 1 byte ('A') namun memanipulasi field panjang menjadi 65.535 byte (0xFFFF).
OpenSSL membaca ukuran dengan n2s(p, payload) tanpa memeriksa apakah 1 + 2 + payload + 16 <= rrec.length.
Server mengalokasikan 64 KB penuh pada memori heap berdasarkan klaim penyerang.
Fungsi memcpy() menyalin 64 KB memori heap di luar paket 1 byte, mengekspos kunci privat RSA dan token sesi aktif.
/* Membaca panjang 16-bit langsung dari paket tanpa pemeriksaan batas */
n2s(p, payload);
pl = p;
/* Mengalokasikan buffer balasan berdasarkan klaim sepihak klien */
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;
/* KESALAHAN FATAL: Menyalin hingga 64 KB memori heap server yang berdekatan! */
memcpy(bp, pl, payload);
r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
/* Membaca panjang 16-bit dari paket */
n2s(p, payload);
pl = p;
/* PERBAIKAN: Pastikan muatan yang diklaim tidak melebihi panjang record sebenarnya */
if (1 + 2 + payload + 16 > s->s3->rrec.length)
return 0; /* Buang paket cacat secara senyap */
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;
memcpy(bp, pl, payload);