Root-sebezhetőség a Linux kernelben és szolgáltatásmegtagadás a systemd-ben

A Qualys biztonsági kutatói felfedték a Linux kernel és a systemd rendszerkezelőn érintett két sebezhetőség részleteit. A kernelben lévő sebezhetőség (CVE-2021-33909) lehetővé teszi, hogy egy helyi felhasználó root jogosultsággal kódot hajtson végre a mélyen beágyazott könyvtárak manipulálásával.

A sebezhetőség veszélyét fokozza, hogy a kutatóknak sikerült működő exploitokat készíteniük, amelyek az Ubuntu 20.04/20.10/21.04, Debian 11 és Fedora 34 alapértelmezett konfigurációjában is működnek. Megjegyzendő, hogy más disztribúciók nem lettek tesztelve, de elméletileg ők is érintettek lehetnek, így támadhatók. A teljes exploit kódját a probléma globális megszüntetése után ígérik közzé, de jelenleg csak egy korlátozott funkciójú prototípus érhető el, amely rendszerösszeomlást okoz. A probléma 2014 júliusa óta fennáll, és a 3.16 verziótól kezdődően érinti a kernel kiadásokat. A sebezhetőség javítása a közösséggel együttműködve történt, és július 19-én került be a kernelbe. A főbb disztribúciók már elkészítették a kernel csomagok frissítéseit (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

A sebezhetőség oka az, hogy a size_t int típusra való átkonvertálásának eredményét nem ellenőrzik, mielőtt a seq_file kódban végrehajtanák a műveleteket, amelyek fájlok létrehozását végzik rekordszekvenciákból. Az ellenőrzés hiánya túlcsorduláshoz vezethet a nagyon mély könyvtárszerkezet létrehozásakor, csatolásakor és törlésekor (a fájl elérési útja meghaladja az 1 GB-ot). Ennek következtében a támadó képes lehet egy 10 bájtos "//deleted" karakterláncot írni a "- 2 GB - 10 byte" eltolással, amely az előzőleg lefoglalt puffer előtti területet jelzi.

A készített exploit 5 GB memóriát és 1 millió szabad inode-ot igényel. Az exploit működése abban áll, hogy mkdir() hívással egy hierarchiát hoz létre körülbelül egymillió fészkelt könyvtárból, hogy elérje a fájl elérési útjának méretét, amely meghaladja az 1 GB-ot. Ezt a könyvtárat bind-mount segítségével egy külön felhasználói azonosító névtérben csatolják, majd az rmdir() funkciót elindítják a törléshez. Párhuzamosan egy szál, amely egy kis eBPF programot tölt be, úgy blokkolódik, hogy az eBPF pszeudokód ellenőrzése után, de a JIT fordítás előtt áll.

A felhasználói azonosítók nem privilegizált névtérben a fájl megnyitásra kerül a "/proc/self/mountinfo" helyen, és megkezdődik a bind-mount által csatolt könyvtár hosszú útvonalának olvasása, ami a "//deleted" sor írásához vezet a puffert megelőző területre. Az írás pozíciója olyan módon van kiválasztva, hogy felülírja az utasítást egy már ellenőrzött, de még nem lefordított eBPF programban.

Ezután az eBPF program szintjén az ellenőrizetlen pufferen kívüli írás controllálható olvasási és írási lehetőséggel alakul át más kernel struktúrákba a btf és a map_push_elem struktúrák manipulálása révén. Ennek eredményeként a kihasználás meghatározza a modprobe_path[] puffer helyét a kernel memóriájában, és felülírja benne az "\/sbin\/modprobe" utat, ami lehetővé teszi bármely végrehajtható fájl root jogosultsággal való indítását a request_module() hívás során, amely például a netlink socket létrehozásakor történik.

A kutatók több védelmi megkerülési módszert hoznak fel, amelyek csak az adott kihasználás ellen hatékonyak, de magát a problémát nem szüntetik meg. Javasolt a "\/proc\/sys\/kernel\/unprivileged_userns_clone" paramétert 0-ra állítani, hogy megakadályozzuk a könyvtárak csatolását a felhasználói azonosítók külön névterében, valamint a "\/proc\/sys\/kernel\/unprivileged_bpf_disabled"-t 1-re állítani, hogy megakadályozzuk az eBPF programok kernelbe való betöltését.

Érdekes módon, miközben egy alternatív támadási lehetőséget vizsgálnak, amely a bind-mount helyett a FUSE mechanizmus használatával történik egy nagy könyvtár csatolásához, a kutatók egy újabb sebezhetőségre (CVE-2021-33910) bukkantak, amely a systemd rendszermenedzserre vonatkozik. Kiderült, hogy a FUSE-en keresztüli könyvtár csatolási kísérletkor, amelynek az útvonal hossza meghaladja a 8 MB-t, a vezérlő folyamat (PID1) veremmemória kimerülése és összeomlás következik be, ami a rendszert "panic" állapotba hozza.

A probléma abból adódik, hogy a systemd nyomon követi és elemzi a /proc/self/mountinfo tartalmát, és feldolgozza minden egyes csatolási pontot az unit_name_path_escape() függvényben, ahol a strdupa() művelet végrehajtásra kerül, amely az adatokat a veremben helyezi el, nem pedig dinamikisan lefoglalt memóriában. Mivel a verem maximális mérete a RLIMIT_STACK révén korlátozott, a túl hosszú csatolási úttal való kezelés a PID1 folyamat összeomlását és a rendszer leállását okozza. A támadáshoz a legegyszerűbb FUSE modult lehet használni, kombinálva egy olyan mappa csatolási pontjával, amelynek mélysége meghaladja a 8 MB-ot.

A probléma a systemd 220 verziójától (2015 április) jelentkezik, már megoldották a systemd fő tárolójában, és javították a disztribúciókban (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Érdekes, hogy a systemd 248 kiadásában az exploit nem működik a systemd kódjában lévő hibának köszönhetően, ami a /proc/self/mountinfo feldolgozása során hibát okoz. Az is érdekes, hogy 2018-ban hasonló helyzet alakult ki, és a Linux kernel CVE-2018-14634 sérülékenységének exploit írásának kísérlete során a Qualys kutatói három kritikus sérülékenységre bukkantak a systemd-ben.

Forrás: opennet.ru

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster