flawopen.com/Teardowns/cve-2024-1086-linux-netfilter-nftables-uaf
CVE-2024-1086: use-after-free di Linux nf_tables
CVE-2024-1086 adalah use-after-free di Linux nf_tables akibat parameter DROP tidak valid. Pasang kernel perbaikan dari distribusi Anda.
Bayangkan formulir yang hanya mengizinkan petugas memilih “terima” atau “tolak”. Kolom terpisah berisi kode kesalahan untuk penolakan dan hanya menerima nol atau errno negatif yang valid. Pemeriksaan yang rentan membiarkan nilai positif “terima” masuk ke kolom itu. Kode jaringan kemudian menafsirkan vonis secara tidak konsisten. Patch menutup jalur tersebut dengan hanya menerima nilai vonis yang tepat dan didukung.
Konsep Kunci & Istilah
nf_tables- Subsistem kernel Linux yang digunakan nftables untuk mengatur penyaringan paket dan aturan jaringan terkait.
Vonis Netfilter- Hasil evaluasi aturan paket oleh kernel, misalnya
NF_ACCEPTatauNF_DROP. DROP dapat membawa nilai error; hook mengharapkan nol atau errno negatif yang valid. Use-after-free (CWE-416)- Cacat keamanan memori ketika kode mengakses objek setelah masa hidupnya berakhir. NVD mencatat kasus ini sebagai eskalasi hak akses kernel secara lokal.
User namespace- Namespace Linux yang memetakan identitas dan capability proses. Izin untuk membuatnya tanpa hak istimewa bergantung pada kebijakan kernel dan distribusi; hal itu sendiri tidak menjamin pelarian ke host.
Pemetaan kerangka kerja
- Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-416
- CISA KEV — ditambahkan 2024-05-30 — CVE-2024-1086
Analisis Akar Masalah (Root Cause)
Di net/netfilter/nf_tables_api.c, nft_verdict_init() sebelumnya memask nilai vonis dan menerima parameter untuk NF_DROP atau NF_QUEUE. Hook Netfilter mengharapkan bit atas NF_DROP berisi nol atau errno negatif yang valid. Perbaikan upstream menyatakan nilai positif seperti NF_ACCEPT dapat menyebabkan use-after-free. Patch menghapus jalur permisif dan hanya menerima vonis yang tepat; nilai lain menghasilkan -EINVAL. NVD mencatat dampaknya sebagai eskalasi hak akses lokal. Keterjangkauan bergantung pada kernel, capability yang tersedia, dan kebijakan distribusi; jangan menganggap semua konfigurasi container memiliki risiko yang sama.
Alur Serangan Langkah demi Langkah
Kemampuan lokal mengelola aturan
Serangan yang terdokumentasi bersifat lokal. Proses harus dapat mencapai validasi vonis nf_tables; capability yang diperlukan dan izin user namespace tanpa hak istimewa bergantung pada konfigurasi host.
Parameter vonis tidak valid mencapai validasi
Sebelum patch, nft_verdict_init() menerima nilai berparameter tertentu setelah menerapkan NF_VERDICT_MASK, termasuk nilai positif seperti NF_ACCEPT pada bit parameter.
Hook mencapai use-after-free
Hook Netfilter menafsirkan parameter NF_DROP sebagai nol atau errno negatif yang valid. Laporan upstream menyatakan nilai positif yang diterima dapat menyebabkan use-after-free saat pemrosesan paket; patch tidak mendokumentasikan primitive eksploit universal atau pelarian container yang pasti.
Pasang kernel perbaikan dari distribusi
Perubahan upstream menolak parameter vonis yang tidak didukung. Pasang dan boot kernel perbaikan dari distribusi Anda karena versi paket dan backport berbeda.
Kode Sumber: Rentan vs Aman
Kode yang rentan memask nilai vonis lalu melanjutkan pemrosesan, sehingga parameter positif seperti NF_ACCEPT dapat diterima pada bidang error NF_DROP. Perbaikan hanya menerima konstanta yang tepat dan mengembalikan -EINVAL untuk nilai lain. Ini adalah cuplikan terfokus dari patch upstream, bukan fungsi lengkap yang dapat dikompilasi sendiri.
Cuplikan sumber: net/netfilter/nf_tables_api.c
/* Kutipan nft_verdict_init() di net/netfilter/nf_tables_api.c sebelum f342de4e2f33.
* Jalur nilai bermasker menerima verdict berparameter. */
switch (data->verdict.code) {
default:
switch (data->verdict.code & NF_VERDICT_MASK) {
case NF_ACCEPT:
case NF_DROP:
case NF_QUEUE:
break;
default:
return -EINVAL;
}
fallthrough;
case NFT_CONTINUE:
case NFT_BREAK:
case NFT_RETURN:
/* Penanganan verdict lain yang sudah ada berlanjut di sini. */
break;
}
/* Kutipan nft_verdict_init() di net/netfilter/nf_tables_api.c,
* sebagaimana diubah oleh f342de4e2f33. */
switch (data->verdict.code) {
case NF_ACCEPT:
case NF_DROP:
case NF_QUEUE:
break;
case NFT_CONTINUE:
case NFT_BREAK:
case NFT_RETURN:
/* Penanganan verdict lain yang sudah ada berlanjut di sini. */
break;
default:
return -EINVAL;
}
Daftar Periksa Penguatan Sistem Rekayasa
- ✓Pasang dan boot paket kernel perbaikan yang direkomendasikan distribusi; setelah reboot, pastikan kernel yang sedang berjalan karena backport dapat memakai nomor versi berbeda.
- ✓Periksa pelacak keamanan distribusi untuk varian kernel dan paket yang tepat, bukan hanya membandingkan satu nomor versi upstream.
- ✓Jika pembaruan tertunda, evaluasi opsi terdokumentasi vendor untuk membatasi pembuatan user namespace tanpa hak istimewa; pastikan opsi itu tersedia dan uji dampaknya pada container serta aplikasi desktop.
- ✓Saat meninjau validasi vonis kernel, tolak bit parameter yang tidak didukung sebelum jalur packet hook dan uji konstanta yang diterima serta nilai positif yang tidak valid.