Pagrindinis „Linux“ branduolio pažeidžiamumas ir „Systemd“ paslaugų atsisakymas

„Qualys“ saugumo tyrinėtojai atskleidė dviejų pažeidžiamumų, turinčių įtakos „Linux“ branduoliui ir sistemos tvarkytuvui, detales. Branduolio pažeidžiamumas (CVE-2021-33909) leidžia vietiniam vartotojui pasiekti kodo vykdymą su root teisėmis, manipuliuojant labai įdėtais katalogais.

Pažeidžiamumo pavojų didina tai, kad mokslininkai sugebėjo parengti darbinius išnaudojimus, kurie veikia Ubuntu 20.04/20.10/21.04, Debian 11 ir Fedora 34 pagal numatytąją konfigūraciją. Pažymima, kad kiti platinimai nebuvo išbandyti, tačiau teoriškai jie taip pat yra jautrūs problemai ir gali būti užpulti. Visą išnaudojimų kodą žadama paskelbti po to, kai visur bus pašalinta problema, tačiau kol kas pasiekiamas tik riboto funkcionalumo prototipas, dėl kurio sistema strigs. Problema egzistuoja nuo 2014 m. liepos mėn. ir paveikia branduolio leidimus nuo 3.16. Pažeidžiamumo taisymas buvo suderintas su bendruomene ir priimtas į branduolį liepos 19 d. Pagrindiniai platintojai jau sugeneravo savo branduolio paketų atnaujinimus (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Pažeidžiamumas atsiranda dėl to, kad nepavyko patikrinti size_t konvertavimo į int rezultato prieš atliekant operacijas seq_file kode, kuris sukuria failus iš įrašų sekos. Nepatikrinus, kuriant, jungiant ir ištrinant labai įdėtą katalogo struktūrą (kelio dydis didesnis nei 1 GB), buferyje gali būti rašoma už ribų. Dėl to užpuolikas gali pasiekti 10 baitų eilutę „//deleted“, parašytą „-2 GB – 10 baitų“ poslinkiu, nukreipiančiu į sritį prieš pat paskirtą buferį.

Parengtam išnaudojimui veikti reikia 5 GB atminties ir 1 milijono nemokamų inodų. Išnaudojimas veikia iškviečiant mkdir(), kad būtų sukurta maždaug milijono pakatalogių hierarchija, kad failo kelias būtų didesnis nei 1 GB. Šis katalogas sujungiamas naudojant bind-mount atskiroje vartotojo vardų erdvėje, po kurios paleidžiama funkcija rmdir () jį pašalinti. Lygiagrečiai sukuriama gija, kuri įkelia mažą eBPF programą, kuri užblokuojama patikrinus eBPF pseudokodą, bet prieš JIT kompiliavimą.

Neprivilegijuotoje vartotojo ID vardų erdvėje atidaromas failas /proc/self/mountinfo ir nuskaitomas ilgas surišto katalogo kelio pavadinimas, todėl eilutė „//deleted“ įrašoma į sritį prieš buferio pradžią. Eilutės rašymo padėtis parenkama taip, kad ji perrašytų nurodymą jau patikrintoje, bet dar nesukompiliuotoje eBPF programoje.

Toliau eBPF programos lygiu nekontroliuojamas buferio įrašymas paverčiamas kontroliuojamu gebėjimu skaityti ir rašyti į kitas branduolio struktūras, manipuliuojant btf ir map_push_elem struktūromis. Dėl to išnaudojimas nustato modprobe_path[] buferio vietą branduolio atmintyje ir perrašo joje esantį kelią „/sbin/modprobe“, o tai leidžia inicijuoti bet kurio vykdomojo failo su root teisėmis paleidimą tuo atveju. request_module() iškvietimas, kuris vykdomas, pavyzdžiui, kuriant tinklo sąsajos lizdą.

Tyrėjai pateikia keletą sprendimų, kurie yra veiksmingi tik konkrečiam išnaudojimui, tačiau nepašalina pačios problemos. Rekomenduojama nustatyti „/proc/sys/kernel/unprivileged_userns_clone“ į 0, kad išjungtumėte katalogų prijungimą atskiroje vartotojo ID vardų srityje, o „/proc/sys/kernel/unprivileged_bpf_disabled“ – į 1, kad būtų išjungtas eBPF programų įkėlimas į branduolį.

Pastebėtina, kad analizuodami alternatyvią ataką, apimančią FUSE mechanizmo naudojimą, o ne surišimo piliakalnį, skirtą dideliam katalogui pritvirtinti, mokslininkai aptiko kitą pažeidžiamumą (CVE-2021-33910), turintį įtakos sistemos tvarkytuvui. Paaiškėjo, kad bandant per FUSE prijungti katalogą, kurio kelio dydis viršija 8 MB, valdymo inicijavimo procese (PID1) pritrūksta krūvos atminties ir jis sugenda, todėl sistema patenka į „panikos“ būseną.

Problema ta, kad systemd seka ir analizuoja /proc/self/mountinfo turinį ir apdoroja kiekvieną prijungimo tašką naudojant unit_name_path_escape() funkciją, kuri atlieka strdupa() operaciją, kuri įdeda duomenis į krūvą, o ne į dinamiškai paskirstytą atmintį. . Kadangi maksimalus dėklo dydis ribojamas naudojant RLIMIT_STACK, apdorojant per didelį kelią iki prijungimo taško PID1 procesas sugenda ir sistema sustabdoma. Atakai galite naudoti paprasčiausią FUSE modulį kartu su labai įdėtu katalogu kaip prijungimo tašku, kurio kelio dydis viršija 8 MB.

Problema atsirado nuo systemd 220 (2015 m. balandžio mėn.), jau buvo ištaisyta pagrindinėje systemd saugykloje ir ištaisyta paskirstymuose (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Pažymėtina, kad 248 systemd leidime išnaudojimas neveikia dėl sistemos kodo klaidos, dėl kurios nepavyksta apdoroti /proc/self/mountinfo. Įdomu ir tai, kad 2018 metais susiklostė panaši situacija ir bandydami įrašyti „Linux“ branduolio CVE-2018-14634 pažeidžiamumo išnaudojimą, „Qualys“ tyrėjai aptiko tris kritinius „systemd“ pažeidžiamumus.

Šaltinis: opennet.ru

Добавить комментарий