InfraFenceInfraFence

Live Security Operations

Empezar

CVE-2021-44228 (Log4Shell): comprobar y corregir

Última actualización:

Log4Shell es una vulnerabilidad de ejecución remota de código en Apache Log4j 2, la biblioteca de logging que llevan dentro buena parte de las aplicaciones Java. Cuando una aplicación registra un texto que controla un atacante (una URL, una cabecera, un campo de un formulario) y el texto contiene una búsqueda como ${jndi:ldap://…}, Log4j descarga y ejecuta código del servidor del atacante.

Se explotó pocas horas después de hacerse pública, en diciembre de 2021, y todavía se busca a diario. La biblioteca se esconde dentro de otro software, así que el trabajo es encontrar cada copia en el servidor y después actualizar.

De un vistazo

CVE
CVE-2021-44228
Software
Apache Log4j 2 (log4j-core)
Versiones afectadas
De 2.0-beta9 a 2.14.1, salvo las versiones de seguridad 2.3.1 y 2.12.2 o posteriores
Corregida en
2.15.0 (Java 8), 2.12.2 (Java 7), 2.3.1 (Java 6); actualiza a 2.17.1, 2.12.4 o 2.3.2 o posterior
Puntuación CVSS
10.0 Crítica (NVD, CVSS 3.1) · CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
CISA Known Exploited Vulnerabilities
Sí, añadida el 10 de diciembre de 2021
Publicada por NVD
10 de diciembre de 2021
Parche virtual de InfraFence
vp-cve-2021-44228 (ModSecurity id 9920004)

Qué está afectado

Solo está afectado log4j-core de Log4j 2, y solo desde 2.0-beta9 hasta la corrección. Log4j 1.x no está afectado por esta CVE, pero llegó al final de su vida útil en 2015 y tiene sus propias vulnerabilidades. Las aplicaciones Java basadas en Log4j 2 (servidores de aplicaciones, motores de búsqueda, aplicaciones a medida) llevan la biblioteca en sus propias carpetas, a menudo dentro de un .war o de un .jar fat, no como paquete del sistema.

La primera corrección, 2.15.0, era incompleta en algunas configuraciones (CVE-2021-45046), y después llegaron otros dos problemas (CVE-2021-45105 y CVE-2021-44832). Por eso el objetivo hoy es 2.17.1 o posterior en Java 8, 2.12.4 en Java 7 y 2.3.2 en Java 6.

Comprobar si un servidor lo tiene

Busca archivos log4j-core y después archivos comprimidos que lo incluyan. La versión está en el nombre del archivo:

Cualquier distribución Linux
sudo nice -n 19 ionice -c3 find / -xdev -type f -name 'log4j-core-*.jar' 2>/dev/null
Cualquier distribución Linux (necesita unzip)
sudo nice -n 19 ionice -c3 find / -xdev -type f \( -name '*.jar' -o -name '*.war' -o -name '*.ear' \) 2>/dev/null \
  | while read -r f; do
      unzip -l "$f" 2>/dev/null \
        | grep -qE 'log4j/core/lookup/JndiLookup\.class|log4j-core-[0-9][^/]*\.jar' && echo "$f"
    done

Nota: -xdev limita la búsqueda al sistema de archivos raíz. Repítela en cada otro punto de montaje donde haya aplicaciones (/opt, /srv) y revisa aparte las imágenes de contenedores: un archivo dentro de una imagen no está en el disco del host.

Para una aplicación que compilas tú, pregunta a la herramienta de build qué versión empaqueta realmente:

Proyecto Maven
mvn dependency:tree -Dincludes=org.apache.logging.log4j:log4j-core

Para ver si alguien lo ha intentado, busca las búsquedas JNDI en los logs de acceso del servidor web (los atacantes también las ponen en cabeceras, que estos logs no registran):

Logs de acceso de Apache
sudo grep -rhiE '\$\{jndi|%24%7Bjndi|\$\{\$\{' --include='*access*' --exclude='*.gz' /var/log/apache2 /var/log/httpd 2>/dev/null | tail -20

Corregirlo

  1. Software de un fabricante: instala la versión del fabricante que incluye Log4j 2.17.1 o posterior.
  2. Tu propia aplicación: sube log4j-core (y log4j-api) a 2.17.1 o posterior, o 2.12.4 en Java 7 y 2.3.2 en Java 6, recompila y vuelve a desplegar. Comprueba con la herramienta de build que ninguna otra dependencia vuelva a traer una copia más antigua.
  3. Reinicia la aplicación: una JVM en ejecución conserva las clases antiguas hasta entonces.
  4. Repite la búsqueda de arriba: no debe quedar ningún log4j-core antiguo, tampoco en copias de seguridad de aplicaciones desplegadas que podrían volver a desplegarse.
Maven: fijar la versión corregida
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.17.1</version>
</dependency>

Atención: Definir log4j2.formatMsgNoLookups o quitar clases a mano fueron soluciones provisionales de diciembre de 2021, y la primera no cubre todos los casos. Tómalas como temporales y actualiza.

Cómo la bloquea InfraFence mientras actualizas

El parche virtual para CVE-2021-44228 es una regla ModSecurity que examina la URL, las cabeceras de la petición, las cookies y sus nombres, y los parámetros y sus nombres, después de la decodificación URL. Bloquea una petición con un ${ seguido a pocos caracteres de jndi, o de las búsquedas anidadas que se usan para ocultarlo (${lower:, ${upper:, ${env:, ${sys:, ${date:, ${::-).

Nota: El parche solo ve las peticiones HTTP que pasan por Apache con ModSecurity en ese servidor. Una aplicación Java a la que se llega por su propio puerto, o un payload que llega por otra vía (un email, una cola de mensajes), no está cubierta: la corrección es la actualización.

Cómo se aplica el parche

  1. El agente anota qué puertos SSH y qué sitios responden.
  2. Escribe la regla (id de ModSecurity 9920004) entre sus propios marcadores en su archivo de ModSecurity, ejecuta apachectl configtest y recarga Apache de forma ordenada. Si la prueba falla, vuelve a poner el archivo anterior.
  3. Comprueba que SSH y los sitios siguen respondiendo, y quita el parche si no es así.
  4. Comprueba que ModSecurity bloquea de verdad con la regla, con una petición de prueba local inofensiva. Un ModSecurity en DetectionOnly solo registra: en ese caso el parche se quita y se notifica como ineficaz, nunca como aplicado.

Cada petición que bloquea el parche se notifica con CVE-2021-44228 (agente 1.0.37 o posterior): ves los intentos en la actividad del servidor y en la página Explotación del panel, así sabes que están probando la vulnerabilidad contra ti.

Atención: Un parche virtual bloquea la forma conocida del ataque en las peticiones que pasan por Apache en ese servidor. No sustituye a la actualización: instala la versión corregida y después quita el parche desde Actividad con Deshacer si ya no lo necesitas.

Los parches virtuales necesitan Apache con ModSecurity, el ajuste Permitir cambios en la configuración del servidor web y ningún panel de hosting ni herramienta de gestión de la configuración a cargo del servidor web; forman parte del plan Pro y de AutoMode. Los aplica una persona desde el análisis con IA, o AutoMode. Consulta Parches virtuales.

Fuentes

Los datos de esta página vienen de estas fuentes; consúltalas por si hay cambios.

Pruébalo gratis en 1 servidor

Starter es gratuito para un servidor, con protección completa y bloqueo automático. Sin tarjeta de crédito.

Instala el agente como root, con tu token en lugar de <TOKEN>:

curl -fsSL https://github.com/infrafence/infrafence-agent/releases/latest/download/install.sh | sudo bash -s -- --token <TOKEN>

El token se crea en el panel, en Servidores › Añadir servidor.