Resumen y antecedentes
Log4j es una biblioteca de registro de código abierto desarrollada por Apache Foundation que se incorpora en muchas aplicaciones basadas en Java tanto en servidores como en sistemas de usuario final. Lanzada inicialmente, el 9 de diciembre de 2021, Log4Shell (el apodo dado a esta vulnerabilidad) es un problema generalizado y extendido debido a la naturaleza integrada de Log4j en muchas aplicaciones y dependencias. Se clasifica como una vulnerabilidad de ejecución remota de código no autenticado y se incluye en CVE-2021-44228.
Pruebas de concepto y como llevarlas a cabo estuvieron disponibles casi inmediatamente después de la publicación.
Desde NIST:
Las características JNDI de Apache Log4j2 2.0-beta9 hasta 2.12.1 y 2.13.0 hasta 2.15.0 utilizadas en la configuración, los mensajes de registro y los parámetros no protegen contra LDAP controlado por atacantes y otros endpoints relacionados con JNDI. Un atacante que puede controlar mensajes de registro o parámetros de mensajes de registro puede ejecutar código arbitrario cargado desde servidores LDAP cuando la sustitución de búsqueda de mensajes está habilitada. Desde Log4j 2.15.0, este comportamiento se ha deshabilitado de forma predeterminada. Desde la versión 2.16.0, esta funcionalidad se ha eliminado por completo. Tenga en cuenta que esta vulnerabilidad es específica de Log4j-core y no afecta a log4net, log4cxx ni a otros proyectos de Apache Logging Services.
El 18 de diciembre de 2021 se descubrió una vulnerabilidad de denegación de servicio (CVE-2021-45105) que afectaba a las versiones de Log4j desde la 2.0-beta9 hasta la 2.16.0 (corregida en la versión 2.17.0).
Para obtener un desglose más detallado de esta vulnerabilidad, consulta el artículo: cómo funciona el exploit Log4Shell
Guía de mitigación
Identificación
Lo principal en lo que debe centrarse una organización es determinar si Log4j está dentro de sus activosy dónde. Incluso más específicamente, centrándose en aplicaciones externas que pueden usar Log4j. Esta es una tarea no trivial dado que se trata de una biblioteca, en lugar de una aplicación instalada, y se puede integrar con proveedores y herramientas de terceros.
Para las organizaciones que tienen inventarios de activos sólidos, estos deben usarse para identificar dónde existen Java, JVM (máquina virtual Java) y las bibliotecas Log4j dentro de su inventario.
Actualmente se mantienen varios recursos que documentan aplicaciones y proveedores vulnerables conocidos. Este es un gran primer lugar para comenzar. Revisa estas listas y determina si el software está presente en tu organización. Si es así, asegúrate de haber aplicado los últimos parches.
Base de datos de Log4j afectado | https://github.com/cisagov/Log4j-affected-db
Software relacionado con Log4j | https://github.com/NCSC-NL/log4shell/blob/main/software/README.md#software-overview
Avisos de seguridad de Log4Shell | https://gist.github.com/SwitHak/b66db3a06c2955a9cb71a8718970c592
Otro método de identificación sería realizar exploraciones de vulnerabilidades internas/externas, muchas de las cuales ahora proporcionan firmas o complementos para identificar instancias de Log4j vulnerables.
Sophos XDR se puede utilizar para ayudar a identificar dispositivos con posibles archivos JAR Log4j vulnerables, se puede utilizar la siguiente consulta de Live Discover. Dado que Log4j puede integrarse en otras aplicaciones y dependencias, esta consulta sirve como punto de partida para ayudar a las organizaciones a identificar dónde hay instancias de Java ejecutándose en su patrimonio.
Se sugiere comenzar con la ejecución de esta consulta en los servidores para identificar el posible uso de Java en el patrimonio. Estas consultas funcionarán en todos los sistemas operativos.
SELECT DISTINCT name, cwd, cmdline FROM processes WHERE (cmdline LIKE '%Log4j%' OR cmdline LIKE '%java%') AND LOWER(cwd) NOT IN ('c:\windows\', 'c:\windows\system32\', '/')
Ampliando la consulta anterior, podemos enumerar posteriormente versiones posiblemente vulnerables de la biblioteca Log4j con la consulta siguiente. Esta consulta buscará de forma recursiva en el directorio de trabajo de los procesos Java en ejecución para identificar archivos con el nombre `Log4j% .jar`
Nota: Esta consulta omitirá las instancias en las que Log4j esté empaquetado en otros archivos JAR de terceros, así como en archivos JAR con nombre no estándar. Pero puede proporcionar una buena clasificación inicial de una posible exposición.
WITH java_processes AS ( SELECT DISTINCT name, cwd, cmdline FROM processes WHERE (LOWER(cmdline) LIKE '%log4j%' OR LOWER(cmdline) LIKE '%java%') AND LOWER(cwd) NOT IN ('c:\windows\', 'c:\windows\system32\', '/') ) SELECT p.name, p.cwd, p.cmdline, f.path, f.directory, f.filename, CASE WHEN f.filename LIKE 'log4j-1%' THEN 'log4j 1.X is no longer maintained supported, but is not vulnerable to CVE-2021-44228' WHEN f.filename LIKE 'log4j-%-2.17.%.jar 'THEN' Patched against CVE-2021-44228 #log4shell, CVE-2021-45046, and CVE-2021-45105 and on the latest version' WHEN f.filename LIKE 'log4j-%-2.16.%.jar 'THEN 'Patched against CVE-2021-44228 #log4shell and CVE-2021-45046, but susceptible to CVE-2021-45105. Upgrade to log4j 2.17.0' WHEN f.filename LIKE 'log4j-%-2.15.%.jar 'THEN 'Patched against CVE-2021-44228 #log4shell, but susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE 'log4j-%-2.14.%.jar 'THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE 'log4j-%-2.13.%.jar 'THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE 'log4j-%-2.12.%.jar 'THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE 'log4j-%-2.11.%.jar 'THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE 'log4j-%-2.10.%.jar 'THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE 'log4j-%-2.9.%.jar' THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE 'log4j-%-2.8.%.jar' THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE 'log4j-%-2.7.%.jar' THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE 'log4j-%-2.6.%.jar' THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE 'log4j-%-2.5.%.jar' THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE 'log4j-%-2.4.%.jar' THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE' log4j-%-2.3.%.jar' THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE' log4j-%-2.2.%.jar' THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' WHEN f.filename LIKE' log4j-%-2.1.%.jar' THEN 'Not Patched against CVE-2021-44228 #log4shell and susceptible to CVE-2021-45046. Upgrade to log4j 2.17.0' ELSE' Unknown version or unrecognized filename, need to investigate manually' END AS patch_status FROM java_processes p JOIN file f WHERE f.path LIKE p.cwd || '%%' AND f.filename LIKE 'log4j%.jar'
Para resolver el desafío de los archivos JAR anidados, se puede utilizar un escáner local para enumerar las bibliotecas Log4j vulnerables que existen en el sistema de archivos. Se han lanzado varios proyectos de código abierto que sirven para este propósito. Para todos los sistemas identificados anteriormente que tienen un proceso Java en ejecución, se puede realizar un análisis más profundo utilizando las siguientes herramientas de código abierto.
- https://github.com/CERTCC/CVE-2021-44228_scanner
- https://github.com/fox-it/Log4j-finder
- Los pasos que detallan cómo ejecutar la herramienta se pueden encontrar en la sección Downloading and running.
Actualizar versiones vulnerables
La mitigación más completa será la actualización y parchear las bibliotecas Log4j vulnerables descubiertas, pero es comprensible que esto no sea posible en todos los escenarios. Al momento de escribir este artículo, la versión 2.16.0 es la versión más actualizada, y se puede encontrar más información sobre las correcciones para las últimas vulnerabilidades de Log4j en: https://logging.apache.org/Log4j/2.x/security.html.
El 14 de diciembre de 2021 se descubrió un segundo CVE (CVE-2021-45046) en la biblioteca Log4j que hizo que la versión 2.15.0 no fuera efectiva en algunas configuraciones predeterminadas. Para abordar tanto CVE-2021-44228 como CVE-2021-45046, se recomienda actualizar a Log4j versión 2.16.0. En los casos en que la actualización no sea posible, consulta la sección Otras mitigaciones a continuación.
La lista actual de vulnerabilidades conocidas y las correcciones sugeridas es la siguiente:
- CVE-2021-44228 (puntuación CVSS: 10,0) – Una vulnerabilidad de ejecución remota de código que afecta a las versiones de Log4j desde la 2.0-beta9 hasta la 2.14.1 (corregida en la versión 2.15.0)
- CVE-2021-45046 (puntuación CVSS: 9,0) – Una vulnerabilidad de fuga de información y ejecución remota de código que afecta a las versiones de Log4j desde la 2.0-beta9 hasta la 2.15.0, excluyendo la 2.12.2 (Corregida en la versión 2.16.0)
- CVE-2021-45105 (puntuación CVSS: 7,5) – Una vulnerabilidad de denegación de servicio que afecta a las versiones de Log4j desde la 2.0-beta9 hasta la 2.16.0 (corregida en la versión 2.17.0)
Recomendamos seguir los consejos Apache, y actualizar a la versión 2.17.0 de log4j.
Otras mitigaciones
En los casos en los que no sea posible actualizar o identificar la biblioteca Log4j o simplemente como precaución adicional, considere implementar lo siguiente:
- Este ataque requiere que el host afectado realice una conexión saliente inicial con el servidor LDAP malicioso del adversario para cargar la clase Java maliciosa. El bloqueo de los puertos estándar para LDAP, LDAPS y RMI (389, 636, 1099, 1389), aunque no es exhaustivo porque el puerto puede ser aleatorio, puede reducir la superficie de ataque.
- IPS y WAF, si bien se ha demostrado que no son completos debido a las diversas técnicas de evasión que son posibles en este ataque, aún deben implementarse para ayudar con la detección y respuesta.
- Si la versión vulnerable de Log4j no se puede actualizar, en cualquier versión que no sea 2.16.0, puede eliminar la clase JndiLookup de la ruta de clase:
zip -q -d Log4j-core-*.jar org/apache/logging/Log4j/core/lookup/JndiLookup.class
Nota: Las mitigaciones recomendadas anteriormente mediante la configuración de la propiedad “Log4j2.formatMsgNoLookups” o el establecimiento de la variable de entorno “LOG4J_FORMAT_MSG_NO_LOOKUPS” en True, ya no se recomiendan, ya que se ha demostrado que son ineficaces.
Monitoreo y búsqueda de amenazas
Con los desafíos de enumerar completamente el uso de log4j en un patrimonio, las consultas de Data Lake a continuación se pueden usar para buscar procesos sospechosos y conexiones de red.
Procesos sospechosos de Java
Las siguientes consultas de Data Lake enumerarán los procesos hijos sospechosos de Java que deben ser investigados. Esto podría ser una indicación de que una instancia vulnerable de log4 fue explotada con éxito. Cualquier comando sospechoso debe ser investigado más a fondo.
Windows
SELECT meta_hostname, parent_path, parent_sophos_pid, path, sophos_pid, cmdline FROM xdr_data WHERE query_name = 'running_processes_windows_sophos' AND LOWER(parent_name) = 'java.exe' AND name IN ( 'cmd.exe', 'powershell.exe', 'rundll32.exe', 'whoami.exe', 'certutil.exe', 'ipconfig.exe', 'net.exe' )
Linux
Nota: Debido a que tenemos que reconstruir la relación parent / child, puede haber algunas inconsistencias en los resultados debido a la reutilización del ID del proceso.
SELECT DISTINCT X3.meta_hostname AS ep_name, X3.meta_os_platform, replace(replace(CAST(from_unixtime(X3.time) AS VARCHAR),'.000','Z'),' ','T') Date_Time, -- add the T to help excel understand this is a date and time X3.name, X3.cmdline, X3.path, S1.Single_PID||':'||CAST(X3.time AS VARCHAR) AS sophos_pid, S1.Single_PID pid, X4.name Child_Name, X4.cmdline Child_cmdline, X4.path Child_Path, -- WE DID NOT unnest the PIDS so are only showing FIRST PID SPLIT_PART(X4.pids,',',1)||':'||CAST(X4.time AS VARCHAR) AS Child_Sophos_PID, SPLIT_PART(X4.pids,',',1) Child_PID, P1.Single_Parent||':'||CAST(X4.time AS VARCHAR) AS Child_Parent_Sophos_PID, P1.Single_Parent Child_Parent_PID, X3.query_name FROM xdr_data X3 CROSS JOIN UNNEST(SPLIT(X3.pids,',')) AS S1 (Single_PID) LEFT JOIN xdr_data X4 CROSS JOIN UNNEST(SPLIT(X4.parents,',')) AS P1 (Single_Parent) ON P1.Single_Parent = S1.Single_PID AND X4.query_name = 'running_processes_linux_events' AND X3.meta_boot_time = X4.meta_boot_time -- Try and avoid PID collisions AND X4.time <= X3.time AND LOWER(X4.name) IN ('sh', 'bash', 'dash', 'ksh', 'zsh', 'curl', 'wget') WHERE X3.query_name = 'running_processes_linux_events' AND LOWER(X3.name) = 'java'
Tráfico de red saliente inesperado
Esta consulta puede ayudar a identificar el tráfico anormal de los procesos Java a través de los puertos estándar LDAP, RMI y DNS (389, 636, 1099, 1389, 53, 5353). Busca el tráfico con destino a una dirección no RFC1918 sobre el puerto estándar del protocolo. Esto también puede ayudar a identificar dispositivos en los que hay una versión vulnerable de Log4j que llega al servidor LDAP de un adversario. Esto también puede identificar, y lo hará, el tráfico benigno; por lo tanto, los resultados deberán ser validados.
Windows / Linux / OSX
SELECT meta_hostname, name, cmdline, pid, parent, path, remote_address, remote_port, local_address FROM xdr_data WHERE query_name = 'open_sockets' AND (LOWER(name) = 'java.exe' OR LOWER(name) = 'java') AND remote_port IN (389, 636, 1099, 1389, 53, 5353) AND remote_address NOT LIKE '10.%' AND remote_address NOT LIKE '192.168.%.%' AND remote_address NOT LIKE '172.16.%.%' AND remote_address NOT LIKE '172.17.%.%' AND remote_address NOT LIKE '172.18.%.%' AND remote_address NOT LIKE '172.19.%.%' AND remote_address NOT LIKE '172.20.%.%' AND remote_address NOT LIKE '172.21.%.%' AND remote_address NOT LIKE '172.22.%.%' AND remote_address NOT LIKE '172.23.%.%' AND remote_address NOT LIKE '172.24.%.%' AND remote_address NOT LIKE '172.25.%.%' AND remote_address NOT LIKE '172.26.%.%' AND remote_address NOT LIKE '172.27.%.%' AND remote_address NOT LIKE '172.28.%.%' AND remote_address NOT LIKE '172.29.%.%' AND remote_address NOT LIKE '172.30.%.%' AND remote_address NOT LIKE '172.31.%.%' --Exclude localhost AND remote_address NOT LIKE '127.%.%.%' --Exlude self-signed IP Addresses AND remote_address NOT LIKE '169.254.%.%' AND remote_address NOT LIKE '-' AND remote_address NOT LIKE '::1' AND remote_address NOT LIKE '%::%'
En este artículo contribuyeron miembros del equipo de Respuesta a amenazas administradas (Tyler Wojcik)
Recursos
CVE asociados
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45046
Seguridad de registro de Apache
https://logging.apache.org/Log4j/2.x/security.html
Sophos Central Live Discover