FlawOpen

flawopen.com/Teardowns/cve-2024-26585-linux-tls-tx-work-close-race

● CVE-2024-26585 · CVSS 4.7 · Sedang
Riset Keamanan · FlawOpen

CVE-2024-26585: race penutupan TLS Linux

Pada kTLS Linux, penyelesaian dapat membangunkan sendmsg/recvmsg sebelum TX work masuk antrean. Perbaikan menjadwalkan work lebih dulu.

💡 Penjelasan Sederhana (ELI5)

Seorang pekerja memberi tahu rekan yang menunggu bahwa tugas selesai sebelum memasukkan tugas terakhir ke antrean bersama. Rekannya dapat menutup toko dan membatalkan tugas yang ada pada jeda itu; pekerja lalu menambahkan tugas terlambat. Perbaikan kernel memasukkan pekerjaan transmisi TLS ke antrean sebelum memberi sinyal selesai.

Konsep Kunci & Istilah

kTLS
TLS di kernel Linux yang menangani record TLS pada jalur jaringan kernel.
Penyelesaian kripto asinkron
Callback yang berjalan setelah operasi enkripsi TLS asinkron selesai.
`complete()`
Primitif completion Linux yang membangunkan thread yang menunggu operasi selesai.
TX work tertunda
Pekerjaan kernel yang masuk antrean untuk melanjutkan pengiriman record TLS setelah enkripsi.

Pemetaan kerangka kerja

  • Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-362

Analisis Akar Masalah (Root Cause)

Di net/tls/tls_sw.c, tls_encrypt_done() dapat memanggil complete() untuk thread sendmsg()/recvmsg() yang menunggu sebelum menjadwalkan TX work tertunda bagi record terdepan. Thread yang terbangun dapat kembali dan menutup socket saat callback masih akan memasukkan work ke antrean, sehingga penutupan socket dan penjadwalan TX bersaing. Commit upstream e01e3934a1b2 membalik urutannya: jika record berada di depan ctx->tx_list, jadwalkan ctx->tx_work sebelum memanggil complete(). Pemberitahuan CVE menjelaskan race; sumber yang dikutip tidak mendukung klaim lama tentang MSG_ZEROCOPY, halaman jaringan yang dibebaskan, penimpaan memori, atau perbaikan refcount_inc_not_zero().

Alur Serangan Langkah demi Langkah

Langkah 1

1. Transmisi TLS dimulai

Proses menggunakan jalur transmisi kTLS; enkripsi record dapat selesai secara asinkron.

Langkah 2

2. Callback memeriksa urutan

tls_encrypt_done() memeriksa apakah record yang selesai berada di depan ctx->tx_list.

Langkah 3

3. Bangun bersaing dengan penutupan

Sebelum patch, callback dapat membangunkan thread dengan complete() lalu memasukkan TX work; thread dapat menutup socket di antaranya.

Langkah 4

4. Patch mengurutkan serah-terima

Perbaikan memasukkan TX work tertunda ke antrean terlebih dahulu, lalu memberi sinyal selesai agar thread tidak maju sebelum penjadwalan.

Kode Sumber: Rentan vs Aman

IMPLEMENTASI RENTAN
// Urutan terkait di net/tls/tls_sw.c sebelum e01e3934a1b2
bool ready = false;

if (rec == first_rec)
    ready = true;

if (atomic_dec_and_test(&ctx->encrypt_pending))
    complete(&ctx->async_wait.completion);

if (!ready)
    return;

if (!test_and_set_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask))
    schedule_delayed_work(&ctx->tx_work.work, 1);
PERBAIKAN AMAN & KUAT
// Urutan terkait di net/tls/tls_sw.c setelah e01e3934a1b2
if (rec == first_rec) {
    // Antrekan pekerjaan pengiriman sebelum membangunkan thread yang mengirimkannya.
    if (!test_and_set_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask))
        schedule_delayed_work(&ctx->tx_work.work, 1);
}

if (atomic_dec_and_test(&ctx->encrypt_pending))
    complete(&ctx->async_wait.completion);

Daftar Periksa Penguatan Sistem Rekayasa

Sumber