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