
Elevação de privilégios via race condition no polkit
Elevação de privilégios via condição de corrida (race condition) no polkit.
CVE-2021-3560 é uma condição de corrida no polkit que permite que um usuário local não autorizado obtenha privilégios de root. A vulnerabilidade existe na forma como o polkit trata erros do D-Bus quando a conexão é interrompida.
Para determinar o timing ideal, execute o comando:
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:testuser string:"Test User" int32:1
No código, é usada a faixa de metade do tempo real ± 0.003.
Por que o timing é importante?
Se o processo for morto cedo demais — a requisição não terá tempo de ser enviada
Se for morto tarde demais — o polkit terá tempo de verificar a autorização e rejeitará
É preciso acertar a "janela de ouro", quando o polkit já recebeu a requisição, mas ainda não verificou a autorização
Como o exploit funciona?
É enviada uma requisição D-Bus para criar um usuário com o parâmetro int32:1 (adição ao grupo wheel)
A requisição é interrompida no meio (condição de corrida)
O polkit não consegue concluir a verificação de autorização
O D-Bus não consegue encontrar o remetente
O polkit trata o erro incorretamente e atribui UID = 0 (root)
O usuário é criado sem autenticação
É enviada uma requisição para definir a senha do novo usuário (com o mesmo timing)
Estatísticas de sucesso
O usuário pode ser criado com 1-2 tentativas
Para definir a senha são necessárias mais tentativas
100 iterações oferecem alta probabilidade de sucesso
Se o exploit não funcionar, tente:
Ampliar o TIMING_RANGE no código
Executar o script várias vezes
Garantir que você esteja em uma sessão SSH (não em uma sessão gráfica)