FlawOpen

flawopen.com/Teardowns/cve-2025-39682-linux-ktls-zero-length-record-mishandling

● CVE-2025-39682 · CVSS 9.8 · Kritis
Riset Keamanan · FlawOpen

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 CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
💡 Penjelasan Sederhana (ELI5)

Bayangkan 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-754 dengan atribusi kepada CISA-ADP; catatan CVE Linux sendiri tidak menetapkan CWE.

Pemetaan kerangka kerja

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

Langkah 1

kTLS menerima record

Aplikasi menggunakan socket TCP dengan penerimaan TLS kernel aktif.

Langkah 2

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.

Langkah 3

Pemeriksaan lama bergantung pada byte tersalin

Karena copied bernilai nol, kondisi lama tidak memeriksa apakah jenis record yang diproses adalah non-DATA.

Langkah 4

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.

Langkah 5

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

IMPLEMENTASI RENTAN
copied = err;
if (len <= copied ||
    (copied && control != TLS_RECORD_TYPE_DATA) || rx_more)
    goto end;
PERBAIKAN AMAN & KUAT
copied = err;
if (len <= copied || rx_more ||
    (control && control != TLS_RECORD_TYPE_DATA))
    goto end;

Daftar Periksa Penguatan Sistem Rekayasa

Sumber