Kerentanan akar dalam kernel Linux dan penafian perkhidmatan dalam systemd

Penyelidik keselamatan dari Qualys telah mendedahkan butiran tentang dua kelemahan yang mempengaruhi kernel Linux dan pengurus sistem systemd. Kerentanan dalam kernel (CVE-2021-33909) membolehkan pengguna tempatan mencapai pelaksanaan kod dengan hak akar melalui manipulasi direktori bersarang tinggi.

Bahaya kerentanan itu diburukkan lagi oleh fakta bahawa para penyelidik dapat menyediakan eksploitasi kerja yang berfungsi pada Ubuntu 20.04/20.10/21.04, Debian 11 dan Fedora 34 dalam konfigurasi lalai. Adalah diperhatikan bahawa pengedaran lain belum diuji, tetapi secara teorinya juga terdedah kepada masalah dan boleh diserang. Kod penuh eksploitasi dijanjikan akan diterbitkan selepas masalah itu dihapuskan di mana-mana, tetapi buat masa ini hanya prototaip kefungsian terhad tersedia, menyebabkan sistem ranap. Masalahnya telah wujud sejak Julai 2014 dan menjejaskan keluaran kernel bermula dari 3.16. Pembetulan kerentanan telah diselaraskan dengan komuniti dan diterima ke dalam kernel pada 19 Julai. Pengedaran utama telah menjana kemas kini pada pakej kernel mereka (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Kerentanan ini disebabkan oleh kegagalan untuk menyemak hasil penukaran size_t kepada int sebelum menjalankan operasi dalam kod seq_file, yang mencipta fail daripada jujukan rekod. Kegagalan menyemak boleh mengakibatkan penulisan di luar sempadan kepada penimbal apabila membuat, memasang dan memadamkan struktur direktori yang sangat bersarang (saiz laluan lebih besar daripada 1 GB). Akibatnya, penyerang boleh mencapai rentetan 10-bait "//dipadamkan" yang ditulis pada offset "-2 GB - 10 bait" yang menunjuk ke kawasan sejurus sebelum penimbal yang diperuntukkan.

Eksploit yang disediakan memerlukan 5 GB memori dan 1 juta inod percuma untuk beroperasi. Eksploit berfungsi dengan memanggil mkdir() untuk mencipta hierarki kira-kira sejuta subdirektori untuk mencapai saiz laluan fail melebihi 1 GB. Direktori ini dipasang melalui bind-mount dalam ruang nama pengguna yang berasingan, selepas itu fungsi rmdir() dijalankan untuk mengeluarkannya. Secara selari, benang dibuat yang memuatkan program eBPF kecil, yang disekat pada peringkat selepas menyemak pseudokod eBPF, tetapi sebelum kompilasi JITnya.

Dalam ruang nama id pengguna yang tidak mempunyai keistimewaan, fail /proc/self/mountinfo dibuka dan nama laluan panjang direktori bind-mounted dibaca, menyebabkan rentetan "//deleted" ditulis ke kawasan sebelum permulaan penimbal. Kedudukan untuk menulis baris dipilih supaya ia menimpa arahan dalam program eBPF yang telah diuji tetapi belum lagi disusun.

Seterusnya, pada peringkat program eBPF, penulisan luar penimbal yang tidak terkawal diubah menjadi keupayaan terkawal untuk membaca dan menulis kepada struktur kernel lain melalui manipulasi struktur btf dan map_push_elem. Akibatnya, eksploitasi menentukan lokasi penimbal modprobe_path[] dalam memori kernel dan menimpa laluan "/sbin/modprobe" di dalamnya, yang membolehkan anda memulakan pelancaran mana-mana fail boleh laku dengan hak akar sekiranya berlaku request_module() call, yang dilaksanakan, sebagai contoh, semasa membuat soket netlink.

Penyelidik menyediakan beberapa penyelesaian yang berkesan hanya untuk eksploitasi tertentu, tetapi tidak menghapuskan masalah itu sendiri. Adalah disyorkan untuk menetapkan "/proc/sys/kernel/unprivileged_userns_clone" kepada 0 untuk melumpuhkan direktori pemasangan dalam ruang nama ID pengguna yang berasingan, dan "/proc/sys/kernel/unprivileged_bpf_disabled" kepada 1 untuk melumpuhkan memuatkan program eBPF ke dalam kernel.

Perlu diperhatikan bahawa semasa menganalisis serangan alternatif yang melibatkan penggunaan mekanisme FUSE dan bukannya bind-mound untuk memasang direktori yang besar, para penyelidik menemui satu lagi kelemahan (CVE-2021-33910) yang mempengaruhi pengurus sistem systemd. Ternyata apabila cuba melekapkan direktori dengan saiz laluan melebihi 8 MB melalui FUSE, proses permulaan kawalan (PID1) kehabisan memori tindanan dan ranap, yang meletakkan sistem dalam keadaan "panik".

Masalahnya ialah systemd menjejaki dan menghuraikan kandungan /proc/self/mountinfo, dan memproses setiap titik pelekap dalam fungsi unit_name_path_escape(), yang menjalankan operasi strdupa() yang meletakkan data pada tindanan dan bukannya dalam memori yang diperuntukkan secara dinamik . Memandangkan saiz tindanan maksimum dihadkan melalui RLIMIT_STACK, pemprosesan laluan yang terlalu besar ke titik pelekap menyebabkan proses PID1 ranap dan menghentikan sistem. Untuk serangan, anda boleh menggunakan modul FUSE yang paling mudah digabungkan dengan menggunakan direktori bersarang tinggi sebagai titik pelekap, saiz laluan yang melebihi 8 MB.

Masalahnya telah muncul sejak systemd 220 (April 2015), telah pun diperbaiki dalam repositori systemd utama dan ditetapkan dalam pengedaran (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Terutama, dalam keluaran systemd 248 eksploitasi tidak berfungsi kerana pepijat dalam kod systemd yang menyebabkan pemprosesan /proc/self/mountinfo gagal. Menarik juga bahawa pada tahun 2018, situasi yang sama timbul dan apabila cuba menulis eksploitasi untuk kerentanan CVE-2018-14634 dalam kernel Linux, penyelidik Qualys menemui tiga kelemahan kritikal dalam systemd.

Sumber: opennet.ru

Tambah komen