Wortelkwesbaarheid in die Linux-kern en ontkenning van diens in systemd

Sekuriteitsnavorsers van Qualys het besonderhede onthul van twee kwesbaarhede wat die Linux-kern en die systemd-stelselbestuurder raak. 'n Kwesbaarheid in die kern (CVE-2021-33909) stel 'n plaaslike gebruiker in staat om kode-uitvoering met wortelregte te bewerkstellig deur manipulasie van hoogs geneste dopgehou.

Die gevaar van die kwesbaarheid word vererger deur die feit dat die navorsers in staat was om werkende uitbuitings voor te berei wat op Ubuntu 20.04/20.10/21.04, Debian 11 en Fedora 34 in die verstekkonfigurasie werk. Daar word kennis geneem dat ander verspreidings nie getoets is nie, maar teoreties ook vatbaar is vir die probleem en aangeval kan word. Daar word belowe dat die volledige kode van die misbruik gepubliseer sal word nadat die probleem oral uitgeskakel is, maar vir nou is slegs 'n prototipe van beperkte funksionaliteit beskikbaar, wat veroorsaak dat die stelsel ineenstort. Die probleem is sedert Julie 2014 teenwoordig en raak kernvrystellings vanaf 3.16. Die kwesbaarheidoplossing is met die gemeenskap gekoördineer en op 19 Julie in die kern aanvaar. Die hoofverspreidings het reeds opdaterings vir hul kernpakkette gegenereer (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Die kwesbaarheid word veroorsaak deur die versuim om die resultaat van 'n size_t na int-omskakeling na te gaan voordat bewerkings in die seq_file-kode uitgevoer word, wat lêers uit 'n reeks rekords skep. Versuim om na te gaan, kan lei tot buite-grense skryfwerk na die buffer wanneer 'n baie geneste gidsstruktuur geskep, gemonteer en uitgevee word (padgrootte groter as 1 GB). As gevolg hiervan kan 'n aanvaller 'n 10-grepe-string "//deleted" kry wat geskryf is teen 'n offset van "-2 GB - 10 grepe" wat wys na die area onmiddellik voor die toegekende buffer.

Die voorbereide ontginning vereis 5 GB geheue en 1 miljoen gratis inodes om te werk. Die ontginning werk deur mkdir() te roep om 'n hiërargie van ongeveer 'n miljoen subgidse te skep om 'n lêerpadgrootte van meer as 1 GB te bereik. Hierdie gids word gemonteer via bind-mount in 'n aparte gebruiker naamruimte, waarna die rmdir() funksie uitgevoer word om dit te verwyder. In parallel word 'n draad geskep wat 'n klein eBPF-program laai, wat geblokkeer word op die stadium nadat die eBPF-pseudokode nagegaan is, maar voor die JIT-samestelling daarvan.

In die onbevoorregte gebruiker-id-naamspasie word die lêer /proc/self/mountinfo oopgemaak en die lang padnaam van die bind-gemonteerde gids word gelees, wat daartoe lei dat die string "//deleted" na die area voor die begin van die buffer geskryf word. Die posisie vir die skryf van die reël word so gekies dat dit die instruksie in die reeds getoetste maar nog nie saamgestelde eBPF-program oorskryf nie.

Vervolgens, op die eBPF-programvlak, word onbeheerde buite-bufferskryf getransformeer in beheerde vermoë om te lees en na ander kernstrukture te skryf deur manipulasie van die btf- en map_push_elem-strukture. Gevolglik bepaal die ontginning die ligging van die modprobe_path[]-buffer in kerngeheue en skryf die "/sbin/modprobe"-pad daarin oor, wat jou toelaat om die bekendstelling van enige uitvoerbare lêer met wortelregte te begin in die geval van 'n request_module() oproep, wat uitgevoer word, byvoorbeeld wanneer die skep van netlink-sok.

Navorsers verskaf verskeie oplossings wat slegs effektief is vir 'n spesifieke uitbuiting, maar nie die probleem self uitskakel nie. Dit word aanbeveel om "/proc/sys/kernel/unprivileged_userns_clone" op 0 te stel om monteergidse in 'n aparte gebruiker-ID-naamruimte te deaktiveer, en "/proc/sys/kernel/unprivileged_bpf_disabled" na 1 om die laai van eBPF-programme in die kern uit te skakel.

Dit is opmerklik dat, terwyl hulle 'n alternatiewe aanval ontleed het wat die gebruik van die FUSE-meganisme in plaas van bind-heuwel behels om 'n groot gids te monteer, die navorsers op 'n ander kwesbaarheid (CVE-2021-33910) afgekom het wat die systemd-stelselbestuurder raak. Dit het geblyk dat wanneer u probeer om 'n gids met 'n padgrootte van meer as 8 MB via FUSE te monteer, die beheerinitialiseringsproses (PID1) se stapelgeheue opraak en ineenstort, wat die stelsel in 'n "paniek"-toestand plaas.

Die probleem is dat systemd die inhoud van /proc/self/mountinfo naspoor en ontleed, en elke monteringspunt in die unit_name_path_escape()-funksie verwerk, wat 'n strdupa()-bewerking uitvoer wat die data op die stapel plaas eerder as in dinamies-toegewysde geheue . Aangesien die maksimum stapelgrootte beperk word via RLIMIT_STACK, veroorsaak die verwerking van 'n te groot pad na die bergpunt dat die PID1-proses ineenstort en die stelsel stop. Vir 'n aanval, kan jy die eenvoudigste FUSE-module gebruik in kombinasie met die gebruik van 'n hoogs geneste gids as 'n bergpunt, waarvan die padgrootte 8 MB oorskry.

Die probleem verskyn sedert systemd 220 (April 2015), is reeds reggestel in die hoof systemd-bewaarplek en reggestel in verspreidings (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Veral, in systemd-vrystelling 248 werk die ontginning nie as gevolg van 'n fout in die systemd-kode wat veroorsaak dat die verwerking van /proc/self/mountinfo misluk. Dit is ook interessant dat 'n soortgelyke situasie in 2018 ontstaan ​​het en toe hulle probeer het om 'n ontginning vir die CVE-2018-14634 kwesbaarheid in die Linux-kern te skryf, het Qualys-navorsers op drie kritieke kwesbaarhede in systemd afgekom.

Bron: opennet.ru

Voeg 'n opmerking