Root-kwetsberens yn 'e Linux-kernel en ûntkenning fan tsjinst yn systemd

Feiligensûndersikers fan Qualys hawwe details iepenbiere fan twa kwetsberens dy't de Linux-kernel en de systemd-systeembehearder beynfloedzje. In kwetsberens yn 'e kernel (CVE-2021-33909) lit in lokale brûker koade-útfiering berikke mei root-rjochten troch manipulaasje fan heul nestele mappen.

It gefaar fan 'e kwetsberens wurdt fergrutte troch it feit dat de ûndersikers wurkjende eksploaten tariede kinne dy't wurkje op Ubuntu 20.04/20.10/21.04, Debian 11 en Fedora 34 yn 'e standertkonfiguraasje. It wurdt opmurken dat oare distribúsjes binne net hifke, mar binne teoretysk ek gefoelich foar it probleem en kin wurde oanfallen. De folsleine koade fan 'e eksploaten wurdt tasein publisearre nei't it probleem oeral eliminearre is, mar foar no is allinich in prototype fan beheinde funksjonaliteit beskikber, wêrtroch it systeem crasht. It probleem is oanwêzich sûnt july 2014 en hat ynfloed op kernel-releases fanôf 3.16. De kwetsberensfix waard koördinearre mei de mienskip en akseptearre yn 'e kernel op july 19th. De haaddistribúsjes hawwe al updates oanmakke foar har kernelpakketten (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

De kwetsberens wurdt feroarsake troch it net kontrolearjen fan it resultaat fan in size_t nei int-konverzje foardat operaasjes wurde útfierd yn 'e seq_file-koade, dy't triemmen oanmakket út in folchoarder fan records. It net kontrolearjen kin resultearje yn skriuwt bûten grinzen nei de buffer by it oanmeitsjen, montearjen en wiskjen fan in tige geneste mapstruktuer (paadgrutte grutter as 1 GB). As gefolch, in oanfaller kin berikke in 10-byte string "//deleted" skreaun op in offset fan "-2 GB - 10 bytes" wiist op it gebiet direkt foarôfgeand oan de tawiisd buffer.

De tariede eksploitaasje fereasket 5 GB ûnthâld en 1 miljoen frije ynoden om te operearjen. De eksploitaasje wurket troch mkdir () op te roppen om in hiërargy te meitsjen fan sawat in miljoen submappen om in triempaadgrutte te berikken dy't grutter is as 1 GB. Dizze map wurdt monteard fia bind-mount yn in aparte brûkersnammeromte, wêrnei't de funksje rmdir () wurdt útfierd om it te ferwiderjen. Parallel wurdt in tried makke dy't in lyts eBPF-programma laadt, dat wurdt blokkearre op it poadium nei it kontrolearjen fan de eBPF-pseudokoade, mar foar syn JIT-kompilaasje.

Yn 'e net-befoarrjochte brûkersnammeromte wurdt it bestân /proc/self/mountinfo iepene en de lange paadnamme fan' e bind-mounted map wurdt lêzen, wat resulteart yn 'e tekenrige "//deleted" skreaun nei it gebiet foar it begjin fan 'e buffer. De posysje foar it skriuwen fan de rigel is sa keazen dat it de ynstruksje oerskriuwt yn it al hifke, mar noch net kompilearre eBPF-programma.

Folgjende, op it eBPF-programmanivo, wurdt ûnkontroleare skriuwen bûten buffer omfoarme ta kontrolearre fermogen om te lêzen en te skriuwen nei oare kernelstruktueren troch manipulaasje fan 'e btf- en map_push_elem-struktueren. As resultaat bepaalt de eksploitaasje de lokaasje fan 'e modprobe_path[]-buffer yn it kernel-ûnthâld en oerskriuwt it "/sbin/modprobe"-paad dêryn, wêrtroch jo de lansearring fan elke útfierbere triem mei rootrjochten kinne begjinne yn it gefal fan in request_module () call, dat wurdt útfierd, bygelyks, by it meitsjen fan netlink socket.

Undersikers jouwe ferskate oplossingen dy't allinich effektyf binne foar in spesifike eksploitaasje, mar eliminearje it probleem sels net. It is oan te rieden om "/proc/sys/kernel/unprivileged_userns_clone" op 0 yn te stellen om mounting-mappen út te skeakeljen yn in aparte brûkers-ID-nammeromte, en "/proc/sys/kernel/unprivileged_bpf_disabled" op 1 om it laden fan eBPF-programma's yn 'e kearn út te skeakeljen.

It is opmerklik dat by it analysearjen fan in alternative oanfal wêrby't it gebrûk fan 'e FUSE-meganisme is yn plak fan bind-terp om in grutte map te montearjen, de ûndersikers in oare kwetsberens (CVE-2021-33910) tsjinkamen dy't de systemd systeembehearder beynfloedzje. It die bliken dat as jo besykje te mount in map mei in paad grutte grutter dan 8 MB fia FUSE, de kontrôle inisjalisaasje proses (PID1) rint út stack ûnthâld en crashes, dy't set it systeem yn in "panyk" steat.

It probleem is dat systemd de ynhâld fan /proc/self/mountinfo folget en parseart, en elk berchpunt ferwurket yn 'e funksje unit_name_path_escape (), dy't in strdupa ()-operaasje útfiert dy't de gegevens op 'e stapel pleatst ynstee fan yn dynamysk tawiisd ûnthâld . Sûnt de maksimale stack grutte wurdt beheind fia RLIMIT_STACK, ferwurkjen te grut in paad nei it berch punt feroarsaket it PID1 proses te crashe en stopje it systeem. Foar in oanfal kinne jo de ienfâldichste FUSE-module brûke yn kombinaasje mei it brûken fan in tige nestele triemtafel as berchpunt, wêrfan it paadgrutte grutter is as 8 MB.

It probleem is sûnt systemd 220 (april 2015) ferskynd, is al fêst yn 'e haadsystemd repository en fêst yn distribúsjes (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Opmerklik, yn systemd release 248 wurket de eksploitaasje net troch in brek yn 'e systemd koade dy't feroarsaket dat de ferwurking fan /proc/self/mountinfo mislearret. It is ek nijsgjirrich dat yn 2018 in ferlykbere situaasje ûntstie en by it besykjen om in eksploitaasje te skriuwen foar de CVE-2018-14634 kwetsberens yn 'e Linux-kernel, Qualys-ûndersikers kamen oer trije krityske kwetsberens yn systemd.

Boarne: opennet.ru

Add a comment