← back
CVE-2021-3560highunder attackCWE-863

CVE-2021-3560

96Vexday Risk Score

Patch now. It under exploitation confirmed by CISA and has a working public exploit.

ssvc Actcvss 7.8epss 22%
from disclosure to weapon0 days
Published on NVDFeb 16
1st PoCJun 27
metasploitJun 3
CISA KEV+450d
exploitation probability
22%top 3% of all CVEs
observed exploitation
yesCISA + VulnCheck
65 public exploit(s)
Action required by CISAfederal deadline: 2023-06-02

Apply updates per vendor instructions.

Summary

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.

Technical detail

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.

How it’s exploited

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.

Versions

Affected
polkit upstream a partir da versão 0.113 (bug introduzido no commit bfa5036) até antes da 0.119. No fork usado pela Debian/Ubuntu, a partir da versão 0.105-26 (commit f81d021). RHEL 7 e Fedora 20 ou anteriores não são afetados; RHEL 8, Fedora 21+, Ubuntu 20.04 e Debian testing (bullseye) são afetados; Debian 10 (buster, versão 0.105-25) não é afetado.
Fixed in
polkit 0.119 (upstream). Red Hat corrigiu via RHSA-2021:2236 (RHEL 8.1 EUS), RHSA-2021:2237 (RHEL 8.2 EUS) e RHSA-2021:2238 (RHEL 8), além de RHSA-2021:2522 (Red Hat Virtualization 4 para RHEL 8) e RHSA-2021:2555 (OpenShift Container Platform 4.7). Demais distribuições publicaram backports próprios nos respectivos pacotes polkit.

How to protect

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.

How to detect

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.

Researched and written with AI from the vendor advisory and public analysis, with the sources above. Always confirm the fixed version in the official advisory before acting.
It was found that polkit could be tricked into bypassing the credential checks for D-Bus requests, elevating the privileges of the requestor to the root user. This flaw could be used by an unprivileged local attacker to, for example, create a new local administrator. The highest threat from this vulnerability is to data confidentiality and integrity as well as system availability.
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Affected products
n/a · polkit
public PoCs found65 VexDay Proof
exploitdbVexDay Proofwww.exploit-db.com/exploits/50011githubgithub.com/Almorabea/Polkit-exploit126githubgithub.com/secnigma/CVE-2021-3560-Polkit-Privilege-Esclation124githubgithub.com/RicterZ/CVE-2021-3560-Authentication-Agent116githubgithub.com/swapravo/polkadots82githubgithub.com/hakivvi/CVE-2021-356040githubgithub.com/winmin/CVE-2021-356025githubgithub.com/AssassinUKG/Polkit-CVE-2021-356024githubgithub.com/UNICORDev/exploit-CVE-2021-356012githubgithub.com/chenaotian/CVE-2021-35609githubgithub.com/0dayNinja/CVE-2021-35609githubgithub.com/aancw/polkit-auto-exploit5githubgithub.com/cpu0x00/CVE-2021-35602githubgithub.com/BizarreLove/CVE-2021-35602githubgithub.com/LucasPDiniz/CVE-2021-35602githubgithub.com/Kyyomaa/CVE-2021-3560-EXPLOIT2githubgithub.com/adakoifman/CVE-2021-35600githubgithub.com/realatharva15/polkit-CVE-2021-3560_writeup0githubgithub.com/arcslash/exploit_CVE-2021-35600githubgithub.com/markyu0401/CVE-2021-3560-Polkit-Privilege-Escalation0githubgithub.com/TieuLong21Prosper/CVE-2021-35600githubgithub.com/iSTAR-Lab/CVE-2021-3560_PoC0githubgithub.com/pashayogi/ROOT-CVE-2021-35600githubgithub.com/asepsaepdin/CVE-2021-35600githubgithub.com/curtishoughton/CVE-2021-35600githubgithub.com/admin-079/CVE-2021-35600githubgithub.com/titusG85/SideWinder-Exploit0githubgithub.com/MandipJoshi/CVE-2021-35600githubgithub.com/Antoine-MANTIS/POC-Bash-CVE-2021-35600githubgithub.com/SeimuPVE/CVE-2021-3560_Polkit0githubgithub.com/yutasato88/CVE-2021-3560-PolkitPrivilegeEsclation0githubgithub.com/Jeanback1/CVE-2021-3560-exploit0cve_referencepacketstormsecurity.com/files/172836/polkit-Authentication-Bypass.htmlunverifiedcve_referencepacketstormsecurity.com/files/172846/Facebook-Fizz-Denial-Of-Service.htmlunverifiedvulncheckvulncheck.com/xdb/3c3962d97923unverifiedvulncheckvulncheck.com/xdb/e8100379c1b0unverifiedvulncheckvulncheck.com/xdb/03fa3b5da68dunverifiedvulncheckvulncheck.com/xdb/dd1aeadeb04funverifiedvulncheckvulncheck.com/xdb/0d4f1d0b0a97unverifiedvulncheckvulncheck.com/xdb/5458d4a55c6funverifiedvulncheckvulncheck.com/xdb/9e693b05320bunverifiedvulncheckvulncheck.com/xdb/4c9042d8ae10unverifiedvulncheckvulncheck.com/xdb/201ca3f02f33unverifiedvulncheckvulncheck.com/xdb/b9903bce0f77unverifiedvulncheckvulncheck.com/xdb/b9083d54f435unverifiedvulncheckvulncheck.com/xdb/ab99d39a10aeunverifiedvulncheckvulncheck.com/xdb/1a9fd1b14178unverifiedvulncheckvulncheck.com/xdb/fe5ce90a026funverifiedvulncheckvulncheck.com/xdb/d89126ce6bd4unverifiedvulncheckvulncheck.com/xdb/635680273494unverifiedvulncheckvulncheck.com/xdb/f006252e1faaunverifiedvulncheckvulncheck.com/xdb/e55338406838unverifiedvulncheckvulncheck.com/xdb/25e4e99ad519unverifiedvulncheckvulncheck.com/xdb/e4e946e08867unverifiedvulncheckvulncheck.com/xdb/d61c55d40a53unverifiedvulncheckvulncheck.com/xdb/eb01bdf5882cunverifiedvulncheckvulncheck.com/xdb/cd90ec71f715unverifiedvulncheckvulncheck.com/xdb/bed1611a3e31unverifiedvulncheckvulncheck.com/xdb/adc62bb25d2bunverifiedvulncheckvulncheck.com/xdb/1dc3b537ba07unverifiedvulncheckvulncheck.com/xdb/3d2f55cb3c32unverifiedvulncheckvulncheck.com/xdb/a53e8dee7421unverifiedvulncheckvulncheck.com/xdb/c279fbc11487unverifiedvulncheckvulncheck.com/xdb/8c1d0543f79dunverifiedvulncheckvulncheck.com/xdb/5b62a0ef03d4unverified
⚠ Public resources, to assess the exposure of systems you control or are authorized to test. Test only with authorization.