
Esta é a minha implementação simples de um exploit para a vulnerabilidade PwnKit.
Nota: Este repositório e o seu conteúdo fazem parte de um Trabalho de Fim de Curso (TFC), criados apenas para fins didáticos e investigação académica.
Este repositório contém uma prova de conceito (PoC - Proof of Concept) para a vulnerabilidade CVE-2021-4034 (também conhecida como PwnKit). Esta vulnerabilidade de corrupção de memória afeta o componente pkexec do Polkit em sistemas Linux. Ao executar o pkexec com uma lista de argumentos vazia (argc == 0), as variáveis de ambiente podem ser manipuladas para o forçar a carregar uma biblioteca partilhada arbitrária, obtendo assim uma escalada local de privilégios.
De seguida, são explicados os passos necessários para preparar o ambiente de execução a fim de explorar a falha. Este processo especifica como é aproveitado o erro de leitura/escrita na memória do pkexec:
gconv)Este exploit abusa do modo como o GLib gere a conversão de caracteres ao tentar imprimir uma mensagem de erro. Para tal, o primeiro passo é criar uma estrutura de diretórios específica que sirva como repositório local de módulos de conversão GCONV para o GLib.
O segredo da vulnerabilidade é injetar a variável de ambiente GCONV_PATH, aproveitando a escrita fora dos limites causada pela condição argc == 0 do pkexec. Desta forma, o programa é forçado a utilizar um conjunto de caracteres anómalo, o que indica ao GLib que os módulos de conversão de caracteres devem ser procurados no diretório controlado criado no passo anterior.
.so)Para executar o nosso código, é necessário compilar uma biblioteca partilhada (shared object ou .so). Quando o pkexec tentar processar um conjunto de caracteres que não consegue encontrar, irá carregar esta biblioteca a partir do nosso diretório gconv falso. Como o pkexec é um binário com o bit SUID ativado (é executado como root), ao carregar esta biblioteca o nosso código obterá privilégios de root, assumindo o controlo total do sistema (por exemplo, abrindo uma shell root).
gconv-modulesPor fim, deve ser criado o ficheiro de configuração com o nome gconv-modules nesse diretório local. Este ficheiro atua como um índice: indica ao GLib qual biblioteca específica (.so) deve carregar para efetuar a conversão do conjunto de caracteres específico solicitado. Este ficheiro estabelece a ligação entre a conversão solicitada pelo pkexec e a biblioteca partilhada criada no passo 3.
O projeto possui um Makefile para automatizar a compilação do binário C e a limpeza do ambiente.
Para compilar o projeto: $ make
Para limpar os ficheiros gerados (temporários, pastas e binários): $ make clean