
CVE-2021-3560 — Exploit de escalada de privilégios no Polkit via condição de corrida no D-Bus do accounts-daemon
CVE-2021-3560 é uma vulnerabilidade de escalação de privilégio local no Polkit (antigo PolicyKit), o framework de autorização utilizado por ambientes desktop Linux. Um atacante local sem privilégios pode explorar uma condição de corrida na interface D-Bus do accounts-daemon para criar um usuário privilegiado, definir sua senha e, por fim, obter acesso root.
O accounts-daemon (org.freedesktop.Accounts) é um serviço D-Bus do sistema que gerencia contas de usuário (criação, exclusão, alterações de senha, etc.). Ele expõe métodos como:
| Method | Action |
|---|---|
CreateUser | Cria um novo usuário do sistema |
SetPassword | Define a senha do usuário |
DeleteUser | Exclui um usuário |
Essas operações exigem autorização. Quando uma chamada D-Bus chega, o Polkit fica entre o chamador e o accounts-daemon:
Caller → D-Bus → Polkit (authorization check) → accounts-daemon (action)
O Polkit decide se o chamador tem permissão e, se sim, encaminha a solicitação ao accounts-daemon para execução.
A vulnerabilidade é uma corrida TOCTOU (Time Of Check, Time Of Use). Aqui está o ponto-chave:
accounts-daemon (ex.: CreateUser).accounts-daemon terminar o processamento — a criação do usuário é concluída sem autenticação adequada, mas o registro do usuário acaba incompleto (ex.: sem senha, sem diretório pessoal).SetPassword no usuário recém-criado (mas não autenticado), ou o próprio estado incompleto concede privilégios elevados.Em resumo: encerre a solicitação no momento certo e você contorna a autenticação.
Este script exploit.sh automatiza toda a cadeia de ataque:
# Clone the repository
git clone https://github.com/Jeanback1/CVE-2021-3560.git
cd CVE-2021-3560
# Make the exploit executable
chmod +x exploit.sh
# Run it
./exploit.sh
Quando o exploit terminar, você terá um shell root:
whoami
# root

| Componente | Afetado |
|---|---|
| polkit | ≤ 0.119 (sem patch) |
| accounts-daemon (accountsservice) | Todas as versões que usam polkit afetado |
A vulnerabilidade foi corrigida no polkit 0.120 e posteriores.
Distribuições corrigidas (não exaustivo):
Este repositório é apenas para fins educacionais e pesquisa de segurança autorizada. Não utilize este exploit em sistemas que você não possui ou para os quais não tem permissão explícita para testar. O autor não se responsabiliza por uso indevido.
| Step | Action |
|---|
| 1. Calibração de tempo | Usa uma chamada fictícia CreateUser("nobody") para medir quanto tempo leva o round-trip D-Bus, calculando a "janela de encerramento" |
| 2. Criação do usuário | Envia uma chamada CreateUser para um nome de usuário escolhido, inicia-a em segundo plano, aguarda a janela calculada e a encerra — explorando a corrida para criar um usuário não autorizado |
| 3. Definição da senha | Quando o usuário existe (em estado incompleto), envia uma chamada SetPassword com a mesma técnica de corrida para atribuir uma senha conhecida |
| 4. Escalação de privilégio | Usa su para alternar para o novo usuário, executa sudo (que funciona porque o usuário foi criado por um caminho de autorização contornado), copia /bin/bash para /var/tmp/bash com SUID root e abre um shell root |