Security Operations

Última actualización 2021-12-20 UTC 20:06

Actualización: se agregó una nueva herramienta de escaneo de código abierto, se ajustó consulta de sockets abiertos

Actualización: Se agregó información sobre log4j 2.17.0, se ajustó la consulta para enumerar más versiones de log4j

 

Resumen y antecedentes

Log4j es un framework de logueo de código abierto desarrollado por Apache Foundation que se incorpora en muchas aplicaciones basadas en Java tanto en servidores como en sistemas de usuario final. Lanzado inicialmente, el 9 de diciembre de 2021, Log4Shell (el apodo dado a esta vulnerabilidad) es un problema generalizado debido a la naturaleza integrada de Log4j en muchas aplicaciones. Se clasifica como una vulnerabilidad de ejecución remota de código no autenticado y se incluye en CVE-2021-44228.

El código de prueba de concepto y de weaponización estuvieron disponibles casi inmediatamente después de la publicación.

Desde NIST:

Apache Log4j2 2.0-beta9 a 2.12.1 y 2.13.0 a 2.15.0 Las funciones JNDI utilizadas en la configuración, los mensajes de registro y los parámetros no protegen contra un LDAP controlado por atacantes y otros puntos finales 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.

Para obtener más detalles de esta vulnerabilidad, consulte el artículo de Sophos News: Dentro del código: 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 existe dentro de su entorno y en dónde. Incluso más específicamente, enfocá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 existe Java, la 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. Revise estas listas y determine si el software está presente en su entorno. Si es así, asegúrese de haber aplicado los últimos parches.

Otro método de identificación sería realizar escaneos de vulnerabilidades internos/externas, muchos 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 existen instancias de Java ejecutándose en su entorno.

Se sugiere comenzar con la ejecución de esta consulta en los servidores para identificar el posible uso de Java. 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 (cmdline LIKE '%Log4j%' OR 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.

Actualizar versiones vulnerables

La mitigación más completa será la actualización y el parcheo de 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, consulte la sección Otras mitigaciones a continuación.

ACTUALIZACIÓN: La lista actualizada de vulnerabilidades conocidas y correcciones sugeridas a continuación:

  • CVE-2021-44228 (CVSS score: 10.0) – Vulnerabilidad de ejecución de código remoto que afecta versiones de Log4j desde 2.0-beta9 hasta 2.14.1 (Corregido en versión 2.15.0)
  • CVE-2021-45046 (CVSS score: 9.0) – Vulnerabilidad de fuga de información y ejecución de código remoto que afecta versiones de Log4j desde 2.0-beta9 hasta 2.15.0, excluyendo 2.12.2 (Corregido en versión 2.16.0)
  • CVE-2021-45105 (CVSS score: 7.5) – Vulnerabilidad de denegación de servicio que afecta versiones de Log4j desde 2.0-beta9 hasta 2.16.0 (Corregido en versión 2.17.0)

Se sugiere seguir la recomendación de Apache, y actualizar a log4j versión 2.17.0


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:

  1. Este ataque requiere que el host afectado realice una conexión saliente inicial con el servidor LDAP malicioso del adversario para cargar la clase de 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.
  2. 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.
  3. 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 desde el classpath:
zip -q -d Log4j-core-*.jar org/apache/logging/Log4j/core/lookup/JndiLookup.class

Nota: Las recomendaciones de mitigación indicadas previamente sobre configurar adecuadamente  “Log4j2.formatMsgNoLookups” o establecer la variable de ambiente “LOG4J_FORMAT_MSG_NO_LOOKUPS” como “True”, no son actualmente validas, ya que se ha comprobado que son inefectivas.


Monitoreo y caza de amenazas
Con los desafíos de enumerar completamente el uso de log4j en un entorno, las consultas de Data Lake a continuación se pueden usar para buscar procesos sospechosos y conexiones de red.

Procesos sospechosos de generación de Java

Las consultas de Data Lake a continuación enumerarán los procesos secundarios sospechosos de Java que deben investigarse. Esto podría ser una indicación de que una instancia de log4 vulnerable fue explotada con éxito. Cualquier comando sospechoso debe investigarse 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 padre/hijo, puede haber algunas inconsistencias en los resultados debido a la reutilización de IDs de 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 de Java sobre los puertos estándar LDAP, RMI y DNS (389, 636, 1099, 1389, 53, 5353). Busca tráfico con destino a una dirección que no sea RFC1918 a través del puerto estándar del protocolo. Esto también puede ayudar a identificar dispositivos donde hay una versión vulnerable de Log4j que se comunica con el servidor LDAP de un adversario. Esto identificará también el tráfico benigno; por lo tanto, será necesario validar los resultados.

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 '%::%'

Las contribuciones a este artículo fueron realizadas por miembros del equipo de Managed Threat Response de Sophos (Tyler Wojcik)


Recursos

CVE asociados

Apache Logging Security

Sophos Central Live Discover

Leave a Reply

Your email address will not be published. Required fields are marked *