Investigación de vulnerabilidades · Deep Dive

Magical 2FA Bypass: dos factores en la interfaz, uno en la API

En una evaluación ofensiva de aplicaciones, Uzair Kaaf dio con un endpoint de inicio de sesión que, nada más recibir el nombre de usuario y la contraseña, devolvía un token de sesión con plenos privilegios, aunque la cuenta tenía activa la autenticación de dos factores mediante TOTP. La interfaz web solicitaba el código como es debido. Para entonces, la API ya había abierto la puerta.

Clase
CWE-287 · CWE-304
Severidad
CVSS 3.1: 7,4 (Alta)
Requisito previo
Contraseña válida de la víctima
Impacto
Toma de control completa de la cuenta
De un vistazo

El segundo factor existía solo en la interfaz

La autenticación de dos factores debe impedir que una contraseña robada dé acceso por sí sola a una cuenta. Aquí solo lo impedía a las personas que usaban un navegador. Quien se dirigía directamente a la API no necesitaba el segundo factor.

  • 01

    Qué ocurre

    El endpoint de inicio de sesión comprueba el nombre de usuario y la contraseña y emite de inmediato un token de sesión con plenos privilegios. El hecho de que aún falte un código TOTP solo aparece como indicación en la misma respuesta.

  • 02

    Qué necesita el atacante

    El nombre de usuario y la contraseña de la víctima, procedentes, por ejemplo, de phishing, filtraciones de datos o credential stuffing. No necesita el teléfono móvil ni la aplicación de autenticación de la víctima.

  • 03

    Qué consigue el atacante

    Todos los permisos de la cuenta de la víctima. En el caso probado, tenía el rol workspace_admin: el atacante habría podido exportar los datos del tenant, modificar la facturación, editar los datos de perfil y regenerar las claves de seguridad.

  • 04

    Cómo se clasifica

    Como Improper Authentication (CWE-287) y Missing Critical Step in Authentication (CWE-304). El patrón subyacente se conoce como Client-Side Enforcement of Server-Side Security (CWE-602).

Severidad según CVSS 3.1

7,4Alta

VectorCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N (abre un sitio web externo)

La complejidad del ataque se ha valorado como alta porque el atacante debe obtener primero la contraseña de la víctima; la especificación de CVSS cita la obtención de este tipo de secretos como ejemplo de complejidad alta. No necesita privilegios propios, porque sin el segundo factor la contraseña por sí sola no debería dar acceso a nada. Todo lo demás se consigue a través de la red, sin intervención de la víctima.

CWE-287 (abre un sitio web externo)CWE-304 (abre un sitio web externo)

99,22 %

menos riesgo de compromiso: eso es lo que aportó la MFA en un análisis de cuentas de Microsoft Azure Active Directory. Un bypass como este anula precisamente esa protección.

How effective is multifactor authentication at deterring cyberattacks? (mayo de 2023) (abre un sitio web externo)

No se menciona la plataforma afectada. Los nombres de host, los identificadores y los tokens de esta página están anonimizados; los flujos y las respuestas se corresponden con el hallazgo.

El patrón

Dónde debió realizarse la comprobación

Las aplicaciones de página única y las apps móviles se comunican con el backend a través de API REST o GraphQL. El peligro surge cuando una parte del control de acceso se deja en manos de la lógica del cliente.

Patrón observado

  1. ClienteEnvía el nombre de usuario y la contraseña al endpoint de inicio de sesión.
  2. ServidorResponde con el token de sesión completo y con la indicación de que aún falta el segundo factor.auth_token (scope: admin_access) + "two_factor_required": true
  3. Interfaz webLee la indicación, muestra el campo para introducir el código de seis dígitos y espera.
  4. AtacanteIgnora el campo de entrada y utiliza el token directamente contra la API.Acceso sin el segundo factor

La obligación del segundo factor solo regía en la capa de presentación, no en el protocolo.

Patrón seguro

  1. ClienteEnvía el nombre de usuario y la contraseña al endpoint de inicio de sesión.
  2. ServidorResponde solo con un token de desafío de corta duración, que no sirve más que para verificar el código.challenge_token (scope: auth:mfa_challenge, 300 s)
  3. ClienteEnvía el código TOTP junto con el token de desafío.
  4. ServidorVerifica el código y solo entonces emite el token de sesión con alcance completo.auth_token (scope: user:authenticated)

Sin un código válido no existe ningún token utilizable.

