
Um scanner inteligente para Log4Shell/Log4j/CVE-2021-44228
Embora existam ferramentas excelentes lançadas para ajudar organizações a escanear seus ambientes em busca de aplicativos vulneráveis à vulnerabilidade crítica Log4J / CVE-2021-44228, senti que:
Assim nasceu o Log4Shell Sentinel. O Log4Shell Sentinel é um scanner baseado em arquivo com alguns recursos únicos. Ele não pretende substituir todas as outras ferramentas disponíveis, mas pode complementá-las.
O Log4Shell Sentinel é um scanner baseado em arquivo. Ele procura por aplicações baseadas em Java escaneando um sistema alvo em busca de artefatos dos seguintes formatos de arquivo:
| Tipo de Arquivo | Detalhes |
|---|---|
| Simple jar | É o caso onde o arquivo log4j-core não está embutido. |
| Fat / Uber jar | Um uber jar é um jar que contém tanto suas classes/pacote quanto todas as dependências da sua aplicação (bibliotecas, recursos e arquivos de metadados) dentro de um único arquivo jar. Esta é a opção de implantação mais comum. |
| WAR | Um arquivo war (Web Application Archive) contém seu código JSP, HTML e JavaScript, além de suas bibliotecas e outros recursos. Este formato é menos comum. |
| EAR | Um ear (Enterprise Application Archive) é outro formato mais comumente usado com Jakarta EE para implantações. |
e procura por instâncias de jars log4j-core vulneráveis. Em seguida, ele:
calcula um hash MD5 do artefato. Isso permite que um analista identifique o mesmo aplicativo executando em máquinas/contêineres diferentes e trate-os como um único achado.
para arquivos determinados como pertencentes a um contêiner, como: /var/lib/docker/overlay2/192768f471818601094bf4edd96d14bfc0e2b178a04a2efd00b2231ad4e46b33/merged/app/spring-boot-application.jar, faz o trabalho pesado de mapear o arquivo para a imagem correspondente. Por exemplo, converteria o acima na seguinte imagem: ghcr.io/christophetd/log4shell-vulnerable-app:latest. Como os vários runtimes de contêiner armazenam esse mapeamento de maneiras diferentes, isso pode economizar horas de frustração de um analista. Isso também permite que um analista trate vários contêineres executando um único aplicativo como um único achado.
remove correspondências inúteis, como correspondências de contêineres que não estão em execução no momento, incluindo imagens em cache. Isso permite que o analista se concentre no que é importante e novamente economiza horas de trabalho desnecessário.
permite que um analista ignore correspondências com base em:
Isso permite que o analista remova aplicativos que sabe que não são vulneráveis ou que correspondem a aplicativos baseados em CLI que não representam ameaça. Por exemplo, se uma instância do Logstash for detectada, um analista pode optar por ignorá-la se não executar a ferramenta ou executá-la apenas ocasionalmente via CLI.
é otimizado para funcionar com suas ferramentas de gerenciamento de configuração, como Ansible, dando a capacidade de escanear rapidamente seu ambiente em minutos.
Para detalhes sobre o enriquecimento de metadados adicionado pelo Log4Shell Sentinel, consulte meu post no blog.
A maneira mais fácil é baixar o binário pré-compilado.
Novamente, é direto. No entanto, você provavelmente desejará compilar uma versão estaticamente ligada para contornar variações relacionadas ao GLIBC em seu ambiente. A ferramenta usa os seguintes módulos que usam CGO por padrão:
os/usernetPara compilar uma versão estaticamente ligada que usa as versões Go dessas bibliotecas, basta clonar o repositório e executar:
$ CGO_ENABLED=0 go build -ldflags="-s -w"
$ ldd log4shell_sentinel
not a dynamic executable
$ ./log4shell_sentinel -h
NAME:
Log4Shell Sentinel - by Osama Elnaggar
USAGE:
log4shell_sentinel [global options] command [command options] [arguments...]
VERSION:
v1.0.0
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--path value, -p value Path to search (default: ".")
--no-banner, --nb Suppress banner (default: false)
--no-messages, --nm Suppress messages except for CSV output (default: false)
--no-header, --nh Suppress header in CSV output (default: false)
--imd5 value, --im value Ignore MD5 hashes. Refer to the GitHub page for expected format
--ipath value, --ip value Ignore file path matches. Refer to the GitHub page for expected format
--icimage value, --ic value Ignore container image matches. Refer to the GitHub page for expected format
--print-headers, --ph Print CSV Headers only (default: false)
--help, -h show help (default: false)
--version, -v print the version (default: false)
Assim que executado, uma varredura simplesmente escaneará o diretório atual. Por exemplo:
$ ./log4shell_sentinel
░█░░░█▀█░█▀▀░█░█░█▀▀░█░█░█▀▀░█░░░█░░░░░█▀▀░█▀▀░█▀█░▀█▀░▀█▀░█▀█░█▀▀░█░░
░█░░░█░█░█░█░░▀█░▀▀█░█▀█░█▀▀░█░░░█░░░░░▀▀█░█▀▀░█░█░░█░░░█░░█░█░█▀▀░█░░
░▀▀▀░▀▀▀░▀▀▀░░░▀░▀▀▀░▀░▀░▀▀▀░▀▀▀░▀▀▀░░░▀▀▀░▀▀▀░▀░▀░░▀░░▀▀▀░▀░▀░▀▀▀░▀▀▀
- A CVE-2021-44228/CVE-2021-45046/CVE-2021-45105 Scanner
- v1.0.0
- by Osama Elnaggar
[*] WARNING: Running as non-root user.
Non-readable files / dirs will be skipped
Container mapping will fail
[*] Starting shallow scan ............ [DONE]
[*] Starting deep scan ............... [DONE]
[*] Calculating MD5 hashes ........... [DONE]
[*] Performing container image lookups [DONE]
[*] Processing ignore list(s) ........ [DONE]
[*] Generating output ................ [DONE]
IP,Hostname,AppName,Team,Ignore (Y/N),Comments,MD5Hash,Timestamp,Container,ContainerImage,FullPath,Version
192.168.121.121,server3,,,,,4e615cd580758b70c49ade1f79103328,2021-12-21T07:38:09Z,true,ghcr.io/christophetd/log4shell-vulnerable-app:latest,/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,log4j-core-2.14.1.jar
Você verá imediatamente um AVISO se executá-lo como um usuário não root, pois ele requer permissões root:
Ele ainda funcionará sem privilégios root, mas pode não fornecer os melhores resultados.
Um exemplo de achado se parece com:
IP,Hostname,AppName,Team,Ignore (Y/N),Comments,MD5Hash,Timestamp,Container,ContainerImage,FullPath,Version
192.168.121.121,server3,,,,,4e615cd580758b70c49ade1f79103328,2021-12-21T07:38:09Z,true,ghcr.io/christophetd/log4shell-vulnerable-app:latest,/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,log4j-core-2.14.1.jar
Alguns campos são intencionalmente deixados vazios para que o analista os preencha no Excel, etc. Uma breve descrição de cada campo é mostrada abaixo: