
Un escáner inteligente para Log4Shell/Log4j/CVE-2021-44228
Aunque se han publicado algunas herramientas excelentes para ayudar a las organizaciones a escanear sus entornos en busca de aplicaciones vulnerables a la crítica vulnerabilidad Log4J / CVE-2021-44228, consideré que:
Así nació Log4Shell Sentinel. Log4Shell Sentinel es un escáner basado en archivos con algunas características únicas. No pretende sustituir a todas las demás herramientas disponibles, sino complementarlas.
Log4Shell Sentinel es un escáner basado en archivos. Busca aplicaciones basadas en Java escaneando un sistema objetivo en busca de artefactos con los siguientes formatos de archivo:
| Tipo de archivo | Detalles |
|---|---|
| Jar simple | Este es el caso en el que el archivo log4j-core no está embebido. |
| Jar gordo / Uber jar | Un uber jar es un jar que contiene tanto tus clases / paquetes como todas las dependencias de tu aplicación (bibliotecas, recursos y archivos de metadatos) dentro de un único archivo jar. Esta es la opción de despliegue más utilizada. |
| WAR | Un archivo war (Web Application Archive) es un archivo que contiene tu código JSP, HTML y JavaScript, además de tus bibliotecas y otros recursos. Este formato se utiliza con menos frecuencia. |
| EAR | Un ear (Enterprise Application Archive) es otro formato que se utilizaba más habitualmente con Jakarta EE para despliegues. |
y busca instancias de archivos log4j-core vulnerables. A continuación:
calcula un hash MD5 del artefacto. Esto permite a un analista identificar la misma aplicación ejecutándose en diferentes máquinas / contenedores y tratarlos como un único hallazgo
para los archivos que se determina que pertenecen a un contenedor, como: /var/lib/docker/overlay2/192768f471818601094bf4edd96d14bfc0e2b178a04a2efd00b2231ad4e46b33/merged/app/spring-boot-application.jar, realiza el trabajo pesado de mapear el archivo a la imagen correspondiente. Por ejemplo, traduciría lo anterior a la siguiente imagen: ghcr.io/christophetd/log4shell-vulnerable-app:latest. Como los distintos runtimes de contenedores almacenan este mapeo de diferentes maneras, esto puede ahorrarle horas de frustración a un analista. Esto también permite a un analista tratar varios contenedores que ejecutan una única aplicación como un solo hallazgo.
elimina coincidencias inútiles, como las correspondientes a contenedores que no se están ejecutando actualmente, incluidas las imágenes en caché. Esto permite al analista centrarse en lo importante y, de nuevo, le ahorra horas de trabajo innecesario
permite a un analista ignorar coincidencias basándose en:
Esto permite al analista eliminar aplicaciones que sabe que no son vulnerables o que corresponden a aplicaciones basadas en CLI que no representan una amenaza. Por ejemplo, si se detecta una instancia de Logstash, un analista puede optar por ignorarla si no ejecuta la herramienta o simplemente la ejecuta desde la CLI de vez en cuando.
está optimizado para funcionar con tus herramientas de gestión de configuración, como Ansible, lo que te permite escanear rápidamente tu entorno en minutos
Para más detalles sobre el enriquecimiento de metadatos añadido por Log4Shell Sentinel, consulta mi artículo en el blog.
La forma más sencilla es simplemente descargar el binario precompilado.
También esto es sencillo. Sin embargo, probablemente querrás compilar una versión estáticamente enlazada para evitar cualquier variación relacionada con GLIBC en tu entorno. La herramienta utiliza los siguientes módulos, que usan CGO por defecto:
os/usernetPara compilar una versión estáticamente enlazada que utilice las versiones Go de estas bibliotecas, simplemente clona el repositorio y luego ejecuta:
$ 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)
De serie, un escaneo simplemente escaneará el directorio actual. Por ejemplo:
$ ./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
Inmediatamente verás una ADVERTENCIA si lo ejecutas como un usuario no root, ya que requiere permisos de root:
Seguirá funcionando sin privilegios de root, pero puede que no te dé los mejores resultados.
Un hallazgo de ejemplo tiene este aspecto: