
Scanner de vulnerabilidade recursivo para CVEs do Log4j em arquivos e imagens Docker. Detecta JndiLookup.class e versões vulneráveis via hashes SHA256, com correção opcional para remover a classe de exploração.
Este scanner irá escanear recursivamente caminhos incluindo arquivos compactados para versões vulneráveis do log4j e arquivos org/apache/logging/log4j/core/lookup/JndiLookup.class.
Atualmente, a lista de permissão define versões não exploráveis, neste caso log4j-core 2.17.0 e 2.12.3.

| CVE | Referências |
|---|
| CVE-2021-44228 | https://www.cve.org/CVERecord?id=CVE-2021-44228 |
| CVE-2021-45046 | https://www.cve.org/CVERecord?id=CVE-2021-45046 |
| CVE-2021-45105 | https://www.cve.org/CVERecord?id=CVE-2021-45105 |
| CVE-2021-44832 | https://www.cve.org/CVERecord?id=CVE-2021-44832 |
$ divd-2021-00038--log4j-scanner.exe {target-path}
$ divd-2021-00038--log4j-scanner {target-path}
Usando a ferramenta, você também pode escanear contêineres:
$ ./divd-2021-00038--log4j-scanner scan-image logstash:7.16.1
ou imagens locais:
$ ./divd-2021-00038--log4j-scanner scan-image --local {sha256|pattern}
$ ./divd-2021-00038--log4j-scanner scan-image --local log4shell:latest
$ ./divd-2021-00038--log4j-scanner scan-image --local 4949add9e671
# escaneia todas as imagens locais
$ ./divd-2021-00038--log4j-scanner scan-image --local
Você também pode aplicar patch na imagem:
$ docker save log4shell > ./log4shell-image.tar
$ ./divd-2021-00038--log4j-scanner ./log4shell-image.tar
$ ./divd-2021-00038--log4j-scanner patch ./log4shell-image.tar
$ cat ./log4shell-image.tar.patch | docker load
A comparação de ambos os tars mostrará as seguintes diferenças:
Binary files ../2/BOOT-INF/lib/log4j-core-2.14.1.jar and ./BOOT-INF/lib/log4j-core-2.14.1.jar differ
Binary files ../2/app/spring-boot-application.jar and ./app/spring-boot-application.jar differ
Binary files ../2/b0d66ac73d47865118cfb9a1244f1508d94ea938da1eb78c2db20bd2e1a6629a/layer.tar and ./b0d66ac73d47865118cfb9a1244f1508d94ea938da1eb78c2db20bd2e1a6629a/layer.tar differ
Only in ./org/apache/logging/log4j/core/lookup: JndiLookup.class
Adicionamos suporte preliminar para aplicar patches recursivamente em arquivos. Isto é muito experimental, tenha cuidado com esta funcionalidade. Atualmente, a aplicação de patches funciona apenas com o arquivo compactado (jar / tar). O patch criará um novo arquivo .patch que precisa substituir o arquivo original. Este é propositalmente um processo manual, pois precisa ser sincronizado com a reinicialização dos serviços. Certifique-se de criar um backup do arquivo original antes de substituí-lo. Após aplicar o patch, você pode escanear novamente para garantir que não perdeu nenhum arquivo. Atualmente, arquivos .class simples em pastas não serão corrigidos, pois podem ser removidos manualmente com segurança.
O arquivo .patch será exatamente igual ao arquivo original, sem o JndiLookup.class. Isto deve ser suficiente para mitigar este problema, enquanto se aguarda por atualizações. Certifique-se de fazer backups e testar minuciosamente.
O patch se recusará a executar em pastas, como precaução. Apenas aponte o patch para o arquivo compactado vulnerável.
$ divd-2021-00038--log4j-scanner.exe patch {target-path}
divd-2021-00038--log4j-scanner patch {target-path}
Requisitos:
$ git clone "https://github.com/dtact/divd-2021-00038--log4j-scanner.git"
$ go build -o ./.builds/divd-2021-00038--log4j-scanner ./main.go
Código e documentação com direitos autorais 2021 Remco Verhoef (DTACT).
Código lançado sob a licença MIT.