← voltar
CVE-2020-16846criticalsob ataqueCWE-78

CVE-2020-16846

100Vexday Risk Score

Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.

ssvc Actcvss 9.8epss 100%
da publicação à arma342 dias
Publicada no NVD6 de nov.
1ª PoC+342d
metasploit3 de nov.
CISA KEV+362d
probabilidade de exploração
100%top 1% das CVEs
exploração observada
simCISA + VulnCheck
3 exploit(s) público(s)
Ação exigida pela CISAprazo federal: 2022-05-03

Apply updates per vendor instructions.

Resumo

Falha de injeção de comando (shell injection) na Salt API do SaltStack Salt, explorável via requisições HTTP contra o endpoint REST (rest_cherrypy) quando o cliente SSH está habilitado no minion/master. Um atacante remoto, sem necessidade de credenciais válidas conforme apontado pela ZDI, consegue injetar comandos de shell através de parâmetros do client SSH e executar código no contexto do processo salt-api. Está no catálogo KEV da CISA com exploração confirmada, tem módulo Metasploit e PoC pública — é vulnerabilidade de exploração trivial e impacto total quando a pré-condição (SSH client habilitado na API) existe.

Detalhamento técnico

A falha (CWE-78, OS Command Injection) está no módulo rest_cherrypy da Salt API, especificamente no tratamento de parâmetros passados quando o cliente é definido como 'ssh' (client=ssh) nas chamadas à API. Quatro parâmetros distintos foram identificados por pesquisadores da ZDI como vetores independentes de injeção sob o mesmo CVE: tgt (o alvo do comando SSH), ssh_priv (caminho para a chave privada SSH), ssh_options (opções passadas ao cliente SSH) e ssh_port (porta SSH). Em todos os casos, o valor fornecido pelo requisitante da API é interpolado na construção de um comando de sistema (chamada ao binário ssh subjacente) sem sanitização ou escaping adequado.

Como o Salt SSH client monta e executa comandos ssh/scp no sistema operacional para se comunicar com os targets, qualquer campo que acabe compondo esse comando é superfície de injeção se não for tratado como argumento isolado (ex: via lista de argumentos para uma chamada exec, e não concatenação de string para um shell). O atacante controla integralmente o conteúdo desses parâmetros no corpo da requisição HTTP enviada à Salt API.

A CVE-2020-16846 é, na prática, um agregado de quatro achados distintos (ZDI-20-1379 a ZDI-20-1382, mesmos autores/creditados) que compartilham a mesma causa raiz e o mesmo endpoint vulnerável — todos exigem que o master/minion tenha o cliente SSH do Salt habilitado e acessível via API, condição que não é o modo de operação padrão do Salt (que normalmente usa o transporte ZeroMQ, não SSH).

Há divergência de severidade entre fontes: o NVD/NIST atribuiu CVSS 3.1 de 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H), tratando o CVE como pré-autenticação e de impacto total. A ZDI, em cada um dos quatro advisories individuais, pontuou 7.3 (C:L/I:L/A:L) mas também descreveu explicitamente 'authentication is not required to exploit this vulnerability'.

Como é explorada

O vetor é uma requisição HTTP para o endpoint REST da Salt API contendo os parâmetros do cliente SSH (tgt, ssh_priv, ssh_options ou ssh_port) manipulados com metacaracteres de shell. A pré-condição crítica, que a manchete '9.8 CVSS' obscurece, é que a instância precisa ter a Salt API exposta com client=ssh habilitado — muitos ambientes Salt usam apenas o transporte padrão (ZeroMQ) e não o Salt SSH, e nesse caso o endpoint vulnerável simplesmente não está em uso operacional. Ambientes que expõem a API com SSH client habilitado e acessível pela rede são o alvo real.

Segundo os advisories da ZDI, autenticação não é necessária para acionar a falha — mas isso depende de como o eauth (external authentication) da API está configurado no ambiente; instalações com autenticação obrigatória e políticas de acesso restritivas reduzem a exposição direta, ainda que não eliminem o risco caso o atacante já tenha alguma credencial de baixo privilégio. A complexidade de exploração é baixa (AC:L) e não exige interação do usuário.

