Linux yadrosida ildiz zaifligi va systemd da xizmat ko'rsatishni rad etish

Qualys xavfsizlik tadqiqotchilari Linux yadrosi va tizim boshqaruvchisiga ta'sir qiluvchi ikkita zaiflik tafsilotlarini aniqladilar. Yadrodagi zaiflik (CVE-2021-33909) mahalliy foydalanuvchiga yuqori darajada joylashtirilgan kataloglarni manipulyatsiya qilish orqali ildiz huquqlari bilan kod bajarilishiga erishish imkonini beradi.

Zaiflikning xavfi tadqiqotchilar Ubuntu 20.04/20.10/21.04, Debian 11 va Fedora 34 da standart konfiguratsiyada ishlaydigan ishchi ekspluatatsiyalarni tayyorlashga muvaffaq bo'lganligi bilan kuchayadi. Ta'kidlanishicha, boshqa tarqatishlar sinovdan o'tkazilmagan, ammo nazariy jihatdan ham muammoga sezgir va hujumga uchragan bo'lishi mumkin. Ekspluatatsiyalarning to'liq kodi muammo hamma joyda bartaraf etilgandan keyin nashr etilishi va'da qilingan, ammo hozircha faqat cheklangan funksionallik prototipi mavjud, bu esa tizimning ishdan chiqishiga olib keladi. Muammo 2014 yil iyul oyidan beri mavjud bo'lib, 3.16 dan boshlab yadro relizlariga ta'sir qiladi. Zaiflikni tuzatish hamjamiyat bilan muvofiqlashtirildi va 19 iyul kuni yadroga qabul qilindi. Asosiy tarqatishlar allaqachon yadro paketlariga yangilanishlarni yaratgan (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Zaiflik, qaydlar ketma-ketligidan fayllarni yaratuvchi seq_file kodida operatsiyalarni bajarishdan oldin size_t dan intga o'tkazish natijasini tekshirib ko'rmaslik tufayli yuzaga keladi. Tekshirilmasa, juda o'rnatilgan katalog tuzilmasini yaratish, o'rnatish va o'chirishda (yo'l hajmi 1 GB dan katta) buferga chegaradan tashqari yozishga olib kelishi mumkin. Natijada, tajovuzkor ajratilgan buferdan oldingi maydonga ishora qiluvchi "-10 GB - 2 bayt" ofsetida yozilgan 10 baytli "//deleted" qatoriga erishishi mumkin.

Tayyorlangan ekspluatatsiya ishlashi uchun 5 Gb xotira va 1 million bo'sh inode kerak bo'ladi. Ekspluatatsiya mkdir() ga qo'ng'iroq qilish orqali ishlaydi va fayl yo'li hajmi 1 Gb dan oshadi. Ushbu katalog bind-mount orqali alohida foydalanuvchi nomi maydoniga o'rnatiladi, shundan so'ng uni olib tashlash uchun rmdir() funksiyasi ishga tushiriladi. Bunga parallel ravishda, kichik eBPF dasturini yuklaydigan ip yaratiladi, u eBPF psevdokodini tekshirish bosqichida, lekin JIT kompilyatsiyasidan oldin bloklanadi.

Imtiyozsiz foydalanuvchi nomi maydonida /proc/self/mountinfo fayli ochiladi va bog'langan katalogning uzun yo'l nomi o'qiladi, natijada bufer boshlanishidan oldingi maydonga "//deleted" qatori yoziladi. Chiziqni yozish pozitsiyasi allaqachon sinovdan o'tgan, ammo hali tuzilmagan eBPF dasturidagi ko'rsatmalarni qayta yozishi uchun tanlangan.

Keyinchalik, eBPF dasturi darajasida nazoratsiz buferdan tashqari yozish btf va map_push_elem tuzilmalarini manipulyatsiya qilish orqali boshqa yadro tuzilmalariga o'qish va yozish uchun boshqariladigan qobiliyatga aylantiriladi. Natijada, ekspluatatsiya modprobe_path[] buferining yadro xotirasidagi joylashuvini aniqlaydi va undagi “/sbin/modprobe” yo‘lini qayta yozadi, bu sizga ildiz huquqlariga ega har qanday bajariladigan faylni ishga tushirishni boshlash imkonini beradi. request_module() chaqiruvi, masalan, netlink soketini yaratishda bajariladi.

Tadqiqotchilar faqat ma'lum bir ekspluatatsiya uchun samarali bo'lgan bir nechta vaqtinchalik echimlarni taqdim etadilar, ammo muammoning o'zini yo'q qilmaydi. Alohida foydalanuvchi identifikatori nom maydonida kataloglarni o'rnatishni o'chirish uchun "/proc/sys/kernel/unprivileged_userns_clone" ni 0 ga, yadroga eBPF dasturlarini yuklashni o'chirish uchun esa "/proc/sys/kernel/unprivileged_bpf_disabled" ni 1 ga o'rnatish tavsiya etiladi.

Shunisi e'tiborga loyiqki, katta katalogni o'rnatish uchun bog'lash o'rniga FUSE mexanizmidan foydalanishni o'z ichiga olgan muqobil hujumni tahlil qilishda tadqiqotchilar tizimli tizim menejeriga ta'sir qiluvchi yana bir zaiflikka (CVE-2021-33910) duch kelishdi. Ma'lum bo'lishicha, FUSE orqali yo'l hajmi 8 MB dan ortiq bo'lgan katalogni o'rnatishga urinayotganda, boshqaruvni ishga tushirish jarayoni (PID1) stek xotirasi tugaydi va bu tizimni "vahima" holatiga olib keladi.

Muammo shundaki, systemd /proc/self/mountinfo tarkibini kuzatib boradi va tahlil qiladi va har bir o'rnatish nuqtasini unit_name_path_escape() funksiyasida qayta ishlaydi, bu esa ma'lumotlarni dinamik ravishda ajratilgan xotiraga emas, balki stekga joylashtiradigan strdupa() operatsiyasini bajaradi. . Maksimal stek hajmi RLIMIT_STACK orqali cheklanganligi sababli, o'rnatish nuqtasiga juda katta yo'lni qayta ishlash PID1 jarayonining ishdan chiqishiga va tizimni to'xtatishga olib keladi. Hujum uchun siz eng oddiy FUSE modulini o'rnatish nuqtasi sifatida yo'l hajmi 8 MB dan oshadigan yuqori o'rnatilgan katalogdan foydalanish bilan birgalikda ishlatishingiz mumkin.

Muammo systemd 220 (2015 yil aprel) dan beri paydo bo'ldi, allaqachon asosiy tizim omborida tuzatilgan va tarqatishlarda (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch) tuzatilgan. Shunisi e'tiborga loyiqki, systemd 248-versiyasida ekspluatatsiya /proc/self/mountinfo-ni qayta ishlashga olib keladigan tizim kodidagi xatolik tufayli ishlamaydi. Shunisi qiziqki, 2018-yilda ham xuddi shunday holat yuzaga keldi va Linux yadrosida CVE-2018-14634 zaifligi uchun ekspluatatsiya yozishga urinayotganda Qualys tadqiqotchilari systemd’da uchta muhim zaiflikka duch kelishdi.

Manba: opennet.ru

a Izoh qo'shish