Kerentanan root di kernel Linux dan penolakan layanan di systemd

Peneliti keamanan dari Qualys telah mengungkapkan rincian dua kerentanan yang mempengaruhi kernel Linux dan manajer sistem systemd. Kerentanan pada kernel (CVE-2021-33909) memungkinkan pengguna lokal mencapai eksekusi kode dengan hak root melalui manipulasi direktori yang sangat bertingkat.

Bahaya kerentanan ini diperburuk oleh fakta bahwa para peneliti mampu menyiapkan eksploitasi kerja yang bekerja pada Ubuntu 20.04/20.10/21.04, Debian 11 dan Fedora 34 dalam konfigurasi default. Perlu dicatat bahwa distribusi lain belum diuji, tetapi secara teoritis juga rentan terhadap masalah dan dapat diserang. Kode lengkap dari eksploitasi dijanjikan akan dipublikasikan setelah masalah teratasi di mana-mana, tetapi untuk saat ini hanya tersedia prototipe fungsionalitas terbatas, yang menyebabkan sistem mogok. Masalah ini telah terjadi sejak Juli 2014 dan mempengaruhi rilis kernel mulai dari 3.16. Perbaikan kerentanan dikoordinasikan dengan komunitas dan diterima di kernel pada 19 Juli. Distribusi utama telah menghasilkan pembaruan untuk paket kernel mereka (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Kerentanan ini disebabkan oleh kegagalan memeriksa hasil konversi size_t ke int sebelum melakukan operasi dalam kode seq_file, yang membuat file dari urutan catatan. Kegagalan untuk memeriksa dapat mengakibatkan penulisan di luar batas ke buffer saat membuat, memasang, dan menghapus struktur direktori yang sangat bertumpuk (ukuran jalur lebih besar dari 1 GB). Akibatnya, penyerang dapat memperoleh string 10-byte "//deleted" yang ditulis dengan offset "-2 GB - 10 bytes" yang menunjuk ke area tepat sebelum buffer yang dialokasikan.

Eksploitasi yang disiapkan memerlukan memori 5 GB dan 1 juta inode gratis untuk beroperasi. Eksploitasi ini bekerja dengan memanggil mkdir() untuk membuat hierarki sekitar satu juta subdirektori untuk mencapai ukuran jalur file melebihi 1 GB. Direktori ini dipasang melalui bind-mount di namespace pengguna terpisah, setelah itu fungsi rmdir() dijalankan untuk menghapusnya. Secara paralel, utas dibuat yang memuat program eBPF kecil, yang diblokir pada tahap setelah memeriksa kodesemu eBPF, tetapi sebelum kompilasi JIT-nya.

Dalam namespace userid yang tidak memiliki hak istimewa, file /proc/self/mountinfo dibuka dan nama jalur panjang dari direktori yang diikat diikat dibaca, sehingga string "//deleted" ditulis ke area sebelum dimulainya buffer. Posisi penulisan baris dipilih sedemikian rupa sehingga menimpa instruksi pada program eBPF yang sudah diuji tetapi belum dikompilasi.

Selanjutnya, pada tingkat program eBPF, penulisan out-of-buffer yang tidak terkontrol diubah menjadi kemampuan terkontrol untuk membaca dan menulis ke struktur kernel lain melalui manipulasi struktur btf dan map_push_elem. Akibatnya, eksploitasi menentukan lokasi buffer modprobe_path[] di memori kernel dan menimpa jalur “/sbin/modprobe” di dalamnya, yang memungkinkan Anda untuk memulai peluncuran file apa pun yang dapat dieksekusi dengan hak root jika terjadi a panggilan request_module(), yang dijalankan, misalnya, saat membuat soket netlink.

Para peneliti memberikan beberapa solusi yang hanya efektif untuk eksploitasi tertentu, namun tidak menghilangkan masalah itu sendiri. Disarankan untuk menyetel "/proc/sys/kernel/unprivileged_userns_clone" ke 0 untuk menonaktifkan direktori pemasangan di namespace ID pengguna terpisah, dan "/proc/sys/kernel/unprivileged_bpf_disabled" ke 1 untuk menonaktifkan pemuatan program eBPF ke dalam kernel.

Patut dicatat bahwa saat menganalisis serangan alternatif yang melibatkan penggunaan mekanisme FUSE alih-alih bind-mound untuk memasang direktori besar, para peneliti menemukan kerentanan lain (CVE-2021-33910) yang memengaruhi manajer sistem systemd. Ternyata ketika mencoba memasang direktori dengan ukuran jalur melebihi 8 MB melalui FUSE, proses inisialisasi kontrol (PID1) kehabisan memori tumpukan dan crash, yang membuat sistem berada dalam keadaan “panik”.

Masalahnya adalah systemd melacak dan mem-parsing konten /proc/self/mountinfo, dan memproses setiap titik pemasangan di fungsi unit_name_path_escape(), yang melakukan operasi strdupa() yang menempatkan data di tumpukan, bukan di memori yang dialokasikan secara dinamis . Karena ukuran tumpukan maksimum dibatasi melalui RLIMIT_STACK, memproses jalur yang terlalu besar ke titik pemasangan menyebabkan proses PID1 terhenti dan menghentikan sistem. Untuk serangan, Anda dapat menggunakan modul FUSE paling sederhana yang dikombinasikan dengan penggunaan direktori sangat bersarang sebagai titik pemasangan, yang ukuran jalurnya melebihi 8 MB.

Masalahnya telah muncul sejak systemd 220 (April 2015), telah diperbaiki di repositori systemd utama dan diperbaiki di distribusi (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Khususnya, pada systemd rilis 248, eksploitasi tidak berfungsi karena adanya bug pada kode systemd yang menyebabkan pemrosesan /proc/self/mountinfo gagal. Menarik juga bahwa pada tahun 2018, situasi serupa muncul dan ketika mencoba menulis eksploitasi untuk kerentanan CVE-2018-14634 di kernel Linux, peneliti Qualys menemukan tiga kerentanan kritis di systemd.

Sumber: opennet.ru

Tambah komentar