El navegador se comportó correctamente: respetó el indicador y bloqueó la navegación. Pero como el servidor emitía el token al mismo tiempo, toda la protección dependía de que cada cliente colaborara de forma voluntaria.

Prueba de concepto

La vía de ataque en cuatro pasos

Las solicitudes y las respuestas están anonimizadas; el flujo y los contenidos se corresponden con el hallazgo.

Una cuenta con TOTP activo

En la configuración de seguridad de la cuenta objetivo estaba activa la autenticación de dos factores mediante TOTP. Los intentos de inicio de sesión en el navegador lo confirmaron: sin el código de seis dígitos, la interfaz no daba acceso a nada.

Reprodúzcalo solo en sistemas propios o con la autorización por escrito del operador.

Causa raíz

Dos errores de diseño, un resultado

El fallo no está en una sola línea de código, sino en cómo está concebido el flujo de inicio de sesión.

1

La trampa del cliente

El backend daba por hecho que cada llamada pasa por la interfaz prevista y que esta detiene el flujo en cuanto two_factor_required tiene el valor true. Un atacante, sencillamente, escribe su propio cliente.

2

Sin token de desafío de corta duración

El servicio de autenticación no separaba la fase «contraseña verificada» de la fase «sesión concedida». Un token de sesión completo no debe emitirse hasta que se hayan verificado todos los factores.

Por qué el fallo pasa desapercibido en el día a día

Para los usuarios, todo funciona según lo previsto, y cada respuesta es un discreto 200 OK. El fallo solo se hace visible cuando alguien llama al endpoint sin la interfaz y lee la respuesta campo por campo.

Corrección

Cómo cerrar la brecha

La primera medida elimina la causa raíz. Las otras dos garantizan que el fallo no vuelva a aparecer en ningún otro punto.

  1. 01

    Inicio de sesión en dos pasos con un token de desafío de corta duración

    Si el segundo factor está activo, el endpoint de inicio de sesión solo emite un token de desafío: de corta duración (unos cinco minutos), de un solo uso, vinculado a la cuenta y al proceso de inicio de sesión, y válido únicamente para la verificación del código. El token de sesión no se genera hasta el segundo paso.

    Flujo en dos fases
    POST /api/v5/login{ "username": "…", "password": "…" }→ 200 { "data": { "challenge_token": "ct_…", "scope": "auth:mfa_challenge", "expires_in": 300 } }POST /api/v5/login/verify-2fa{ "challenge_token": "ct_…", "totp_code": "123456" }→ 200 { "data": { "auth_token": "eyJ…", "scope": "user:authenticated" } }
  2. 02

    Aplicación del control en la pasarela y el middleware

    La pasarela de API o el middleware comprueba los claims del token en cada punto de entrada. Las rutas protegidas solo aceptan tokens con el alcance user:authenticated; un token de desafío (auth:mfa_challenge) recibe allí un 401 o un 403. Si, además, el token de sesión registra qué factores se han verificado, por ejemplo en el claim amr, cada servicio puede comprobarlo por sí mismo.

    Middleware delante de las rutas protegidas
    if (!String(token.scope ?? '').split(' ').includes('user:authenticated')) {  return res.status(401).end()}const user = await users.findById(token.sub)if (user.mfaEnabled && !token.amr?.includes('otp')) {  return res.status(403).end()}
  3. 03

    Pruebas de regresión automatizadas

    Las pruebas de extremo a extremo inician sesión con una cuenta que tiene activo el segundo factor mediante un cliente HTTP en bruto, en cada vía de inicio de sesión, y verifican que, sin el código, no se puede acceder a ningún endpoint protegido. Así, una regresión se detecta en el próximo release y no con el próximo atacante.

    Prueba de regresión (pytest)
    LOGIN_PATHS = ["/api/v5/login", "/api/v4/login"]  # every login route, incl. legacy versions@pytest.mark.parametrize("path", LOGIN_PATHS)def test_login_without_second_factor_yields_no_session(client, mfa_user, path):    r = client.post(path, json=mfa_user.credentials)    assert r.status_code == 200    data = r.json()["data"]    assert set(data) <= {"challenge_token", "scope", "expires_in"}    assert data["scope"] == "auth:mfa_challenge"    p = client.get("/api/v5/users/me/profile", headers={"Authorization": "Token " + data["challenge_token"]})    assert p.status_code in (401, 403)

