Faz pouco Qualy's divulgou a notícia de que identificou uma vulnerabilidade (CVE-2021-4034) en componente do sistema polkit (anteriormente PolicyKit), que é usado em distribuições para permitir que usuários não privilegiados executem ações que exigem direitos de acesso elevados.
Vulnerabilidade permite que um usuário local sem privilégios eleve seus privilégios para o usuário root e ganhe controle total sobre o sistema. O problema tem o codinome PwnKit e é notável por produzir uma exploração funcional que é executada nas configurações padrão na maioria das distribuições Linux.
É mencionado que o problema existe no utilitário pkexec incluído no PolKit, que vem com o sinalizador de raiz SUID e é projetado para executar comandos com os privilégios de outros usuários de acordo com as regras do PolKit.
Devido ao tratamento errado de argumentos da linha de comando passada para pkexec, um usuário não privilegiado pode ignorar a autenticação e ter seu código executado como root, independentemente das regras de acesso estabelecidas. Para um ataque, independentemente das configurações e restrições definidas no PolKit, basta que o atributo raiz SUID para o arquivo executável seja definido com o utilitário pkexec.
Pkexec não verifica a exatidão da contagem de argumentos de linha de comando (argc) passados ao iniciar um processo. Os desenvolvedores do pkexec assumiram que a primeira entrada no array argv sempre contém o nome do processo (pkexec), e a segunda entrada é NULL ou o nome do comando executado por meio do pkexec.
Como a contagem de argumentos não foi comparada com o conteúdo real do array e foi considerado sempre maior que 1, se um array argv vazio foi passado para o processo, o que a função execve do Linux permite, pkexec tratou NULL como o primeiro argumento ( process name) e o próximo depois da memória do buffer, como o próximo conteúdo do array.
O problema é que depois do array argv na memória está o array envp que contém as variáveis de ambiente. Assim, com um array argv vazio, o pkexec extrai os dados sobre o comando que está sendo executado com privilégios elevados do primeiro elemento do array com variáveis de ambiente (argv[1] tornou-se idêntico a envp[0]), cujo conteúdo pode ser controlado por o atacante.
Tendo recebido o valor argv[1], pkexec tenta determinar o caminho completo para o arquivo executável usando os caminhos de arquivo em PATH e grava o ponteiro na string com o caminho completo de volta para argv[1], o que leva a sobrescrever o valor da primeira variável de ambiente também, já que argv[1] é idêntico a envp[0]. Manipulando o nome da primeira variável de ambiente, um invasor pode substituir outra variável de ambiente em pkexec, por exemplo, substituir a variável de ambiente "LD_PRELOAD", o que não é permitido em programas suid, e fazer com que o processo carregue sua biblioteca compartilhada no processo .
O exploit de trabalho usa a substituição de variável GCONV_PATH, que é usado para determinar o caminho para a biblioteca de transcodificação de símbolos que é carregada dinamicamente quando a função g_printerr() é chamada, que usa iconv_open() em seu código.
Ao redefinir o caminho em GCONV_PATH, o invasor consegue carregar não a biblioteca iconv normal, mas sua própria biblioteca, cujos drivers serão executados durante a mensagem de erro no estágio em que o pkexec ainda está sendo executado como root e antes da verificação da inicialização permissões.
Observa-se que, embora o problema seja devido à corrupção de memória, ele pode ser explorado de forma confiável e repetida, independentemente da arquitetura de hardware usada.
A façanha preparada testado com sucesso no Ubuntu, Debian, Fedora e CentOS, mas também pode ser usado em outras distribuições. A exploração original ainda não está disponível publicamente, indicando que é trivial e pode ser facilmente recriada por outros pesquisadores, por isso é importante instalar a atualização do hotfix o mais rápido possível em sistemas multiusuário.
Polkit também está disponível para sistemas BSD e Solaris, mas não foi explorado para exploração. O que se sabe é que o ataque não pode ser realizado no OpenBSD, pois o kernel do OpenBSD não permite passar um valor null argc ao chamar execve().
O problema existe desde maio de 2009, quando o comando pkexec foi adicionado. A correção para a vulnerabilidade no PolKit ainda está disponível como um patch (a versão da correção não foi formada), mas como os desenvolvedores da distribuição foram notificados do problema com antecedência, a maioria das distribuições lançou uma atualização ao mesmo tempo. de informações de vulnerabilidade.
Finalmente se você estiver interessado em saber mais sobre isso, você pode verificar os detalhes em o seguinte link.