
A Smart Log4Shell/Log4j/CVE-2021-44228 Scanner
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:
A ferramenta vem com as seguintes opções:
Um dos recursos exclusivos do Log4Shell Sentinel não encontrado em nenhuma outra ferramenta é a capacidade de traduzir jars encontrados em varreduras do sistema de arquivos, como:
/var/lib/docker/overlay2/192768f471818601094bf4edd96d14bfc0e2b178a04a2efd00b2231ad4e46b33/merged/app/spring-boot-application.jar
para a imagem de contêiner correspondente (o exemplo acima traduz para ghcr.io/christophetd/log4shell-vulnerable-app:latest, por exemplo). 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. A solução atualmente suporta as seguintes buscas:
O número de aplicativos identificados pode ser inicialmente esmagador, ou você pode querer focar em um subconjunto específico de aplicativos identificados, como aqueles expostos a usuários externos primeiro. Ou você pode querer focar em um determinado escopo de conformidade. Para suportar isso, o aplicativo suporta a especificação de uma lista. O Log4Shell atualmente suporta 3 listas de ignorados:
Em vez de listas simples, ele espera um arquivo CSV como entrada. Isso incentiva o analista a documentar por que está ignorando um determinado achado. À medida que o analista processa os achados e identifica aplicativos não vulneráveis por meio de análise manual ou automatizada de código fonte ou ferramentas DAST, etc.
A lista é um arquivo CSV simples no seguinte formato:
MD5Sum,AppName,Reason
As colunas AppName e Reason podem estar vazias, mas estão lá para você acompanhar por que está incluindo ou excluindo aplicativos específicos.
NOTA Como este recurso usa o hash MD5 calculado para o aplicativo, ele só funcionará para aplicativos que são fat / uber jars, EARs ou WARs.
Por exemplo, se tivéssemos o seguinte achado:
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
e determinássemos que o aplicativo não é vulnerável, poderíamos salvar o seguinte em hashes.csv:
4e615cd580758b70c49ade1f79103328,Demo App,Not vulnerable
e então reexecutar:
# ./log4shell_sentinel --im hashes.csv --path /
o achado acima seria suprimido.
A lista é um arquivo CSV simples no seguinte formato:
Container Image,AppName,Reason
Continuando o exemplo anterior, podemos dizer para ignorar qualquer achado onde a imagem do contêiner seja: ghcr.io/christophetd/log4shell-vulnerable-app:latest criando um arquivo images.csv como este:
ghcr.io/christophetd/log4shell-vulnerable-app:latest,,
e então executar com:
# ./log4shell_sentinel --ic images.csv -p /
Novamente, nosso achado anterior seria suprimido.
Novamente, é um arquivo CSV simples no seguinte formato:
Path,AppName,Reason
Usando o exemplo acima, se criarmos o seguinte arquivo paths.csv:
/run/containerd/io.containerd.runtime.v2.task/k8s.io/dc2c9c214809f506283c917244cd126a9b056ac7274322d12b59c9196d95dd9b/rootfs/app/spring-boot-application.jar,Demo App,Not vulnerable
o achado anterior seria suprimido.
AVISO Quando possível, é melhor usar um hash MD5 ou nome da imagem do contêiner para supressão, pois o caminho pode não ser único.
Embora seja perfeitamente aceitável executar o Log4Shell Sentinel em um único servidor, ele realmente se destaca quando combinado com sua ferramenta de gerenciamento de configuração favorita (Ansible, Chef, Puppet, Salt, AWS SSM, etc.) ou até mesmo ferramentas SSH paralelas simples como parellel-ssh.
Isso oferece vários benefícios, incluindo:
Para um exemplo completo disso em ação, consulte meu post no blog
Consulte a seção Varredura em Massa do seu Ambiente.
root (requer acesso aos locais onde seus aplicativos podem estar instalados) ou não ter especificado o caminho correto. Recomenda-se executá-lo como usuário root e definir --path /.A partir da v1.0.0, a ferramenta atualmente suporta mapeamento para:
Se você estiver usando qualquer outra coisa, o mapeamento não funcionará. Se estiver usando um dos acima, pode ser que você não esteja executando a ferramenta como usuário root ou que o socket/arquivos usados estejam em um local não padrão.
Desenvolvido por: Osama Elnaggar
| Campo | Exemplo | Descrição |
|---|
| IP | 192.168.121.121 | Se a instância tiver múltiplos IPs, o IP primário é adicionado |
| Hostname | server3 | Nome do host |
| AppName | Isso é deixado para o usuário completar após a varredura | |
| Team | Isso é deixado para o usuário completar após a varredura | |
| Ignore (Y/N) | Isso é deixado para o usuário completar após a varredura | |
| Comment | Isso é deixado para o usuário completar após a varredura | |
| MD5Hash | 4e615cd580758b70c49ade1f79103328 | Uma impressão digital única do nosso aplicativo |
| Timestamp | 2021-12-21T07:38:09Z | Um carimbo de data/hora da varredura. Útil se você quiser agregar múltiplas varreduras do mesmo host |
| Container | true | Verdadeiro = isto é um contêiner |
| ContainerImage | ghcr.io/christophetd/log4shell-vulnerable-app:latest | Se um contêiner foi detectado, esta é a imagem correspondente |
| FullPath | /run/containerd/io.containerd. runtime.v2.task/k8s.io/.../spring-boot-application.jar | O caminho completo do achado. Neste exemplo, o JAR vulnerável faz parte de um fat / uber jar |
| Version | log4j-core-2.14.1.jar | A versão do log4j-core detectada |
| Opção | Detalhes |
|---|
--path value, -p value | Especifica quais caminhos pesquisar. Por padrão, pesquisa o diretório atual. IMPORTANTE Recomenda-se definir como / para cobrir todo o sistema de arquivos |
--no-banner, --nb | Suprime o banner |
--no-messages, --nm | Suprime mensagens, como mensagens de progresso |
--no-header, --nh | Suprime o cabeçalho da saída CSV. Recomendado ao executar em vários servidores |
--imd5 value, --im value | Ignorar hashes MD5. Mais detalhes na seção Listas de Ignorados |
--ipath value, --ip value | Ignorar correspondências de caminho de arquivo. Mais detalhes na seção Listas de Ignorados |
--icimage value, --ic value | Ignorar correspondências de imagem de contêiner. Mais detalhes na seção Listas de Ignorados |
--print-headers, --ph | Imprimir apenas os cabeçalhos do CSV. Quando você executa o Log4Shell Sentinel em vários servidores e agrega os resultados, normalmente desativaria a saída do cabeçalho. Este comando gera apenas o cabeçalho para que você possa adicioná-lo à sua planilha do Excel |