CVE-2021-3560
Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.
Apply updates per vendor instructions.
Resumo
Falha no polkit (serviço de autorização usado pelo systemd em praticamente toda distribuição Linux moderna) permite que um usuário local sem privilégios engane a checagem de credenciais de uma requisição D-Bus e a faça ser tratada como se tivesse vindo do root. Na prática, um atacante local consegue criar um novo administrador, instalar pacotes ou executar qualquer ação que dependa de autorização polkit — sem precisar de senha, sudo ou qualquer privilégio prévio. O bug ficou sete anos no código antes de ser encontrado, e está confirmado na KEV da CISA com exploração ativa.
Detalhamento técnico
A função polkit_system_bus_name_get_creds_sync() consulta o dbus-daemon para obter uid e pid do processo que fez a requisição, usando o nome único de barramento (algo como ":1.96") que o dbus-daemon atribui e não pode ser forjado. O problema (CWE-863, autorização incorreta, com componente de condição de corrida — CWE-362) aparece quando o processo requisitante se desconecta do dbus-daemon exatamente no instante em que essa função é chamada: o nome de barramento deixa de existir, o dbus-daemon responde com um erro, e a função sinaliza esse erro no parâmetro de saída — mas ainda retorna TRUE em vez de FALSE.
Como a struct AsyncGetBusNameCredsData é zero-inicializada, qualquer código chamador que não verifique explicitamente o parâmetro de erro interpreta uid=0 como resultado válido, ou seja, assume que a requisição partiu do root. Certos caminhos de chamada dentro do polkit foram identificados como vulneráveis a esse padrão de erro ignorado, permitindo que uma chamada de método D-Bus seja processada como se tivesse sido feita pelo usuário root.
O bug foi introduzido no upstream do polkit no commit bfa5036, presente a partir da versão 0.113. No fork usado pela Debian (com esquema de numeração próprio), o commit equivalente é f81d021, presente a partir da versão 0.105-26 — por isso o Debian 10 (buster), que usa 0.105-25, não é afetado, enquanto derivados baseados em Debian unstable, como o Ubuntu 20.04, são.
O atacante não controla dados arbitrários; controla apenas o timing de desconexão do próprio processo cliente D-Bus. Não há corrupção de memória nem manipulação de payload — é puramente uma janela de corrida em código de tratamento de erro.
Como é explorada
A exploração usa apenas ferramentas padrão de linha de comando (bash, kill, dbus-send) e depende de vencer uma corrida: iniciar uma chamada D-Bus para um método privilegiado (como org.freedesktop.Accounts.CreateUser) e matar o processo dbus-send poucos milissegundos depois de iniciado, antes que a resposta normal chegue, mas durante a janela em que o polkit ainda está processando a checagem de credenciais. Isso força o cenário em que a checagem de erro é ignorada e o uid é tratado como 0.
Pré-requisito real: acesso local (shell, mesmo via SSH) sem qualquer privilégio adicional — não exige autenticação polkit, senha ou configuração não padrão. A demonstração pública depende de dois pacotes clientes do polkit estarem presentes (accountsservice e gnome-control-center), comuns em qualquer instalação desktop e instaláveis via gerenciador de pacotes em servidores; eles não são a causa da falha, apenas vetores convenientes para acionar o caminho de código vulnerável. O timing exato de corrida varia por máquina e pode exigir algumas tentativas, mas é trivial de automatizar em script, o que explica a presença de módulo Metasploit e PoC pública amplamente disponível.
O resultado final é escalada de privilégio local completa: criação de um usuário administrador, execução de ações restritas ao root via qualquer daemon que confie no polkit para autorização. A CISA confirma exploração ativa no mundo real (KEV), sem indicar se há relação com campanhas de ransomware.
Versões
Como se proteger
A correção definitiva é atualizar o polkit para a versão 0.119 ou posterior (upstream) ou para o pacote da distribuição que incorpore o patch equivalente — a Red Hat lançou correções via RHSA-2021:2236, 2237 e 2238 para RHEL 8, e outras distribuições publicaram builds corrigidos em seus próprios ciclos de update. Não há uma flag de configuração ou parâmetro de runtime que neutralize a falha: o problema está na lógica de verificação de erro dentro do próprio binário do polkit, então só o binário corrigido resolve.
Se a atualização não for possível de imediato, não existe mitigação de configuração equivalente e confiável — restringir acesso local (impedir shells de usuários não confiáveis) reduz a superfície, mas não neutraliza o vetor para qualquer usuário que já tenha acesso interativo, que é justamente o cenário-alvo da falha. Monitorar CVE-2021-3560 como item de priorização máxima em ambientes multiusuário é mais realista do que buscar um paliativo técnico.
Mito a descartar: como a exploração usa apenas dbus-send e não abre porta de rede nem exige tráfego externo, WAFs e controles de borda não têm qualquer efeito. É falha estritamente local, ligada ao binário do polkit em execução no host.
Como detectar
A exploração não deixa payload de rede nem string de ataque óbvia em log de aplicação — é uma corrida de timing em chamadas D-Bus locais. Um sinal possível é volume anômalo de chamadas D-Bus a métodos sensíveis (como org.freedesktop.Accounts.CreateUser) originadas por processos dbus-send de curta duração, encerrados abruptamente (SIGKILL/SIGTERM) poucos milissegundos após o início, especialmente em sequência repetida vinda do mesmo usuário local sem privilégio — padrão consistente com tentativas de acertar a janela de corrida. Não há assinatura confiável de rede porque todo o vetor é local; a detecção depende de auditoria de processos e do barramento D-Bus (auditd, log do próprio dbus-daemon) e da correlação de novas contas administrativas criadas sem passar por fluxo normal de autenticação polkit.