Vulnerabilitat crítica a PolKit que permet l'accés root a la majoria de distribucions de Linux

Qualys ha identificat una vulnerabilitat (CVE-2021-4034) al component del sistema Polkit (anteriorment PolicyKit) utilitzat a les distribucions per permetre als usuaris sense privilegis realitzar accions que requereixen drets d'accés elevats. La vulnerabilitat permet a un usuari local sense privilegis augmentar els seus privilegis per arrelar i obtenir el control total del sistema. El problema es va anomenar PwnKit i destaca per produir un exploit que funciona amb la configuració predeterminada a la majoria de distribucions de Linux.

El problema està present a la utilitat pkexec de PolKit, que ve amb el senyal d'arrel SUID i està dissenyada per executar ordres amb els privilegis d'un altre usuari d'acord amb les regles PolKit especificades. A causa del maneig incorrecte dels arguments de la línia d'ordres passats a pkexec, un usuari sense privilegis podria ometre l'autenticació i executar el seu codi com a root, independentment de les regles d'accés establertes. Per a un atac, no importa quins paràmetres i restriccions s'especifiquen a PolKit, n'hi ha prou que l'atribut arrel SUID estigui establert per al fitxer executable amb la utilitat pkexec.

Pkexec no verifica la validesa del recompte d'arguments de la línia d'ordres (argc) passat quan s'inicia un procés. Els desenvolupadors de pkexec van suposar que la primera entrada de la matriu argv sempre conté el nom del procés (pkexec), i la segona un valor NULL o el nom de l'ordre llançada mitjançant pkexec. Com que el recompte d'arguments no es va contrastar amb el contingut real de la matriu i es va suposar que sempre era superior a 1, si a un procés se li passava una matriu argv buida, tal com ho permet la funció execve de Linux, pkexec tractaria NULL com el primer argument ( el nom del procés) i el següent com fora de la memòria intermèdia, com els continguts posteriors de la matriu. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "programa" "-opció" NULL "valor" "PATH=nom" NULL

El problema és que després de la matriu argv hi ha una matriu envp a la memòria que conté variables d'entorn. Així, si la matriu argv està buida, pkexec extreu dades sobre l'execució de l'ordre amb privilegis elevats del primer element de la matriu amb variables d'entorn (argv[1] es va convertir en idèntic a envp[0]), el contingut de les quals es pot controlar. per part de l'atacant.

Després d'haver rebut el valor d'argv[1], pkexec intenta, tenint en compte els camins dels fitxers a PATH, determinar el camí complet al fitxer executable i escriu un punter a la cadena amb el camí complet de tornada a argv[1], que condueix a sobreescriure el valor de la primera variable d'entorn, ja que argv[1] és idèntic a envp[0]. En manipular el nom de la primera variable d'entorn, un atacant pot substituir una altra variable d'entorn a pkexec, per exemple, substituir la variable d'entorn "LD_PRELOAD", que no està permesa als programes suid, i fer que la seva biblioteca compartida es carregui al procés.

L'explotació de treball consisteix a substituir la variable GCONV_PATH, que s'utilitza per determinar el camí a la biblioteca de transcodificació de símbols, carregada dinàmicament quan es crida la funció g_printerr(), el codi de la qual utilitza iconv_open(). En redefinir el camí a GCONV_PATH, un atacant pot assegurar-se que no és la biblioteca estàndard iconv la que es carrega, sinó la seva pròpia biblioteca, els controladors des de la qual s'executaran quan es mostri un missatge d'error en l'etapa en què pkexec encara s'està executant amb drets root i abans de comprovar els permisos d'inici.

S'observa que, malgrat que el problema és causat per la corrupció de la memòria, es pot explotar de manera fiable i repetida independentment de l'arquitectura de maquinari utilitzada. L'explotació preparada s'ha provat amb èxit a Ubuntu, Debian, Fedora i CentOS, però també es pot utilitzar en altres distribucions. L'explotació original encara no està disponible públicament, la qual cosa indica que és trivial i pot ser recreada fàcilment per altres investigadors, per la qual cosa és important instal·lar l'actualització del pedaç tan aviat com sigui possible en sistemes multiusuari. Polkit també està disponible per a sistemes BSD i Solaris, però no s'ha estudiat per utilitzar-los. El que se sap és que l'atac no es pot dur a terme a OpenBSD, ja que el nucli OpenBSD no permet passar un valor argc nul quan es crida a execve().

El problema és present des del maig de 2009, des de l'addició de l'ordre pkexec. La correcció de la vulnerabilitat de PolKit està disponible actualment com a pedaç (no s'ha publicat cap llançament de pedaç), però com que els desenvolupadors de distribucions van ser notificats del problema amb antelació, la majoria de distribucions van publicar l'actualització simultàniament amb la divulgació d'informació sobre la vulnerabilitat. El problema es soluciona a RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux i Manjaro. Com a mesura temporal per bloquejar la vulnerabilitat, podeu eliminar la marca d'arrel SUID del programa /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec").



Font: opennet.ru

Afegeix comentari