Erro ahultasuna Linux nukleoan eta zerbitzua ukatzea systemd-en

Qualys-eko segurtasun ikertzaileek Linux nukleoari eta systemd sistema-kudeatzaileari eragiten dioten bi ahultasunen xehetasunak azaldu dituzte. Nukleoko ahultasun batek (CVE-2021-33909) tokiko erabiltzaileari erro-eskubideekin kodea exekutatzeko aukera ematen dio oso habiaratu diren direktorioen manipulazioaren bidez.

Ahultasunaren arriskua areagotu egiten da ikertzaileek Ubuntu 20.04/20.10/21.04, Debian 11 eta Fedora 34 konfigurazio lehenetsian funtzionatzen duten lan-explotazioak prestatzeko gai izan zirelako. Kontuan izan da beste banaketa batzuk ez direla probatu, baina teorikoki ere arazoa jasan dezaketela eta eraso daitezkeela. Usteen kode osoa arazoa leku guztietan ezabatu ondoren argitaratuko dela agintzen da, baina oraingoz funtzionaltasun mugatuko prototipo bat baino ez dago eskuragarri, sistema huts egitea eraginez. Arazoa 2014ko uztailetik dago eta 3.16tik aurrera nukleoen kaleratzeak eragiten ditu. Ahultasun konponketa komunitatearekin koordinatu zen eta nukleoan onartu zen uztailaren 19an. Banaketa nagusiek beren nukleoen paketeen eguneraketak sortu dituzte dagoeneko (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Zaurgarritasuna size_t to int bihurketa baten emaitza ez egiaztatzeak eragiten du seq_file kodean eragiketak egin aurretik, erregistro-sekuentzia batetik fitxategiak sortzen dituena. Egiaztatu ezean, mugaz kanpoko idazketak eragin ditzake bufferean oso habiaratuta dagoen direktorio-egitura bat sortu, muntatu eta ezabatzean (bide-tamaina 1 GB baino handiagoa). Ondorioz, erasotzaileak 10 byteko kate bat lor dezake "//deleted" "-2 GB - 10 byte"-ko desplazamenduan idatzita esleitutako bufferaren aurreko eremura seinalatzen duena.

Prestatutako ustiapenak 5 GB memoria eta 1 milioi inodo libre behar ditu funtzionatzeko. Explotazioak mkdir() deituz funtzionatzen du milioi bat azpidirektorio inguruko hierarkia sortzeko, 1 GB baino gehiagoko fitxategi-bide-tamaina lortzeko. Direktorio hau bind-mount bidez muntatzen da erabiltzailearen izen-espazio bereizi batean, eta ondoren rmdir() funtzioa exekutatzen da kentzeko. Paraleloan, eBPF programa txiki bat kargatzen duen hari bat sortzen da, eta eBPF pseudokodea egiaztatu ondoren, baina JIT konpilatu aurretik blokeatzen dena.

Pribilegiorik gabeko erabiltzailearen ID izen-espazioan, /proc/self/mountinfo fitxategia irekitzen da eta lotura-muntatutako direktorioaren bide-izen luzea irakurtzen da, eta ondorioz, "//deleted" katea buffer-a hasi aurretik eremuan idatziko da. Lerroa idazteko posizioa aukeratzen da, dagoeneko probatu baina oraindik konpilatu gabeko eBPF programako instrukzioa gainidatzi dezan.

Ondoren, eBPF programa mailan, buffer-etik kanpo dagoen idazkera kontrolatu gabe kernel-egiturak irakurtzeko eta idazteko gaitasun kontrolatu bihurtzen da btf eta map_push_elem egituren manipulazioaren bidez. Ondorioz, ustiatzeak modprobe_path[] buffer-aren kokapena zehazten du nukleoaren memorian eta bertan "/sbin/modprobe" bidea gainidazten du, eta horri esker, erro-eskubideak dituen edozein fitxategi exekutagarrien abiarazte abiaraz dezakezu. request_module() deia, exekutatzen dena, adibidez, netlink socketa sortzean.

Ikertzaileek ustiapen zehatz baterako soilik eraginkorrak diren hainbat konponbide eskaintzen dituzte, baina ez dute arazoa bera kentzen. "/proc/sys/kernel/unprivileged_userns_clone" 0 ezartzea gomendatzen da erabiltzailearen ID bereizitako izen-espazio batean muntatzeko direktorioak desgaitzeko, eta "/proc/sys/kernel/unprivileged_bpf_disabled" 1ean eBPF programak nukleoan kargatzea desgaitzeko.

Nabarmentzekoa da direktorio handi bat muntatzeko FUSE mekanismoa erabiltzearen ordez bind-mound-aren ordez FUSE mekanismoa erabiltzean beste eraso bat aztertzen ari zirela, ikertzaileek sistemaren kudeatzaileari eragiten dion beste ahultasun bat topatu zutela (CVE-2021-33910). FUSE bidez 8 MB baino gehiagoko bide-tamaina duen direktorio bat muntatzen saiatzean, kontrolaren hasierako prozesua (PID1) pila-memoria agortu eta huts egiten du, eta horrek sistema "izua" egoeran jartzen du.

Arazoa da systemd-ek /proc/self/mountinfo-ren edukia jarraitu eta analizatzen duela, eta muntatze-puntu bakoitza prozesatzen duela unit_name_path_escape() funtzioan, zeinak strdupa() eragiketa bat egiten duela, datuak dinamikoki esleitutako memorian jarri beharrean pilan jartzen dituena. . Pila-tamaina maximoa RLIMIT_STACK bidez mugatuta dagoenez, muntatze punturako bide handiegia prozesatzeak PID1 prozesua huts egin eta sistema geldiarazten du. Eraso baterako, FUSE modulurik errazena erabil dezakezu muntaketa-puntu gisa habiaraturiko direktorio bat erabiltzearekin konbinatuta, bide-tamainak 8 MB gainditzen dituena.

Arazoa systemd 220tik (2015eko apirila) agertzen ari da, dagoeneko konpondu da systemd biltegi nagusian eta banaketetan (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Nabarmentzekoa, systemd bertsioan 248 ustiapenak ez du funtzionatzen /proc/self/mountinfo prozesatzea huts egiten duen systemd kodean akats baten ondorioz. Interesgarria da, halaber, 2018an, antzeko egoera bat sortu izana eta Linux nukleoan CVE-2018-14634 ahultasunerako ustiaketa bat idazten saiatzean, Qualys-eko ikertzaileek hiru ahultasun kritiko topatu zituzten systemd-en.

Iturria: opennet.ru

Gehitu iruzkin berria