InfraFenceInfraFence

Live Security Operations

Empezar

CVE-2017-5638: RCE por Content-Type en Apache Struts 2, comprobar y corregir

Última actualización:

En Apache Struts 2, el parser multipart Jakarta construye el mensaje de error de una subida fallida a partir de la cabecera Content-Type y lo evalúa como OGNL. Un atacante envía una petición con una expresión OGNL en esa cabecera y ejecuta comandos en el servidor, sin iniciar sesión.

Se explotó de forma activa desde marzo de 2017 y se usó en grandes robos de datos. Muchas empresas siguen ejecutando aplicaciones Struts antiguas, así que los escaneos continúan.

De un vistazo

CVE
CVE-2017-5638
Software
Apache Struts 2
Versiones afectadas
De 2.3.5 a 2.3.31, de 2.5 a 2.5.10
Corregida en
2.3.32, 2.5.10.1
Puntuación CVSS
9.8 Crítica (NVD, CVSS 3.1) · CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CISA Known Exploited Vulnerabilities
Sí, añadida el 3 de noviembre de 2021
Publicada por NVD
11 de marzo de 2017
Parche virtual de InfraFence
vp-cve-2017-5638 (ModSecurity id 9920007)

Qué está afectado

Según el boletín S2-045 de Apache: Struts de 2.3.5 a 2.3.31 y de 2.5 a 2.5.10, con el parser multipart Jakarta predeterminado. Struts es una biblioteca dentro de aplicaciones web Java (struts2-core-*.jar), no un paquete del sistema.

Comprobar si un servidor lo tiene

Busca la biblioteca y las aplicaciones que la incluyen; la versión está en el nombre:

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

Corregirlo

  1. Actualiza Struts como mínimo a 2.3.32 o 2.5.10.1, las versiones que lo corrigieron. Las dos ramas llevan mucho tiempo sin soporte: planifica el paso a una versión de Struts con soporte, que además cierra las vulnerabilidades posteriores.
  2. Recompila y vuelve a desplegar la aplicación, y después reiníciala.
  3. Si no puedes actualizar enseguida, el boletín de Apache da dos soluciones alternativas: un filtro de servlet que rechace las peticiones cuyo Content-Type no sea un simple multipart/form-data, o cambiar a otro parser multipart.

Atención: Una aplicación que tuvo un Struts vulnerable expuesto a internet puede haber sido comprometida hace años: busca cuentas desconocidas, tareas programadas y web shells.

Cómo la bloquea InfraFence mientras actualizas

El parche virtual para CVE-2017-5638 es una regla ModSecurity sobre la cabecera Content-Type de la petición: bloquea una cabecera que contenga %{ o ${, el comienzo de una expresión OGNL. Un Content-Type legítimo nunca contiene ninguno de los dos.

Nota: Al mismo fallo también se llega a través de las cabeceras Content-Disposition y Content-Length de una subida (CVE-2017-5638 las incluye; el S2-046 de Apache las describe). El parche solo comprueba Content-Type, la forma explotada de forma activa. La actualización las cubre todas.

Cómo se aplica el parche

  1. El agente anota qué puertos SSH y qué sitios responden.
  2. Escribe la regla (id de ModSecurity 9920007) 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-2017-5638 (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.