Saknes ievainojamība Linux kodolā un pakalpojuma atteikums sistēmād

DroŔības pētnieki no Qualys ir atklājuÅ”i sÄ«kāku informāciju par divām ievainojamÄ«bām, kas ietekmē Linux kodolu un sistēmas sistēmas pārvaldnieku. Kodola ievainojamÄ«ba (CVE-2021-33909) ļauj vietējam lietotājam panākt koda izpildi ar saknes tiesÄ«bām, manipulējot ar ļoti ligzdotiem direktorijiem.

IevainojamÄ«bas bÄ«stamÄ«bu pastiprina fakts, ka pētnieki varēja sagatavot darba izlietojumus, kas darbojas Ubuntu 20.04/20.10/21.04, Debian 11 un Fedora 34 noklusējuma konfigurācijā. Tiek atzÄ«mēts, ka citi izplatÄ«jumi nav pārbaudÄ«ti, taču teorētiski tie ir arÄ« jutÄ«gi pret problēmu un var tikt uzbrukti. Pilnu eksploitu kodu sola publicēt pēc tam, kad problēma visur bÅ«s novērsta, taču pagaidām pieejams tikai ierobežotas funkcionalitātes prototips, izraisot sistēmas avāriju. Problēma pastāv kopÅ” 2014. gada jÅ«lija un ietekmē kodola izlaidumus, sākot no 3.16. IevainojamÄ«bas labojums tika saskaņots ar kopienu un pieņemts kodolā 19. jÅ«lijā. Galvenie izplatÄ«jumi jau ir Ä£enerējuÅ”i savu kodola pakotņu atjauninājumus (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

IevainojamÄ«bu izraisa nespēja pārbaudÄ«t size_t konvertÄ“Å”anas uz int rezultātu pirms darbÄ«bu veikÅ”anas kodā seq_file, kas izveido failus no ierakstu secÄ«bas. Ja to nepārbaudÄ«sit, buferÄ« var tikt ierakstÄ«ts ārpus robežām, veidojot, pievienojot un dzÄ“Å”ot ļoti ligzdotu direktoriju struktÅ«ru (ceļa lielums ir lielāks par 1 GB). Rezultātā uzbrucējs var iegÅ«t 10 baitu virkni "//deleted", kas rakstÄ«ta ar nobÄ«di "-2 GB - 10 baiti", kas norāda uz apgabalu tieÅ”i pirms pieŔķirtā bufera.

Sagatavotajam eksplotam ir nepiecieÅ”ami 5 GB atmiņas un 1 miljons bezmaksas inodes. Ekspluatācija darbojas, izsaucot mkdir(), lai izveidotu aptuveni miljona apakÅ”direktoriju hierarhiju, lai sasniegtu faila ceļa lielumu, kas pārsniedz 1 GB. Å is direktorijs tiek montēts, izmantojot bind-mount, atseviŔķā lietotāja vārdu telpā, pēc kura tiek palaista funkcija rmdir (), lai to noņemtu. Paralēli tiek izveidots pavediens, kas ielādē nelielu eBPF programmu, kas tiek bloķēta stadijā pēc eBPF pseidokoda pārbaudes, bet pirms tā JIT kompilācijas.

Nepriviliģētajā lietotāja ID nosaukumvietā tiek atvērts fails /proc/self/mountinfo un tiek nolasÄ«ts saistāmā direktorija garais ceļa nosaukums, kā rezultātā virkne "//deleted" tiek ierakstÄ«ta apgabalā pirms bufera sākuma. Rindas rakstÄ«Å”anas pozÄ«cija tiek izvēlēta tā, lai tā pārrakstÄ«tu instrukciju jau pārbaudÄ«tajā, bet vēl nesastādÄ«tajā eBPF programmā.

Tālāk eBPF programmas lÄ«menÄ« nekontrolēta ārpusbufera rakstÄ«Å”ana tiek pārveidota par kontrolētu spēju lasÄ«t un rakstÄ«t citās kodola struktÅ«rās, manipulējot ar btf un map_push_elem struktÅ«rām. Rezultātā ekspluatācija nosaka modprobe_path[] bufera atraÅ”anās vietu kodola atmiņā un pārraksta tajā esoÅ”o ceļu ā€œ/sbin/modprobeā€, kas ļauj uzsākt jebkura izpildāmā faila palaiÅ”anu ar saknes tiesÄ«bām request_module() izsaukums, kas tiek izpildÄ«ts, piemēram, veidojot tÄ«kla saites ligzdu.

Pētnieki piedāvā vairākus risinājumus, kas ir efektÄ«vi tikai konkrētai izmantoÅ”anai, bet nenovērÅ” paÅ”u problēmu. Ieteicams iestatÄ«t "/proc/sys/kernel/unprivileged_userns_clone" uz 0, lai atspējotu montāžas direktorijus atseviŔķā lietotāja ID nosaukumvietā, un "/proc/sys/kernel/unprivileged_bpf_disabled" uz 1, lai atspējotu eBPF programmu ielādi kodolā.

IevērÄ«bas cienÄ«gs ir fakts, ka, analizējot alternatÄ«vu uzbrukumu, kurā tika izmantots FUSE mehānisms, nevis saistÄ«Å”anas pilskalns, lai uzstādÄ«tu lielu direktoriju, pētnieki atklāja citu ievainojamÄ«bu (CVE-2021-33910), kas ietekmē sistēmas sistēmas pārvaldnieku. IzrādÄ«jās, ka mēģinot montēt direktoriju, kura ceļa izmērs pārsniedz 8 MB, izmantojot FUSE, vadÄ«bas inicializācijas procesam (PID1) pietrÅ«kst steka atmiņas un tas avarē, kas nostāda sistēmu ā€œpanikasā€ stāvoklÄ«.

Problēma ir tāda, ka systemd izseko un parsē /proc/self/mountinfo saturu un apstrādā katru pievienoÅ”anas punktu funkcijā unit_name_path_escape(), kas veic strdupa() darbÄ«bu, kas datus ievieto stekā, nevis dinamiski pieŔķirtajā atmiņā. . Tā kā maksimālais steka lielums ir ierobežots, izmantojot RLIMIT_STACK, pārāk liela ceļa apstrāde uz stiprinājuma punktu izraisa PID1 procesa avāriju un sistēmas apturÄ“Å”anu. Uzbrukumam varat izmantot vienkārŔāko FUSE moduli kopā ar ļoti ligzdotu direktoriju kā stiprinājuma punktu, kura ceļa izmērs pārsniedz 8 MB.

Problēma parādās kopÅ” Systemd 220 (2015. gada aprÄ«lis), jau ir novērsta galvenajā systemd repozitorijā un izplatÄ«jumos (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Konkrēti, 248. sistēmiskajā laidienā ekspluatācija nedarbojas sistēmas koda kļūdas dēļ, kas izraisa /proc/self/mountinfo apstrādes kļūmi. Interesanti ir arÄ« tas, ka 2018. gadā radās lÄ«dzÄ«ga situācija un, mēģinot rakstÄ«t Linux kodola ievainojamÄ«bas CVE-2018-14634 ekspluatāciju, Qualys pētnieki saskārās ar trim kritiskām ievainojamÄ«bām sistēmād.

Avots: opennet.ru

Pievieno komentāru