CVE-2020-16846
Corrige ahora. Ella está bajo explotación confirmada por CISA y tiene exploit funcional público.
Apply updates per vendor instructions.
Resumen
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.
Detalle 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'.
Cómo se explota
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.
Versiones
Cómo protegerse
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.
Cómo 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.