Vulnerabilidade crítica en PolKit que permite o acceso root na maioría das distribucións de Linux

Qualys identificou unha vulnerabilidade (CVE-2021-4034) no compoñente do sistema Polkit (anteriormente PolicyKit) utilizado nas distribucións para permitir que os usuarios sen privilexios realicen accións que requiren dereitos de acceso elevados. A vulnerabilidade permite que un usuario local sen privilexios aumente os seus privilexios para rootear e obter o control total do sistema. O problema foi nomeado en código PwnKit e destaca por producir un exploit que funciona na configuración predeterminada na maioría das distribucións de Linux.

O problema está presente na utilidade pkexec de PolKit, que inclúe a marca raíz SUID e está deseñada para executar comandos cos privilexios doutro usuario segundo as regras de PolKit especificadas. Debido ao manexo incorrecto dos argumentos da liña de comandos pasados ​​a pkexec, un usuario sen privilexios podería ignorar a autenticación e executar o seu código como root, independentemente das regras de acceso establecidas. Para un ataque, non importa a configuración e restricións que se especifiquen en PolKit, é suficiente que o atributo raíz SUID estea configurado para o ficheiro executable coa utilidade pkexec.

Pkexec non verifica a validez do reconto de argumentos da liña de comandos (argc) pasado ao iniciar un proceso. Os desenvolvedores de pkexec asumiron que a primeira entrada na matriz argv sempre contén o nome do proceso (pkexec), e a segunda un valor NULL ou o nome do comando lanzado a través de pkexec. Dado que o reconto de argumentos non se comprobou co contido reais da matriz e supouse que era sempre maior que 1, se a un proceso se lle pasaba unha matriz argv baleira, como o permite a función execve de Linux, pkexec trataría NULL como o primeiro argumento ( o nome do proceso) e o seguinte como fóra da memoria intermedia, como os contidos posteriores da matriz. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "programa" "-opción" NULL "valor" "RUTA=nome" NULL

O problema é que despois da matriz argv hai unha matriz envp na memoria que contén variables de ambiente. Así, se a matriz argv está baleira, pkexec extrae datos sobre o comando executado con privilexios elevados do primeiro elemento da matriz con variables de ambiente (argv[1] converteuse en idéntico a envp[0]), cuxo contido pódese controlar. polo atacante.

Despois de recibir o valor de argv[1], pkexec tenta, tendo en conta as rutas dos ficheiros en PATH, determinar a ruta completa ao ficheiro executable e escribe un punteiro na cadea coa ruta completa de volta a argv[1], que leva a sobrescribir o valor da primeira variable de ambiente, xa que argv[1] é idéntico a envp[0]. Ao manipular o nome da primeira variable de ambiente, un atacante pode substituír outra variable de ambiente en pkexec, por exemplo, substituír a variable de ambiente "LD_PRELOAD", que non está permitida nos programas suid, e organizar que a súa biblioteca compartida se cargue no proceso.

O exploit de traballo consiste en substituír a variable GCONV_PATH, que se usa para determinar o camiño á biblioteca de transcodificación de símbolos, cargada de forma dinámica ao chamar á función g_printerr(), cuxo código usa iconv_open(). Ao redefinir o camiño en GCONV_PATH, un atacante pode asegurarse de que non se carga a biblioteca iconv estándar, senón a súa propia biblioteca, cuxos controladores se executarán cando se mostre unha mensaxe de erro na fase na que pkexec aínda se está a executar con dereitos de root e antes de comprobar os permisos de inicio.

Nótase que a pesar de que o problema é causado pola corrupción da memoria, pódese explotar de forma fiable e repetida independentemente da arquitectura de hardware utilizada. O exploit preparado foi probado con éxito en Ubuntu, Debian, Fedora e CentOS, pero tamén se pode usar noutras distribucións. O exploit orixinal aínda non está dispoñible publicamente, o que indica que é trivial e pode ser recreado facilmente por outros investigadores, polo que é importante instalar a actualización do parche canto antes en sistemas multiusuario. Polkit tamén está dispoñible para sistemas BSD e Solaris, pero non se estudou para usar neles. O que se sabe é que o ataque non se pode levar a cabo en OpenBSD, xa que o núcleo de OpenBSD non permite que se pase un valor argc nulo cando se chama a execve().

O problema está presente desde maio de 2009, desde a incorporación do comando pkexec. A corrección para a vulnerabilidade de PolKit está dispoñible actualmente como un parche (non se publicou ningunha versión de parche), pero dado que os desenvolvedores da distribución foron notificados do problema con antelación, a maioría das distribucións publicaron a actualización ao mesmo tempo coa divulgación de información sobre a vulnerabilidade. O problema solucionouse en RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux e Manjaro. Como medida temporal para bloquear a vulnerabilidade, pode eliminar a marca de raíz SUID do programa /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec").



Fonte: opennet.ru

Engadir un comentario