Root sérülékenység a Linux kernelben és szolgáltatásmegtagadás a systemd rendszerben

A Qualys biztonsági kutatói felfedték a Linux kernelt és a rendszerkezelőt érintő két sebezhetőség részleteit. A kernel egy biztonsági rése (CVE-2021-33909) lehetővé teszi a helyi felhasználók számára, hogy a nagymértékben beágyazott könyvtárak manipulálásával root jogokkal hajtsanak végre kódot.

A sérülékenység veszélyét növeli, hogy a kutatók olyan működő exploitokat tudtak készíteni, amelyek az Ubuntu 20.04/20.10/21.04, a Debian 11 és a Fedora 34 operációs rendszeren működnek az alapértelmezett konfigurációban. Megjegyzendő, hogy más disztribúciókat nem teszteltek, de elméletileg szintén érzékenyek a problémára, és megtámadhatók. Az ígéretek szerint az exploitok teljes kódját a probléma mindenhol megszüntetése után teszik közzé, de egyelőre csak egy korlátozott funkcionalitású prototípus érhető el, ami a rendszer összeomlását okozza. A probléma 2014 júliusa óta fennáll, és a 3.16-tól kezdődő kernelkiadásokat érinti. A sebezhetőség javítását a közösséggel egyeztették, és július 19-én elfogadták a kernelbe. A fő disztribúciók már generáltak frissítéseket kernelcsomagjaikhoz (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

A sérülékenységet az okozza, hogy nem sikerült ellenőrizni a size_t konvertálás eredményét az int formátummá, mielőtt a seq_file kóddal végrehajtana műveleteket, amely rekordok sorozatából hoz létre fájlokat. Az ellenőrzés elmulasztása határokon túli írásokat eredményezhet a pufferbe nagyon beágyazott könyvtárstruktúra létrehozásakor, csatlakoztatásakor és törlésekor (az elérési út mérete nagyobb, mint 1 GB). Ennek eredményeként a támadó egy 10 bájtos "//deleted" karakterláncot érhet el, amely "-2 GB - 10 bájt" eltolásban van írva, és a lefoglalt puffert közvetlenül megelőző területre mutat.

Az előkészített exploit működéséhez 5 GB memória és 1 millió szabad inode szükséges. Az exploit az mkdir() meghívásával mintegy egymillió alkönyvtárból álló hierarchiát hoz létre, hogy elérje az 1 GB-ot meghaladó fájl elérési utat. Ez a könyvtár a bind-mount paranccsal van felcsatolva egy külön felhasználói névtérben, majd az rmdir() függvény futtatásával eltávolítja. Ezzel párhuzamosan létrejön egy szál, amely betölt egy kis eBPF programot, amely blokkolva van az eBPF pszeudokód ellenőrzése után, de a JIT fordítása előtt.

A privileged userid névtérben megnyílik a /proc/self/mountinfo fájl, és beolvassa a bind-mounted könyvtár hosszú elérési útját, ami a "//deleted" karakterláncot a puffer indítása előtti területre írja. A sor írási pozícióját úgy választjuk meg, hogy az felülírja a már tesztelt, de még nem lefordított eBPF program utasítását.

Ezután az eBPF program szintjén a pufferen kívüli, ellenőrizetlen írást a btf és a map_push_elem struktúrák manipulálásával irányított képességgé alakítják át, hogy más kernelstruktúrákat olvassanak és írhassanak. Ennek eredményeként az exploit meghatározza a modprobe_path[] puffer helyét a kernelmemóriában, és felülírja a benne lévő „/sbin/modprobe” elérési utat, amely lehetővé teszi bármely root joggal rendelkező végrehajtható fájl elindítását, ha a rendszermag memóriájában található. request_module() hívás, amely például netlink socket létrehozásakor kerül végrehajtásra.

A kutatók számos olyan megoldást kínálnak, amelyek csak egy adott kizsákmányolás esetén hatékonyak, de magát a problémát nem szüntetik meg. Javasoljuk, hogy a „/proc/sys/kernel/unprivileged_userns_clone” értéket 0-ra állítsa a külön felhasználói azonosító névtérben lévő könyvtárak csatlakoztatásának letiltásához, és a „/proc/sys/kernel/unprivileged_bpf_disabled” értékét 1-re az eBPF programok kernelbe történő betöltésének letiltásához.

Figyelemre méltó, hogy egy alternatív támadás elemzése során a kutatók egy másik, a rendszerkezelőt érintő sérülékenységre (CVE-2021-33910) bukkantak a bind-hound helyett a FUSE mechanizmus használatával. Kiderült, hogy amikor egy 8 MB-ot meghaladó elérési útvonalú könyvtárat próbálnak felcsatolni FUSE-n keresztül, a vezérlés inicializálási folyamata (PID1) elfogy a veremmemória és összeomlik, ami „pánik” állapotba hozza a rendszert.

A probléma az, hogy a systemd nyomon követi és elemzi a /proc/self/mountinfo fájl tartalmát, és minden egyes csatolási pontot feldolgoz a unit_name_path_escape() függvényben, amely egy strdupa() műveletet hajt végre, amely az adatokat a verembe helyezi, nem pedig a dinamikusan lefoglalt memóriába. . Mivel a maximális veremméretet az RLIMIT_STACK korlátozza, a beillesztési ponthoz vezető túl nagy elérési út feldolgozása a PID1 folyamat összeomlását és a rendszer leállítását okozza. Támadáshoz használhatja a legegyszerűbb FUSE modult egy erősen beágyazott könyvtár beillesztési pontként való használatával, amelynek elérési útja meghaladja a 8 MB-ot.

A probléma a systemd 220 (2015. április) óta jelentkezik, a fő systemd repository-ban már kijavították, és a disztribúciókban (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch) már kijavították. Nevezetesen, a systemd 248-as kiadásban az exploit nem működik a systemd kód hibája miatt, amely a /proc/self/mountinfo feldolgozása meghiúsulását okozza. Az is érdekes, hogy 2018-ban hasonló helyzet állt elő, és amikor a CVE-2018-14634 sebezhetőségre próbáltak kizsákmányolni a Linux kernelben, a Qualys kutatói három kritikus sérülékenységre bukkantak a systemd-ben.

Forrás: opennet.ru

Hozzászólás