flawopen.com/Teardowns/cve-2025-39682-linux-ktls-zero-length-record-mishandling
Linux CVE-2025-39682: bug record nol pada kTLS
Record TLS non-DATA dengan panjang nol dalam antrean penerimaan kTLS Linux dapat melewati pemeriksaan jenis record per recvmsg. Perbaikan memeriksa jenis yang diproses meskipun tidak ada byte yang disalin. Penilaian CVSS Linux menyebut kemungkinan pengungkapan heap kernel ke ruang pengguna, kerusakan memori, dan crash kernel jarak jauh; ini adalah dampak yang dinilai, bukan klaim bahwa semua sistem terdampak pasti mengalami semuanya.
Vektor CVSS
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HBayangkan penyortir surat yang hanya boleh menaruh surat dari satu kategori ke setiap baki. Amplop kosong tetap memiliki kategori, tetapi penyortir lama menentukan pergantian baki dengan menghitung surat. Saat jumlahnya nol, kategori amplop diabaikan dan jenis berikutnya tercampur di baki yang sama. Perbaikan kernel memeriksa penanda kategori meskipun amplop tidak berisi data.
Konsep Kunci & Istilah
kTLS- Kernel TLS: Linux dapat memproses record TLS di kernel untuk socket TCP yang terpasang.
recvmsg()- System call penerimaan socket yang digunakan aplikasi dan jalur penerimaan kTLS.
Jenis konten TLS- Field yang mengelompokkan record, misalnya data aplikasi atau record kontrol.
rx_list- Antrean record penerimaan tertunda yang diproses oleh pemanggilan recvmsg berikutnya.
CWE-754- Pemeriksaan yang tidak memadai atas kondisi tidak biasa atau pengecualian. NVD mencantumkan
CWE-754dengan atribusi kepada CISA-ADP; catatan CVE Linux sendiri tidak menetapkan CWE.
Pemetaan kerangka kerja
- Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-754
- CISA KEV — ditambahkan 2026-09-18 — CVE-2025-39682
Analisis Akar Masalah (Root Cause)
Penerimaan kTLS Linux harus mengembalikan record DATA yang berurutan atau satu record non-DATA untuk setiap pemanggilan recvmsg(). Saat process_rx_list() menangani record awal non-DATA dengan panjang nol, fungsi dapat menetapkan jenis TLS sambil mengembalikan err == 0. tls_sw_recvmsg() menyalin nilai nol itu ke copied, lalu memakai (copied && control != TLS_RECORD_TYPE_DATA) sebagai bagian kondisi berhenti. Karena copied bernilai nol, jenis record yang sudah diproses diabaikan dan pemrosesan berlanjut ke data berikutnya. Patch upstream memeriksa control secara langsung: jika jenis telah dilaporkan dan bukan DATA, proses berhenti; nilai nol tetap berarti “belum ada jenis yang dilaporkan”. Dampak hanya berlaku saat jalur penerimaan TLS kernel Linux (kTLS) diaktifkan dan digunakan; ini bukan cacat parser semua pustaka TLS userspace. Vektor CVSS 3.1 yang diterbitkan Linux adalah 9,8 Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H). Nilai paparan berdasarkan penggunaan kTLS dan status kernel dari vendor.
Alur Serangan Langkah demi Langkah
kTLS menerima record
Aplikasi menggunakan socket TCP dengan penerimaan TLS kernel aktif.
Record non-DATA kosong dari antrean diproses
Kondisi terjadi jika record pertama di rx_list tidak memiliki payload. Pemrosesan dapat melaporkan jenis tetapi mengembalikan nol byte tersalin.
Pemeriksaan lama bergantung pada byte tersalin
Karena copied bernilai nol, kondisi lama tidak memeriksa apakah jenis record yang diproses adalah non-DATA.
Loop penerimaan melewati batas jenis
Data berikutnya dapat diproses dalam pemanggilan recvmsg yang sama, melanggar aturan satu jenis. Penilaian CVSS Linux menyebut kemungkinan pengungkapan heap kernel ke ruang pengguna, kerusakan memori, dan crash kernel jarak jauh; ini adalah dampak yang dinilai, bukan klaim bahwa semua sistem terdampak pasti mengalami semuanya.
Perbaikan memeriksa penanda semantik
Kondisi baru berhenti jika control berisi jenis non-DATA yang sudah ditetapkan, terlepas dari jumlah byte yang disalin.
Kode Sumber: Rentan vs Aman
Cuplikan net/tls/tls_sw.c, bukan fungsi lengkap. Perbaikan upstream mengubah kondisi berhenti agar memakai penanda jenis konten yang dilaporkan, bukan jumlah byte yang disalin. control == 0 berarti belum ada jenis yang dilaporkan; jenis non-DATA yang terisi menghentikan pemanggilan recvmsg ini. Ini perubahan logika persis dari patch upstream.
Cuplikan sumber: net/tls/tls_sw.c — fungsi tls_sw_recvmsg
copied = err;
if (len <= copied ||
(copied && control != TLS_RECORD_TYPE_DATA) || rx_more)
goto end;
copied = err;
if (len <= copied || rx_more ||
(control && control != TLS_RECORD_TYPE_DATA))
goto end;
Daftar Periksa Penguatan Sistem Rekayasa
- ✓Inventarisasi beban kerja yang mengaktifkan penerimaan kTLS Linux; TLS userspace biasa tidak otomatis terdampak.
- ✓Perbarui ke paket kernel vendor yang memuat perbaikan dan pastikan build tepat melalui advisori vendor.
- ✓Pertahankan aturan: satu pemanggilan recvmsg memproses record DATA berurutan atau satu record non-DATA, tanpa melewati batas jenis.
- ✓Jalankan atau pertahankan uji regresi upstream kTLS untuk record panjang nol; implementasi downstream jalur penerimaan juga harus memastikan record non-DATA kosong tidak membuat pemanggilan yang sama mengonsumsi record berikutnya.
- ✓Bedakan “jenis belum dilaporkan” dari “nol byte disalin”; periksa status semantik seperti
control. - ✓Jika patch tertunda, ikuti mitigasi vendor untuk kTLS dan pastikan dampaknya pada beban kerja yang memerlukan TLS kernel.