flawopen.com/Teardowns/cve-2014-0160-heartbleed
CVE-2014-0160: kebocoran memori Heartbleed
CVE-2014-0160 memungkinkan peer TLS atau DTLS membaca hingga 64 KiB melewati record Heartbeat ketika OpenSSL memercayai panjang payload yang tidak ada di dalam record. Perbaikan upstream memvalidasi record sebelum mengurai dan menggemakan payload.[1], [2]
Bayangkan seorang petugas menerima kartu berisi beberapa kata, tetapi percaya pada label yang meminta salinan jauh lebih panjang. Alih-alih berhenti di tepi kartu, ia terus menyalin teks berikutnya dari baki bersama. Heartbleed membuat OpenSSL membaca melewati record yang diterima; byte yang terbuka bergantung pada isi memori proses.[1], [3]
Konsep Kunci & Istilah
Heartbeat TLS/DTLS (RFC 6520)- Pesan keep-alive pada TLS atau DTLS. Permintaan berisi payload yang dikembalikan peer serta padding yang diwajibkan protokol.[3]
payload_length- Field 16-bit yang menyatakan ukuran payload Heartbeat. Payload harus muat di record yang diterima setelah tipe pesan, field panjang, dan padding minimum.[1], [3]
memcpy()- Menyalin jumlah byte tertentu dari pointer sumber. Fungsi ini tidak mengetahui panjang buffer sumber yang valid; pemanggil harus memvalidasinya.[1], [2]
Pembacaan melewati buffer (CWE-126)- Membaca setelah akhir buffer sumber yang semestinya. Pada Heartbleed, balasan dapat mengungkap hingga 64 KiB memori proses, bergantung pada isinya.[5]
Pemetaan kerangka kerja
- Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-126
- CISA KEV — ditambahkan 2022-05-04 — CVE-2014-0160
Analisis Akar Masalah (Root Cause)
tls1_process_heartbeat() dan dtls1_process_heartbeat() membaca panjang payload 16-bit dari pesan Heartbeat lalu meneruskannya ke memcpy() dalam jalur balasan tanpa memastikan byte payload sebanyak itu tersedia di s->s3->rrec.length. Peer dapat menyatakan data lebih banyak daripada yang dibawa record TLS atau DTLS. OpenSSL lalu menggemakan byte setelah record yang diterima dan berpotensi mengungkap hingga 64 KiB memori proses; isinya bergantung pada memori saat itu, sehingga key, kata sandi, atau cookie tertentu tidak dijamin muncul. Commit upstream 96db902 terlebih dahulu menolak record yang terlalu pendek untuk memuat tipe, field panjang, dan padding minimum, lalu membandingkan 1 + 2 + payload + 16 dengan panjang record yang diterima. Perbaikan juga membatasi balasan menggunakan SSL3_RT_MAX_PLAIN_LENGTH dan memakai write_length yang dihitung. Pola pemeriksaan yang sama diterapkan pada handler TLS dan DTLS.[1], [2], [3], [4]
Alur Serangan Langkah demi Langkah
Kode Sumber: Rentan vs Aman
Cuplikan ini berasal dari perubahan upstream OpenSSL dan bukan program mandiri. Kode rentan mengurai field sebelum memeriksa keberadaan header tetap dan padding minimum, lalu menyalin panjang payload yang dinyatakan peer. Perbaikan memeriksa ukuran minimum record sebelum parsing, mencocokkan payload yang dinyatakan dengan record yang diterima, dan membatasi panjang balasan. OpenSSL menerapkan perubahan terkait pada tls1_process_heartbeat() dan dtls1_process_heartbeat().[2], [1]
Cuplikan sumber: ssl/t1_lib.c
/* Kutipan tls1_process_heartbeat() sebelum perbaikan. */
hbtype = *p++;
n2s(p, payload);
pl = p;
/* Pada jalur respons TLS1_HB_REQUEST: */
memcpy(bp, pl, payload);
r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT,
buffer, 3 + payload + padding);
/* Tolak record yang terlalu pendek untuk memuat tipe, panjang, dan padding minimum. */
if (1 + 2 + 16 > s->s3->rrec.length)
return 0;
hbtype = *p++;
n2s(p, payload);
if (1 + 2 + payload + 16 > s->s3->rrec.length)
return 0;
pl = p;
/* Pada jalur respons TLS1_HB_REQUEST: */
unsigned int write_length = 1 + 2 + payload + padding;
if (write_length > SSL3_RT_MAX_PLAIN_LENGTH)
return 0;
buffer = OPENSSL_malloc(write_length);
memcpy(bp, pl, payload);
r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, write_length);
Kronologi Insiden
Daftar Periksa Penguatan Sistem Rekayasa
- ✓Tingkatkan ke rilis OpenSSL yang masih didukung vendor dan memuat perbaikan; upstream memperbaikinya pada 1.0.1g dan 1.0.2-beta2. Verifikasi backport distribusi, bukan hanya teks nomor versi.[1], [2]
- ✓Untuk endpoint yang mungkin terekspos, ganti private key dan sertifikat TLS yang terdampak dan cabut sertifikat lama jika kebocoran mungkin terjadi; sertakan klien yang memproses Heartbeat tidak tepercaya.[6]
- ✓Setelah layanan rentan ditambal, rotasi kredensial yang mungkin berada di memori prosesnya. Ubah kata sandi pengguna hanya setelah pemilik layanan memastikan perbaikan telah diterapkan.[6], [8]
- ✓Uji handler TLS dan DTLS pada batas record: header tetap terlalu pendek, panjang payload melebihi byte yang diterima, serta permintaan valid dengan padding minimum.[2], [3]
- ✓Jika Heartbeat tidak diperlukan dan kompatibilitas memungkinkan, bangun ulang dengan
-DOPENSSL_NO_HEARTBEATS, mitigasi alternatif dalam advisori OpenSSL.[1]
Sumber
- OpenSSL Security Advisory — TLS heartbeat read overrun (CVE-2014-0160)
- OpenSSL upstream fix — commit 96db902
- RFC 6520 — TLS and DTLS Heartbeat Extension
- NVD — CVE-2014-0160
- MITRE CWE-126 — Buffer Over-read
- Codenomicon / Heartbleed.com — The Heartbleed Bug
- CVE Program — CVE-2014-0160
- CISA — “Heartbleed” OpenSSL Vulnerability