Endurecimiento complementario

  • Tratar igual todas las vías de inicio de sesiónLas versiones anteriores de la API, las apps móviles, el SSO, la renovación de tokens y el restablecimiento de contraseñas necesitan la misma comprobación. Las recomendaciones de OWASP sobre MFA mencionan expresamente las API independientes a través de las cuales los usuarios pueden iniciar sesión.
  • Limitar los intentos de introducir el códigoUnos límites estrictos de intentos fallidos en la verificación del código impiden que un código de seis dígitos pueda averiguarse por fuerza bruta.
  • Acotar el token de desafíoDescartarlo tras una verificación correcta o tras unos pocos intentos fallidos, y no aceptarlo nunca como sustituto de un token de sesión.
  • Registrar los flujos anómalosLas verificaciones de contraseña correctas sin una verificación posterior del código, seguidas de accesos a endpoints sensibles, son una señal de peso para la monitorización y el SOC.
  • Probar los endpoints de forma aisladaLos pentests y las pruebas de seguridad de API deberían examinar los endpoints de autenticación sin la interfaz y analizar cada respuesta en busca de tokens emitidos prematuramente.

Fundamentos: Multifactor Authentication Cheat Sheet (abre un sitio web externo) · SP 800-63B-4, Digital Identity Guidelines: Authentication and Authenticator Management (julio de 2025) (abre un sitio web externo) · RFC 6238: TOTP: Time-Based One-Time Password Algorithm (mayo de 2011) (abre un sitio web externo) · RFC 8176: Authentication Method Reference Values (junio de 2017) (abre un sitio web externo)

Autoevaluación

¿Está afectada su API?

Ocho preguntas para equipos de desarrollo y de seguridad. La autoevaluación no sustituye a una prueba, pero muestra dónde conviene mirar con más detenimiento. Sus respuestas no salen de su navegador.

  1. 01¿Devuelve su endpoint de inicio de sesión únicamente un token de desafío de corta duración cuando el segundo factor está activo?
  2. 02¿Rechaza cada ruta protegida con un 401 o un 403 cualquier token sin el segundo factor completado?
  3. 03¿Registra el token de sesión de forma verificable qué factores se han comprobado, por ejemplo en el claim amr?
  4. 04¿Se aplican las mismas reglas a todas las vías de inicio de sesión: versiones anteriores de la API, apps móviles, SSO, renovación de tokens y restablecimiento de contraseñas?
  5. 05¿Es el token de desafío de un solo uso, está vinculado a la cuenta y al proceso de inicio de sesión y caduca a los pocos minutos?
  6. 06¿Limita los intentos fallidos al introducir el código?
  7. 07¿Hay pruebas automatizadas que reproduzcan el inicio de sesión con un cliente HTTP en bruto y sin el segundo factor?
  8. 08¿Se han probado alguna vez sus endpoints de autenticación de forma aislada, es decir, sin la interfaz?

Respondidas: 0/8

El resultado es una orientación, no una evidencia de auditoría.

Encuadre para GRC y auditoría

Cuando la MFA solo funciona sobre el papel

Muchos marcos normativos exigen autenticación multifactor o controles de acceso robustos. Un bypass como este significa que el control está documentado, pero no surte efecto.

ISO/IEC 27001

El control «Autenticación segura» exige procedimientos de autenticación seguros, y un ISMS debe evaluar la eficacia de sus controles. Por eso, las auditorías deberían examinar también el flujo de inicio de sesión de la API, y no solo la configuración de la interfaz.

ISMS según ISO 27001

Cyber Resilience Act

A partir del 11 de diciembre de 2027, los fabricantes de productos con elementos digitales deberán protegerlos frente al acceso no autorizado mediante controles adecuados, como la autenticación. Las obligaciones de notificación de vulnerabilidades explotadas activamente rigen ya desde el 11 de septiembre de 2026. Las ofertas puramente SaaS no suelen entrar en su ámbito de aplicación; las apps y el software que se distribuyen, sí, incluidos los servicios de back-end del fabricante sin los cuales no podrían cumplir alguna de sus funciones.

Reglamento (UE) 2024/2847 (Cyber Resilience Act) (abre un sitio web externo)

Cumplimiento del CRA

Este encuadre no constituye asesoramiento jurídico.

Whitepaper · gratuito

Magical 2FA Bypass – MFA eficaz para CISOs

