Bypass de OTP mediante variaciones de mayúsculas en la dirección de correo
La aplicación trataba cada variación de mayúsculas de la dirección de correo como una identidad distinta. Cada una recibía su propio código OTP y su propio contador de intentos.
Resumen
RFC 5321 permite que la parte local sea sensible a mayúsculas y, a la vez, desaconseja explotar esa distinción. Los proveedores de correo habituales entregan todas las variantes al mismo buzón. La aplicación no normalizaba la dirección antes de emitir el código.
Un atacante podía mantener decenas de códigos válidos a la vez para la misma cuenta. Los intentos disponibles contra el segundo factor crecían en esa misma proporción, y el límite de tres intentos dejaba de proteger la cuenta.
Detalles técnicos
Generación de códigos paralelos
Cada variación de mayúsculas producía un código propio:
POST /api/auth/request-otp { "email": "victim@company.com" } -> código A
POST /api/auth/request-otp { "email": "Victim@company.com" } -> código B
POST /api/auth/request-otp { "email": "VICTIM@company.com" } -> código C
POST /api/auth/request-otp { "email": "vIctim@company.com" } -> código D
...
Todos llegan al mismo buzón: victim@company.com
Cada variación tiene su propio límite de 3 intentosEfecto sobre la fuerza bruta
La parte local del ejemplo tiene seis letras: 64 variaciones posibles, una por cada combinación de mayúsculas y minúsculas. Solo cuentan los caracteres alfabéticos. Cada variación habilita un código válido con tres intentos:
Código OTP: 6 dígitos -> 1.000.000 de combinaciones
Límite normal: 3 intentos por código -> 0,0003 % de éxito
Con el bypass:
- 64 variaciones de mayúsculas x 1 código cada una = 64 códigos válidos
- Cualquiera de ellos sirve para la misma cuenta
- 64 códigos x 3 intentos = 192 intentos por ronda
P(éxito por ronda) = 1 - (1 - 1/1.000.000)^192 ~ 0,019 %
Repitiendo cada 60 s -> en 1 hora ~ 1,1 %, frente al 0,018 % sin el bypassLa emisión en paralelo también anula el aviso al usuario: la víctima recibe decenas de correos de código legítimos. Ya no puede distinguir un intento de acceso ajeno de una petición propia.
Impacto
- Bypass del segundo factor por multiplicación de códigos válidos
- Evasión del límite de intentos al generar identidades distintas para el mismo buzón
- Acceso no autorizado a cuentas protegidas con OTP por correo
- Saturación del buzón de la víctima con un correo de código por cada variación
Remediación
- Normalizar la dirección de correo a minúsculas antes de cualquier operación.
- Aplicar el límite de intentos sobre el correo normalizado, no sobre la cadena tal cual llega.
- Limitar los códigos activos. Invalidar el anterior al generar uno nuevo para el mismo buzón.
- Aplicar bloqueo progresivo cuando se acumulen intentos fallidos sobre el mismo buzón, sea cual sea la variante empleada.
- Migrar a TOTP. Los códigos basados en tiempo no dependen del buzón de correo ni de su entrega.
Referencias
Más análisis
Este vector aparece en cualquier aplicación que no normalice la dirección de correo
Cuéntanos qué activos quieres auditar. Respondemos en menos de 24 horas.