A PolKit kritikus sérülékenysége, amely lehetővé teszi a root hozzáférést a legtöbb Linux disztribúción

A Qualys biztonsági rést (CVE-2021-4034) azonosított a disztribúciókban használt Polkit (korábban PolicyKit) rendszerösszetevőben, amely lehetővé teszi a jogosulatlan felhasználók számára, hogy emelt szintű hozzáférési jogokat igénylő műveleteket hajtsanak végre. A sérülékenység lehetővé teszi a jogosulatlan helyi felhasználók számára, hogy a root jogosultságokat kiterjesszék, és teljes irányítást szerezzenek a rendszer felett. A probléma kódneve PwnKit volt, és egy működő exploit létrehozásáról nevezetes, amely a legtöbb Linux disztribúción az alapértelmezett konfigurációban fut.

A probléma a PolKit pkexec segédprogramjában van, amely a SUID gyökér jelzővel érkezik, és úgy van kialakítva, hogy parancsokat futtasson egy másik felhasználó jogosultságaival a megadott PolKit szabályok szerint. A pkexec-nek átadott parancssori argumentumok helytelen kezelése miatt a jogosulatlan felhasználók megkerülhetik a hitelesítést, és rootként futtathatják a kódjukat, függetlenül a beállított hozzáférési szabályoktól. Támadás esetén nem mindegy, hogy milyen beállításokat és korlátozásokat adunk meg a PolKitben, elég, ha a SUID root attribútumot beállítjuk a végrehajtható fájlhoz a pkexec segédprogrammal.

A Pkexec nem ellenőrzi a folyamat indításakor átadott parancssori argumentumszám (argc) érvényességét. A pkexec fejlesztői abból indultak ki, hogy az argv tömb első bejegyzése mindig a folyamat nevét tartalmazza (pkexec), a második pedig egy NULL értéket vagy a pkexec-en keresztül elindított parancs nevét. Mivel az argumentumok számát nem ellenőrizték a tömb tényleges tartalmához képest, és mindig 1-nél nagyobbnak tételezték fel, ha egy folyamat üres argv tömböt adott át, ahogy azt a Linux execve függvénye lehetővé teszi, a pkexec a NULL értéket kezeli első argumentumként ( a folyamat neve) és a következő argumentumként. a puffermemórián kívül, mint a tömb későbbi tartalma. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-opció" NULL "érték" "PATH=név" NULL

A probléma az, hogy az argv tömb után van egy envp tömb a memóriában, amely környezeti változókat tartalmaz. Így ha az argv tömb üres, a pkexec a megemelt jogosultságokkal futtatott parancsra vonatkozó adatokat a környezeti változókkal rendelkező tömb első eleméből kinyeri (argv[1] azonos lett az envp[0]-val), melynek tartalma szabályozható. a támadó által.

Miután megkapta az argv[1] értékét, a pkexec a PATH fájl elérési útjait figyelembe véve megpróbálja meghatározni a végrehajtható fájl teljes elérési útját, és egy mutatót ír a karakterláncra, amelynek teljes elérési útja vissza az argv[1]-be, ami az első környezeti változó értékének felülírásához vezet, mivel az argv[1] megegyezik az envp[0]-val. Az első környezeti változó nevének manipulálásával a támadó egy másik környezeti változót helyettesíthet a pkexecben, például behelyettesítheti az „LD_PRELOAD” környezeti változót, ami nem megengedett a suid programokban, és gondoskodhat arról, hogy a megosztott könyvtáruk betöltődik a folyamat.

A működő exploit magában foglalja a GCONV_PATH változó helyettesítését, amely a szimbólum átkódoló könyvtár elérési útjának meghatározására szolgál, és dinamikusan betöltődik a g_printerr() függvény meghívásakor, amelynek kódja az iconv_open() függvényt használja. Az elérési út újradefiniálásával a GCONV_PATH-ban a támadó megbizonyosodhat arról, hogy nem a szabványos iconv könyvtár töltődik be, hanem a saját könyvtára, amelyből a kezelők végrehajtásra kerülnek, ha hibaüzenet jelenik meg abban a szakaszban, amikor a pkexec még fut root jogok és az indítási engedélyek ellenőrzése.

Meg kell jegyezni, hogy annak ellenére, hogy a problémát a memória sérülése okozza, a használt hardver architektúrától függetlenül megbízhatóan és ismételhetően kihasználható. Az elkészített exploit sikeresen tesztelve Ubuntu, Debian, Fedora és CentOS rendszereken, de más disztribúciókon is használható. Az eredeti exploit még nem elérhető nyilvánosan, ami azt jelzi, hogy triviális, és más kutatók számára könnyen újraalkotható, ezért fontos, hogy a többfelhasználós rendszereken minél hamarabb telepítsük a javításfrissítést. A Polkit elérhető BSD-rendszerekhez és Solaris-hoz is, de azokon való felhasználást nem vizsgálták. Ismeretes, hogy a támadás nem hajtható végre OpenBSD-n, mivel az OpenBSD kernel nem engedi át null argc értékét az execve() meghívásakor.

A probléma 2009 májusa óta, a pkexec parancs hozzáadása óta fennáll. A PolKit sebezhetőségének javítása jelenleg javításként érhető el (javítás nem jelent meg), de mivel a disztribúció fejlesztőit előre értesítették a problémáról, a legtöbb disztribúció a sérülékenységgel kapcsolatos információk nyilvánosságra hozatalával egyidejűleg tette közzé a frissítést. A problémát az RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux és Manjaro javítja. A biztonsági rés blokkolásának ideiglenes intézkedéseként eltávolíthatja a SUID gyökér jelzőt a /usr/bin/pkexec programból („chmod 0755 /usr/bin/pkexec”).



Forrás: opennet.ru

Hozzászólás