
Analisei a vulnerabilidade conhecida popularmente como Pwnkit para fins educacionais e escrevi um PoC para ela. Use estritamente para fins educacionais.
AVISO LEGAL: Este material é fornecido exclusivamente para fins educacionais. O uso do exploit sem o consentimento por escrito do proprietário do sistema alvo é antiético e pode ser passível de ação legal.
chmod +x build.sh../build.sh../mls_envp. Você obterá acesso root.Na versão vulnerável do polkit (0.105), o autor, David Zeuthen, presumiu que o pkexec sempre seria chamado a partir do console. Ele partiu do princípio de que argc (número de argumentos) seria sempre maior que 1, já que argv[0] é o nome do próprio programa. No entanto, o pkexec pode ser chamado através da chamada de sistema execve, passando um array de argumentos vazio. Por causa disso, a lógica do programa é quebrada.
No código do pkexec está fixamente embutida a expectativa de que argv contenha pelo menos um elemento. Quando argc é igual a 0, o programa ainda tenta acessar argv[1]. Isso leva ao estouro dos limites do array argv e à leitura do primeiro elemento do array envp (variáveis de ambiente). No nosso caso, ali está a string "exp_exe".
O pkexec tenta encontrar o programa exp_exe usando a função g_find_program_in_path. Para a busca, ela utiliza a variável PATH. Substituímos PATH por GCONV_PATH=.. Como resultado, o pkexec encontra o arquivo vazio exp_exe na nossa pasta local e retorna o caminho GCONV_PATH=./exp_exe. Devido ao bug com argc, esse caminho é gravado de volta em envp[0], "legalizando" a variável GCONV_PATH.
Antes de executar o programa, o pkexec verifica as variáveis de ambiente (incluindo SHELL). Passamos um shell inexistente (SHELL=xyz) para provocar um erro. Ao exibir o erro, é chamada a função log_message, que utiliza os mecanismos da glibc. A glibc observa a variável CHARSET=bohemcavanna e, não encontrando o conversor padrão, recorre ao diretório indicado em GCONV_PATH (que nós injetamos). Lá ela lê o arquivo gconv-modules, carrega nossa biblioteca exploit.so e executa o código dentro dela com privilégios de root.