CVE-2024-23897
Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.
Apply mitigations per vendor instructions or discontinue use of the product if mitigations are unavailable.
Resumo
CVE-2024-23897 afeta o CLI (Command Line Interface) do Jenkins Controller e permite que um atacante não autenticado leia arquivos arbitrários do sistema de arquivos do controller, com impacto que pode escalar para execução remota de código. A gravidade real depende de permissões: sem autenticação o atacante só lê as primeiras linhas de arquivos; com a permissão Overall/Read, lê arquivos completos — inclusive segredos criptográficos que habilitam RCE por múltiplas cadeias.
Detalhamento técnico
A causa é uma feature do parser de argumentos args4j, usado pelo Jenkins para processar comandos da CLI: quando um argumento contém o caractere '@' seguido de um caminho de arquivo, o parser substitui automaticamente esse trecho pelo conteúdo do arquivo referenciado (`expandAtFiles`). Essa expansão é habilitada por padrão na biblioteca e o Jenkins nunca a desativou, então qualquer comando CLI que aceite um argumento arbitrário pode ser abusado para forçar a leitura de um arquivo local do controller e devolver seu conteúdo na resposta. É classificada como CWE-27/path traversal pela CISA, embora a raiz seja mais uma falha de design de parsing de input do que travessia clássica de diretório.
O alcance da leitura depende do nível de acesso do atacante. Sem nenhuma autenticação, o time de segurança do Jenkins confirmou ser possível ler as três primeiras linhas de arquivos usando comandos CLI disponíveis por padrão, sem plugins instalados — e não encontrou plugins que aumentem essa contagem. Com a permissão Overall/Read (usuário autenticado com privilégio mínimo de leitura), o atacante lê o arquivo inteiro, incluindo arquivos binários contendo chaves criptográficas usadas por diversos recursos do Jenkins.
A leitura de binários tem uma limitação prática: o parser lê o arquivo como string usando o encoding padrão do processo Jenkins (`file.encoding`). Em UTF-8, aproximadamente metade dos bytes de um segredo aleatório de 32 bytes (como os usados em HMAC-SHA256) seria substituída por um placeholder de valor ilegal, exigindo em média 16 bytes corretos por tentativa — inviável na prática. Em Windows-1252, apenas 5 dos 256 valores possíveis são ilegais, o que reduz drasticamente a dificuldade de reconstruir a chave binária. O próprio Jenkins Security Team alerta que, apesar de improvável, não é impossível que chaves geradas aleatoriamente usem poucos bytes problemáticos, então a dependência do encoding não deve ser tratada como mitigação confiável.
A partir dos segredos obtidos, pesquisadores da Sonar e a própria equipe de segurança do Jenkins mapearam múltiplas cadeias de exploração pós-leitura: RCE via Resource Root URLs (duas variantes), RCE via cookie 'Remember me' forjado, RCE via XSS armazenado em logs de build, bypass de proteção CSRF, descriptografia de segredos armazenados no Jenkins, exclusão de qualquer item e download de heap dump Java. O advisory do Jenkins deixa explícito que essa lista não é definitiva.
Como é explorada
O vetor é a interface CLI do Jenkins, acessível via rede (HTTP/HTTPS na porta do controller) sem necessidade de plugin específico. A complexidade de exploração é baixa: o ataque não exige interação do usuário e, no caso mais básico (sem autenticação), não exige nenhuma credencial — apenas enviar um comando CLI qualquer com um argumento no formato '@/caminho/do/arquivo'. Isso já entrega as primeiras linhas de qualquer arquivo legível pelo processo Jenkins, o que é suficiente para reconhecimento e, em muitos casos, para vazar segredos que iniciam cadeias de RCE.
A exploração completa (leitura de arquivo integral, incluindo chaves binárias) exige a permissão Overall/Read, que em instalações Jenkins configuradas de forma permissiva costuma estar disponível para qualquer usuário autenticado ou até para 'anonymous' em setups sem controle de acesso adequado — um pré-requisito frequentemente ignorado por quem só lê o CVSS 9.8 e assume acesso total sem autenticação. A escalada de leitura de arquivo para RCE depende de qual segredo é obtido e da configuração específica do controller (Resource Root URLs habilitadas, 'Remember me' ativo, presença de logs de build exploráveis via XSS armazenado etc.).
A vulnerabilidade está no catálogo KEV da CISA desde 19/08/2024, confirmando exploração ativa em campo, com prazo de mitigação definido pela CISA para 09/09/2024. Existem módulo Metasploit, template Nuclei e PoCs públicas, o que reduz a barreira técnica para atacantes automatizados e scanners de massa — a superfície de instâncias Jenkins expostas à internet com CLI habilitado é o alvo típico.
Versões
Como se proteger
A correção oficial é atualizar para Jenkins 2.442 (semanal) ou Jenkins LTS 2.426.3 (linha LTS), ambos publicados em 24/01/2024 junto com o advisory. Não há indicação de outros backports para ramos LTS mais antigos nas fontes revisadas — quem roda LTS anterior a 2.426.2 deve migrar para 2.426.3 ou superior.
Quando a atualização imediata não é viável, o advisory do Jenkins Project descreve desabilitar o acesso à CLI como workaround (removendo a superfície de ataque do parser de comandos). Esse controle tem custo operacional: qualquer automação, pipeline ou ferramenta que dependa da CLI do Jenkins (`java -jar jenkins-cli.jar`) para de funcionar até a reversão. Não confie no encoding de caracteres do sistema (`file.encoding`) como mitigação — o próprio Jenkins Security Team afirma que administradores devem atualizar independentemente do encoding configurado, porque a dificuldade de extrair segredos binários é estatística, não uma barreira garantida.
Controles compensatórios adicionais: restringir a permissão Overall/Read ao mínimo necessário, não expor a interface do Jenkins controller (incluindo a porta CLI/HTTP) diretamente à internet, e revisar logs de acesso à CLI para detectar tentativas anteriores à correção, já que a falha permite reconstrução de segredos que continuam válidos até serem rotacionados — atualizar o Jenkins não invalida chaves já vazadas.
Como detectar
Como o vetor de exploração básico passa por comandos legítimos da CLI do Jenkins com um argumento contendo '@' seguido de caminho de arquivo, logs de acesso HTTP/HTTPS ao endpoint da CLI (`/cli`) e logs de auditoria do Jenkins que registrem execução de comandos CLI são o ponto de partida — procurar por argumentos anômalos contendo '@/etc/passwd', '@/caminho/interno' ou tentativas repetidas de comandos CLI vindas de IPs sem sessão autenticada prévia. A existência de módulo Metasploit e template Nuclei públicos significa que scanners automatizados de massa também deixam padrões de requisição reconhecíveis (múltiplas tentativas de comando CLI em sequência rápida, sem autenticação).
Não há um indicador único e confiável de comprometimento pós-exploração, porque a falha em si é uma leitura de arquivo — não deixa rastro no sistema de arquivos, e o impacto real (RCE) só aparece se e quando o atacante usar os segredos vazados em uma das cadeias secundárias (Resource Root URL, cookie forjado, etc.), cada uma com seus próprios sinais específicos e não documentados de forma unificada nas fontes disponíveis.