Blog Blog

CVE‑2024‑45409

CVE‑2024‑45409

1. 🛡️ Descripción general y contexto

CVE‑2024‑45409 afecta la librería Ruby‑SAML (versiones ≤ 12.2 y entre 1.13.0 y 1.16.0), ampliamente usada por aplicaciones que implementan SAML como mecanismo de autenticación (por ejemplo, GitLab).
Debido a un error en la verificación de firmas XML, un atacante sin credenciales puede forjar respuestas SAML válidas, logrando iniciar sesión como cualquier usuario, incluyendo administradores.
El puntaje asignado es 9.8–10.0 (CRÍTICO). La vulnerabilidad ya fue explotada en entornos reales.

2. 💡 Detalles técnicos del funcionamiento

El fallo radica en cómo Ruby‑SAML extrae el valor del digest del SAML Response usando un XPath excesivamente permisivo:

encoded_digest_value = REXML::XPath.first(
ref,
"//ds:DigestValue",
{ "ds" => DSIG }
)

El // en XPath selecciona el primer elemento DigestValue que encuentre en todo el documento, no necesariamente el que corresponde al SignedInfo. Un atacante puede insertar un DigestValue malicioso antes del bloque legítimo (por ejemplo dentro de samlp:Extensions), lo que hace que se valide respecto al contenido modificado.
El protocolo comprende: se calcula digest sobre el Assertion modificado → se compara con ese DigestValue smuggled → luego se verifica la firma sobre el SignedInfo original (que quedó sin cambios), por lo que la verificación pasa, permitiendo inyección de contenido arbitrario.

3. 🧠 Explotación y vectores de ataque

Requisitos

  • Tener un SAML Response firmada válida (por ejemplo, interceptada al iniciar sesión legítimamente).
  • No se necesitan credenciales.
  • El atacante construye un SAML Response malicioso que usa el mismo contenido del SignedInfo, pero inyecta el digest falso al comienzo.

Flujo de explotación

El atacante obtiene una respuesta SAML válida.

Inyecta un nodo <ds:DigestValue>…</ds:DigestValue> manipulado dentro de samlp:Extensions.

Cambia el contenido de <Assertion> para suplantar un usuario objetivo (ej. admin).

Reenvía la respuesta al Service Provider vulnerable (e.g. GitLab).

Ruby‑SAML extrae el digest falso y pasa la verificación, luego firma pasa, permitiendo login como usuario arbitrario.

Código de exploit (Python, resumido):

https://github.com/CodeBugBox/CodeBugBox/blob/main/CVE%E2%80%912024%E2%80%9145409

Una PoC completa está disponible públicamente ejecutando este proceso y reenviando la respuesta.

4. 🔐 Mitigación y soluciones disponibles

✅ Parche oficial

La vulnerabilidad está corregida en versions ≥ 1.17.0 y 1.12.3 de Ruby‑SAML.
Proveedores como GitLab lanzaron actualizaciones:

  • GitLab CE/EE actualizados a ≤ 16.11.10, 17.0.8, 17.1.8, 17.2.7 y 17.3.3.

⚠️ Workarounds provisionales

  • Habilitar two-factor authentication (MFA) a nivel de aplicación mitiga temporalmente, pero no corrige el vector raíz.
  • Deshabilitar la opción de “bypass SAML 2FA” en aplicaciones vulnerables.

🛠️ Buenas prácticas adicionales

  • Actualizar todas las dependencias que utilicen Ruby‑SAML (como OmniAuth‑SAML).
  • Validar cuidadosamente los flujos SAML y verificar logs de autenticación sospechosa.
  • Implementar monitoreo automatizado que detecte cambios inusuales en respuestas SAML.

5. 🧷 Conclusión y reflexión técnica

CVE‑2024‑45409 demuestra una falla crítica en la implementación de validaciones en protocolos de autenticación: un XPath demasiado permisivo permite engañar al flujo de firma y suplantar identidad sin interactuar.

  • Impacto: acceso no autorizado con privilegios altos.
  • Técnicamente: un clásico caso de “XML signature wrapping” donde se engaña al parser con contenido duplicado.
  • Operacionalmente: afecta a entornos corporativos que dependen de SAML.

🔒 Reflexión técnica: los mecanismos de seguridad deben limitar con precisión qué se valida y qué no. Validaciones amplias como “buscar en todo el XML” pueden ser explotadas. Las mitigaciones deben incluir parche, refactorización del XPath y políticas de auditoría.

Nestor Martin Guerra Garcia (Dr. Plaga)

Nestor Martin Guerra Garcia (Dr. Plaga)

Consultor de Ciberseguridad | Protección de Datos y Gestión de Riesgos | Pentester old school