Lo que el Magical 2FA Bypass enseña sobre la autenticación de API, preparado para decisores: patrón y vías de inicio de sesión, inicio de sesión en dos fases y validación de tokens, pruebas y evidencias, preguntas a proveedores, encuadre normativo y un plan de 30-60-90 días. Disponible en inglés y alemán.

Portada del whitepaper «Magical 2FA Bypass – Effective MFA for CISOs»
PDF · 22 páginasInglés y alemánAutor: Uzair Kaaf
  • Diez mensajes clave para la dirección y la auditoría interna
  • Requisitos para el token de desafío, la pasarela y la comprobación amr
  • Catálogo de pruebas para cada vía de inicio de sesión y preguntas a proveedores SaaS
  • Encuadre normativo: NIS2, ISO 27001, RGPD y CRA
Descarga gratuita

Solicitar whitepaper

Magical 2FA Bypass – Effective MFA for CISOs

Versión de idioma *
Seguir investigando

Investigación relacionada

Deep Dives 6

Pruebas de penetraciónCómo funciona una prueba de penetración, en qué se diferencia de los escaneos de vulnerabilidades y del red teaming, y qué metodologías, fases y requisitos regulatorios son relevantes a la hora de contratarla.OWASP para equipos devTop 10, ASVS, Cheat Sheet Series, Developer Guide, WSTG, SAMM y herramientas como Dependency-Track y ZAP: qué aporta cada proyecto y cómo estas piezas se combinan en el día a día del desarrollo para formar un proceso continuo.Secure CodingCómo evitar vulnerabilidades de forma sistemática: el mapa actual formado por el CWE Top 25 y el OWASP Top 10:2025, el ASVS 5.0 como marco de requisitos y las prácticas que marcan la diferencia en el día a día del desarrollo.Threat ModelingCómo identificar los riesgos de seguridad ya en la fase de diseño con el marco de las cuatro preguntas, STRIDE, PASTA y árboles de ataque, y cómo anclar el threat modeling de forma permanente en el SDLC y en los equipos ágiles.Zero Trust para agentes de IALos agentes de IA autónomos actúan con permisos legítimamente concedidos a velocidad de máquina. Zero Trust traslada principios probados — verificar en lugar de confiar, Least Privilege, Assume Breach — a los sistemas agénticos.MCP y OAuth 2.1Desde la revisión de la especificación de junio de 2025, el servidor MCP protegido es un resource server OAuth 2.1 con roles claramente separados. Este deep dive explica la cadena de discovery, el registro de clientes, las reglas de tokens y la vinculación de audiencia, y muestra dónde fracasan las implementaciones en la práctica.

Preguntas frecuentes

Respuestas breves

¿Qué es un bypass de 2FA?

Una forma de utilizar una cuenta protegida mediante autenticación de dos factores sin presentar el segundo factor. En el Magical 2FA Bypass, la API de inicio de sesión emitía el token de sesión nada más verificar la contraseña.

¿Necesita el atacante el teléfono móvil de la víctima?

No. Le basta con el nombre de usuario y la contraseña, es decir, precisamente aquello contra lo que, en principio, debería proteger el segundo factor.

¿Cómo compruebo si mi aplicación está afectada?

Con un cliente HTTP en bruto, envíe al endpoint de inicio de sesión las credenciales de una cuenta de prueba que tenga activo el segundo factor y lea la respuesta completa. Si contiene un token que abre endpoints protegidos sin el código, la aplicación está afectada. Realice la prueba solo en sistemas propios o en aquellos para los que disponga de una autorización por escrito.

¿Basta con eliminar el token de la respuesta de inicio de sesión?

No. Además, cada endpoint protegido debe rechazar los tokens sin el segundo factor completado. De lo contrario, el fallo reaparece por otra vía, por ejemplo una versión anterior de la API o la renovación de tokens.

¿Qué plataforma estaba afectada?

No lo hacemos público. Todos los nombres de host, identificadores y tokens de esta página están anonimizados.

¿Qué relación tiene el hallazgo con el OWASP API Security Top 10?

Corresponde a API2:2023 Broken Authentication. Las recomendaciones de OWASP sobre MFA mencionan expresamente las API de inicio de sesión independientes como un punto en el que la MFA también debería aplicarse o en el que debería haber otras protecciones.

¿Hasta qué punto es seguro su flujo de inicio de sesión?

Probamos los endpoints de autenticación como lo hacen los atacantes y le mostramos dónde se genera un token antes de tiempo.