Kritikus sebezhetőség a PolKitban, amely lehetővé teszi a root hozzáférést a legtöbb Linux disztribúcióban

A Qualys felfedezte a Polkit (korábban PolicyKit) rendszerkomponenssel kapcsolatos sebezhetőséget (CVE-2021-4034), amelyet a disztribúciók az alacsonyabb jogosultságú felhasználók által végrehajtandó, magasabb jogosultságot igénylő műveletek megszervezésére használnak. A sebezhetőség lehetővé teszi a nem jogosult helyi felhasználó számára, hogy felemelje jogosultságait root felhasználó szintre, és teljes ellenőrzést nyerjen a rendszer felett. A probléma kódneve PwnKit, és figyelemre méltó, hogy működő exploit készült, amely az alapértelmezett beállításokkal a legtöbb Linux disztribúcióban működik.

A probléma a PolKit részeként elérhető pkexec segédprogramban található, amelyet root SUID jelzéssel szállítanak, és amely parancsok más felhasználó jogosultságaival való végrehajtására szolgál a PolKit által meghatározott szabályok szerint. A pkexec parancssori argumentumainak hibás feldolgozása miatt a nem jogosult felhasználó megkerülhette az autentikációt, és elérhette a saját kódjának root jogosultságokkal való futtatását, függetlenül a hozzáférési szabályoktól. A támadáshoz nem számít, hogy milyen beállítások és korlátozások vannak a PolKitban, elegendő, ha a pkexec segédprogram végrehajtható fájljának beállították a root SUID jelzést.

A pkexec nem ellenőrzi a parancssori argumentumok (argc) helyességét, amelyeket a folyamat indításakor adtak át. A pkexec fejlesztői feltételezték, hogy az argv tömb első eleme mindig a folyamat neve (pkexec), míg a második vagy NULL értéket, vagy az pkexec által végrehajtandó parancs nevét tartalmazza. Mivel az argumentumszámlálót nem ellenőrizték az valódi tömbtartalomnak megfelelően, és arra számítottak, hogy mindig nagyobb 1-nél, ha üres argv tömböt adtak át a folyamatnak, amit az execve funkció engedélyez a Linuxban, a pkexec NULL-t értelmezte első argumentumként (a folyamat neve), és a tömbön kívüli memóriát következő tartalomként vette. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | … | argv[argc] | envp[0] | envp[1] | … | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| V V V V V V «program» «-option» NULL «value» «PATH=name» NULL

A probléma az, hogy az argv tömb után a memóriában az envp tömb szerepel, amely a környezeti változókat tartalmazza. Így, ha az argv tömb üres, a pkexec az első környezeti változó elemén keresztül nyeri ki az emelt jogú parancsra vonatkozó adatokat (az argv[1] azonos lesz az envp[0]-val), amelynek tartalmát egy támadó ellenőrizheti.

Miután megszerezte az argv[1] értékét, a pkexec megpróbálja a PATH-ban található fájl-útvonalakat figyelembe venni, hogy meghatározza a végrehajtható fájl teljes útvonalát, és visszajelzi a teljes útvonal sztring mutatóját az argv[1]-be, ami az első környezeti változó értékének felülírásához vezet, mivel az argv[1] azonos az envp[0]-val. Az első környezeti változó nevének manipulálásával egy támadó másik környezeti változó behelyettesítését végezheti a pkexec-ben, például behelyettesítheti az „LD_PRELOAD” környezeti változót, amely nem megengedett a suid programokban, és ezzel a folyamatba a saját megosztott könyvtárának betöltését szervezheti.

A működő exploitban a GCONV_PATH változó behelyettesítése történik, amely a karakterkódolás konvertáló könyvtárának útvonalát határozza meg, amely dinamikusan töltődik be a g_printerr() függvény hívásakor, amelyben az iconv_open() használatban van. A GCONV_PATH útvonalának felülírásával a támadó elérheti, hogy ne az alapértelmezett iconv könyvtár, hanem a saját könyvtára töltődjön be, amelynek kezelőit a hibaüzenet kiírásakor hajtják végre, amikor a pkexec még root jogokkal fut, és még a jogosultságok ellenőrzése előtt.

Megjegyzendő, hogy noha a probléma a memória sérüléséből adódik, megbízhatóan és folyamatosan kihasználható függetlenül a használt hardverarchitektúrától. Az előkészített exploit sikeresen tesztelésre került Ubuntu, Debian, Fedora és CentOS rendszereken, de más disztribúciókban is használható. Az eredeti exploit egyelőre nem elérhető nyilvánosan, ami arra utal, hogy triviális, és könnyen rekonstruálható más kutatók által, ezért több felhasználós rendszereken fontos, hogy minél előbb telepítse a javító frissítést. A Polkit BSD rendszerekre és Solarisra is elérhető, de a kihasználás lehetőségét ezekben nem vizsgálták. Csak annyi ismert, hogy az OpenBSD-n nem lehet végrehajtani a támadást, mivel az OpenBSD magja nem engedi meg az execve() hívásakor a null értékű argc átadását.

A probléma 2009 májusától létezik, a pkexec parancs bevezetésének óta. A PolKit sebezhetőség javítása egyelőre patch formájában érhető el (javító kiadás nem készült), de mivel a disztribúciók fejlesztőit előzetesen értesítették a problémáról, legtöbb disztribúció egyszerre tette közzé a frissítést a sebezhetőség nyilvánosságra hozatalával. A probléma elhárítva lett a RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux és Manjaro disztribúcióknál. Ideiglenes intézkedésként a sebezhetőség blokkolására eltávolíthatja a SUID root jelzőt a /usr/bin/pkexec programról ("chmod 0755 /usr/bin/pkexec").



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