O resultado final é execução de comando arbitrário no contexto do processo salt-api, que tipicamente roda com privilégios elevados no host do Salt Master — isto é, comprometimento total do master e, por extensão, de toda a infraestrutura gerenciada por ele (todos os minions). A presença no catálogo KEV da CISA confirma exploração ativa in-the-wild; a disponibilidade de módulo Metasploit e template Nuclei tornou a varredura e exploração em massa trivial após a divulgação pública em novembro de 2020, período que também viu campanhas de exploração de outras CVEs do mesmo lote (CVE-2020-11651/11652) contra instalações Salt expostas na internet.

Versões

Afetadas
SaltStack Salt em versões até e incluindo a linha 3002 ("through 3002", conforme descrição oficial do CVE).
Corrigidas em
Não confirmado nas fontes consultadas com número de versão exato; o fornecedor publicou correção no ciclo de novembro de 2020 (ver release notes oficiais em github.com/saltstack/salt/releases e o blog post do SaltStack sobre as três CVEs divulgadas em 3/nov/2020). Distribuições Linux publicaram pacotes atualizados via seus próprios avisos (openSUSE, Debian LTS, Fedora, Gentoo) — consulte o pacote específico da distribuição para a versão corrigida correspondente.

Como se proteger

A correção definitiva é atualizar para uma versão do Salt que inclua o patch do fornecedor, divulgado no ciclo de correção de novembro de 2020 junto com outras CVEs do mesmo lote. As fontes consultadas não especificam o número exato de versão corrigida por branch — consulte diretamente as release notes/changelog oficial do SaltStack (github.com/saltstack/salt/releases) e o blog post do fornecedor referenciado nos advisories da ZDI antes de considerar o ambiente corrigido; não assuma um número de versão sem confirmar na fonte oficial.

Como mitigação compensatória quando a atualização imediata não é viável: desabilite o client SSH na configuração da Salt API se ele não for usado operacionalmente — isso remove o endpoint vulnerável por completo. Restrinja o acesso de rede à Salt API (porta do rest_cherrypy) apenas a hosts de gerência confiáveis, via firewall ou segmentação, e reforce a exigência de autenticação (eauth) robusta no lugar de configurações permissivas. Nenhuma dessas medidas substitui o patch — reduzem a superfície de ataque, mas a lógica de injeção permanece no código até a atualização.

O mito a descartar: acreditar que 'Salt não expõe a API publicamente, então não estou vulnerável' ignora que instalações internas comprometidas por outro vetor (ou pivoteamento lateral) também podem alcançar a API; e acreditar que desabilitar autenticação anônima resolve o problema ignora o relato da ZDI de que a exploração independe de autenticação nos casos documentados.

Como detectar

Procure em logs da Salt API (rest_cherrypy) por requisições com client=ssh contendo nos parâmetros tgt, ssh_priv, ssh_options ou ssh_port caracteres típicos de injeção de shell (ponto-e-vírgula, pipe, backticks, $() ou redirecionamentos), especialmente vindas de origens não administrativas ou sem autenticação válida. Monitore também a execução, pelo processo salt-api, de subprocessos ssh/scp com argumentos anômalos ou não correspondentes a targets/configurações esperadas do ambiente.

Como o Salt não registra por padrão logging detalhado de todos os parâmetros de requisição da API, a ausência de evidência não implica ausência de tentativa — ambientes sem logging de acesso HTTP completo na API (nível de aplicação, não apenas access log genérico) têm baixa capacidade forense retroativa para este CVE.

Pesquisado e redigido com IA a partir do advisory do fornecedor e de análises públicas, com as fontes acima. Confira sempre a versão corrigida no advisory oficial antes de agir.
An issue was discovered in SaltStack Salt through 3002. Sending crafted web requests to the Salt API, with the SSH client enabled, can result in shell injection.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Produtos afetados
n/a · n/a
⚠ Recursos públicos, para você avaliar a exposição de sistemas que controla ou está autorizado a testar. Teste apenas com autorização.