CVE-2021-3156
Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.
Apply updates per vendor instructions.
Resumo
Baron Samedit é um heap buffer overflow no sudo explorável por qualquer usuário local, sem senha e sem entrada em sudoers, para obter root. A falha existe desde 2011 e afeta praticamente toda instalação padrão de sudo em Linux e outros *nix da época — é uma das poucas CVEs de escalonamento local com CVSS alto que realmente merece o alarde, dado que não exige nenhuma configuração fora do padrão.
Detalhamento técnico
A causa é um off-by-one (CWE-193) na função set_cmnd(), em plugins/sudoers/sudoers.c, que degenera em heap-based buffer overflow (CWE-122). Quando sudo roda em 'modo shell' (flags MODE_SHELL ou MODE_LOGIN_SHELL), a função parse_args() concatena os argumentos de linha de comando escapando todo metacaractere com uma barra invertida antes de gravá-los em user_args. Mais adiante, set_cmnd() percorre esse buffer removendo o escape: ao encontrar um '\\' seguido de caractere não-espaço, avança o ponteiro 'from' duas vezes assumindo que sempre há um caractere depois da barra.
Se um argumento termina em uma única barra invertida sem escape prévio, from[0] é a barra e from[1] é o terminador nulo da string — que não é espaço. O código avança 'from' além do terminador nulo, copia bytes fora dos limites do argumento original para user_args, e o tamanho do buffer (calculado antes, somando strlen de cada argumento) não contabilizou esse excesso. O resultado é escrita fora dos limites do heap.
Em teoria isso nunca deveria ocorrer, porque quem entra em modo shell já passou pelo escape de parse_args(). Na prática, os pesquisadores da Qualys encontraram uma inconsistência entre as condições que ativam MODE_SHELL em parse_args() (linha 571) e as que chegam ao código vulnerável em set_cmnd() (linha 858): se o binário for invocado como 'sudoedit' em vez de 'sudo', parse_args() força MODE_EDIT automaticamente sem resetar o valid_flags padrão, que já inclui MODE_SHELL. Isso permite setar MODE_SHELL via a opção -s sem passar pelo bloco de escape original, deixando a barra invertida final intocada.
O atacante controla integralmente os argumentos de linha de comando passados a 'sudoedit -s', incluindo o conteúdo copiado além do limite do buffer, o que dá controle suficiente sobre o heap para construir exploits confiáveis de escalonamento de privilégio.
Como é explorada
O vetor é totalmente local: o atacante precisa apenas de uma sessão no sistema (shell, SSH, processo qualquer) com o binário sudo/sudoedit instalado com bit setuid — não precisa estar no arquivo sudoers, não precisa saber senha de ninguém e não precisa de nenhuma regra de sudo concedida. Basta invocar sudoedit com a flag -s e um argumento de linha de comando terminado em uma única barra invertida.
A Qualys demonstrou exploração completa até root em Ubuntu 20.04 (sudo 1.8.31), Debian 10 (sudo 1.8.27) e Fedora 33 (sudo 1.9.2), e afirma que outras distribuições provavelmente também são exploráveis. A engenharia do heap overflow em um exploit confiável de corrupção de memória tem complexidade técnica real (heap grooming, controle de layout), mas isso já foi resolvido publicamente: há PoCs, módulo Metasploit e a falha está no catálogo KEV da CISA por exploração confirmada. Isso reduz drasticamente a barreira de reprodução — qualquer pessoa com acesso local não privilegiado a um sistema não corrigido pode chegar a root usando ferramentas já existentes.
O impacto final é escalonamento total: execução de comandos como root, sem trilha de auditoria legítima (o log de sudo não registra a exploração como uso normal).
Versões
Como se proteger
A correção definitiva é atualizar para sudo 1.9.5p2 ou para a versão do pacote da distribuição que incorpora o backport dessa correção (Debian, Red Hat, Fedora, Ubuntu, SUSE e outros publicaram atualizações específicas pouco depois do advisory da Qualys, em janeiro/fevereiro de 2021; a Apple corrigiu em macOS Big Sur 11.2.1, Catalina 10.15.7 Supplemental Update e Mojave 10.14.6 Security Update 2021-002, também via atualização do sudo para 1.9.5p2).
Se a atualização não for possível de imediato, o único paliativo real reportado é remover o bit SUID do binário sudo/sudoedit (por exemplo, ajustando as permissões para retirar o setuid), o que neutraliza o vetor de exploração mas também desativa completamente a funcionalidade do sudo até a correção ser aplicada — custo alto para qualquer ambiente que dependa dele para operação diária. Não há flag de configuração do sudo, regra de sudoers ou controle de AppArmor/SELinux documentado como mitigação parcial eficaz; a superfície vulnerável está no parsing interno de argumentos antes de qualquer política ser avaliada.
Restringir sudoers ou remover usuários de grupos administrativos não mitiga a falha, porque a exploração não depende de ter permissão de sudo — é um mito comum: a vulnerabilidade está no binário setuid em si, executável por qualquer usuário local, e não na política de autorização do sudo.
Como detectar
Não há assinatura de rede, já que o vetor é 100% local e não gera tráfego. Em nível de host, o sinal mais direto é a execução do binário 'sudoedit' com a flag -s e argumentos anômalos terminando em barra invertida, algo que auditoria de linha de comando (auditd, EDR com captura de argv) pode capturar se configurada para registrar invocações de sudo/sudoedit com granularidade de argumentos.
Exploits mal ajustados frequentemente causam crash (segmentation fault) do processo sudo/sudoedit antes de conseguir corromper o heap com sucesso — múltiplos core dumps ou crashes repetidos de sudoedit em curto intervalo, por um mesmo usuário não privilegiado, é um indicador razoável de tentativa de exploração, embora não seja prova definitiva nem cubra tentativas bem-sucedidas de primeira.