flawopen.com/Incidents/log4shell-jndi-injection-december-2021
Log4Shell (CVE-2021-44228): causa y solución
CVE-2021-44228 permitía que datos registrados activaran lookups de Log4j 2 y carga de clases vía JNDI. Actualice Log4j y localice copias incluidas.[1], [2], [4]
Una oficina tiene un empleado cuya única tarea es anotar lo que dicen los visitantes. Alguien descubre que, si un visitante pronuncia cierta frase, el empleado deja de escribir, va a una dirección mencionada en la frase, recoge un sobre cerrado de manos de un desconocido y sigue las instrucciones que contiene. El empleado solo debía tomar nota.[1]
Conceptos Clave y Términos
Lookups en mensajes- Una función de Log4j 2 que sustituía expresiones ${...} dentro de los mensajes de registro por valores al registrar. Antes de la 2.15.0 se aplicaba también a los datos del mensaje, no solo al patrón configurado.[1]
JNDI- Java Naming and Directory Interface, una API para buscar objetos en servicios de directorio como LDAP. Un lookup JNDI a un servidor remoto podía devolver una clase para que la JVM la cargara.[1]
Inyección de expresiones (CWE-917)- Datos no confiables llegan a un evaluador de expresiones, de modo que un texto aportado como dato se ejecuta como instrucción.[1]
Dependencia transitiva- Una biblioteca que tu aplicación incluye solo porque otra depende de ella. Muchas exposiciones a Log4Shell venían de copias de Log4j que nadie tenía inventariadas.[4]
Mapeos de marcos
- Referencia CWE para la debilidad descrita en esta guía: CWE-20 CWE-502 CWE-917
- D3-OTF Filtrado del tráfico saliente — La restricción de red saliente de esta guía limita los destinos a los que puede acceder el servicio o el host.
- CISA KEV — añadido el 2021-12-10 — CVE-2021-44228
Cronología del Incidente
Chen Zhaojun, de Alibaba Cloud Security, notifica el fallo en privado a Apache.[1]
CISA emite la Emergency Directive 22-02, que obliga a las agencias federales de EE. UU. a localizar y mitigar Log4j.[3]
Log4j 2.17.1 corrige CVE-2021-44832, la última de tres CVE posteriores a la 2.15.0 (CVE-2021-45046 y CVE-2021-45105).[1]
Flujo de Ataque Paso a Paso
El texto del atacante llega a una llamada de registro
Cualquier valor que la aplicación registre, como un nombre de usuario, una cabecera o un término de búsqueda, puede llevar una expresión de lookup elegida por el atacante.[1]
Código Fuente: Vulnerable vs. Seguro
Configuración de Maven ilustrativa. Importar log4j-bom hace que todos los módulos de Log4j, incluidas las copias que traen otras bibliotecas, se resuelvan a una única versión actual. La regla de enforcer hace fallar la compilación si aún se alcanza algún log4j-core anterior a la 2.17.1, también de forma transitiva, para que una dependencia nueva no reintroduzca en silencio el código vulnerable. Actualizar es la corrección real; bloquear LDAP y RMI salientes en los servidores de aplicaciones es la defensa en profundidad que cortó la explotación incluso donde el parche se retrasó.
<!-- pom.xml: a direct dependency pinned to a vulnerable release -->
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
</dependencies>
<!-- Nothing stops another library from pulling in an older log4j-core transitively. -->
<!-- pom.xml: one version for every Log4j module, and a build that fails on old ones -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-bom</artifactId>
<version>2.24.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<id>ban-vulnerable-log4j</id>
<goals><goal>enforce</goal></goals>
<configuration>
<rules>
<bannedDependencies>
<searchTransitive>true</searchTransitive>
<excludes>
<exclude>org.apache.logging.log4j:log4j-core:[2.0-beta9,2.17.1)</exclude>
</excludes>
</bannedDependencies>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Lista de Verificación de Seguridad para Ingeniería
- ✓Actualiza log4j-core a 2.17.1 o posterior (2.12.4 en Java 7, 2.3.2 en Java 6) y haz fallar las compilaciones que resuelvan una versión anterior en cualquier punto del árbol de dependencias.[1]
- ✓Genera un SBOM en cada compilación y guárdalo con el artefacto, para cruzar un aviso futuro con los servicios afectados en minutos.[4], [3]
- ✓Analiza los artefactos desplegados, no solo los repositorios de código: los JAR sombreados y empaquetados ocultaron Log4j de los manifiestos de dependencias en muchos productos.[4]
- ✓Aplica salida denegada por defecto a los servidores de aplicaciones; la explotación necesitaba LDAP, RMI y DNS salientes hacia hosts arbitrarios.[4], [3]
- ✓Cuando se corrige un fallo estructural, espera CVE posteriores y mantén abierto el incidente hasta que se estabilicen las correcciones del proveedor.[1]
Fuentes
- Apache Log4j — vulnerabilidades de seguridad (CVE-2021-44228 y posteriores)
- CVE-2021-44228 — registro CVE
- CISA — Emergency Directive 22-02: mitigar la vulnerabilidad de Apache Log4j
- CISA — guía sobre la vulnerabilidad de Apache Log4j
- ¿Es seguro ObjectInputStream de Java con datos no confiables?
- Inyección de comandos — referencia completa de la clase