flawopen.com/Teardowns/cve-2024-26585-linux-tls-tx-work-close-race
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.
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
1. Transmisi TLS dimulai
Proses menggunakan jalur transmisi kTLS; enkripsi record dapat selesai secara asinkron.
2. Callback memeriksa urutan
tls_encrypt_done() memeriksa apakah record yang selesai berada di depan ctx->tx_list.
3. Bangun bersaing dengan penutupan
Sebelum patch, callback dapat membangunkan thread dengan complete() lalu memasukkan TX work; thread dapat menutup socket di antaranya.
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
// 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);
// 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
- ✓Perbarui ke kernel distribusi yang didukung dan memuat backport
CVE-2024-26585; periksa pemberitahuan vendor karena cabang stabil sering menerima backport. - ✓Saat meninjau callback asinkron, masukkan pekerjaan lanjutan ke antrean sebelum sinyal selesai jika thread yang terbangun dapat menutup objek bersama.
- ✓Sinkronkan pembatalan atau pengosongan callback work saat teardown agar callback tidak dapat memasukkan work baru setelah titik pembatalan.
- ✓Tambahkan uji regresi konkurensi terkontrol yang mempertemukan penyelesaian TLS asinkron dengan penutupan socket dan memeriksa urutan work.
- ✓Jangan menganggap
MSG_ZEROCOPYatau kripto perangkat keras sebagai prasyarat CVE ini; deskripsi upstream menyebut penyelesaian kripto asinkron dan penjadwalan TX work.