FlawOpen

flawopen.com/Teardowns/cve-2024-1086-linux-netfilter-nftables-uaf

● CVE-2024-1086 · CVSS 7.8 · Tinggi
Riset Keamanan · FlawOpen

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.

💡 Penjelasan Sederhana (ELI5)

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_ACCEPT atau NF_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

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

Langkah 1

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.

Langkah 2

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.

Langkah 3

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.

Langkah 4

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

IMPLEMENTASI RENTAN
/* 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;
}
PERBAIKAN AMAN & KUAT
/* 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

Sumber