Tu formulario de restablecimiento de contraseña es un cañón de correos gratis
El formulario de restablecimiento de contraseña es probablemente el endpoint menos interesante que tienes. También es el único que un atacante puede apuntar contra cualquiera. El nuestro no tuvo límite de tasa por correo durante un tiempo, y la razón por la que eso importa no es la que imaginarías.
El reflejo, cuando escuchas "endpoint sin autenticación, sin límite de tasa", es pensar en fuerza bruta. Pero no hay nada que forzar por fuerza bruta en una solicitud de restablecimiento. No estás adivinando una contraseña. Envías una dirección de correo y el sistema manda un enlace. Machacarlo no te da acceso a ninguna cuenta. Entonces, ¿a quién perjudica?
La víctima es un tercero. Escribe la dirección de otra persona, [email protected], dale a enviar, repite. Cada solicitud manda un correo real a una bandeja de entrada real que no controlas. Has reclutado nuestro formulario de restablecimiento como una bomba de correos apuntada a alguien que nunca se registró en nada. Y como el correo viene de nosotros, el daño cae en dos sitios a la vez. La bandeja de entrada de la víctima se llena. Y nuestra reputación de envío se lleva el golpe, porque una avalancha de correo no deseado desde nuestro dominio es exactamente lo que vigilan los proveedores de correo. Con suficiente cantidad, nuestro correo legítimo, los enlaces de verificación, los restablecimientos de contraseña reales, empieza a caer en spam para todos los clientes reales que tenemos. Un endpoint sin autenticación, sin credenciales y sin coste para el atacante, degrada un recurso que comparten todos nuestros usuarios.
Así que le pones un límite de tasa. Por dirección de correo, para que no se pueda inundar a un objetivo. Fácil. Salvo que la implementación obvia abre, de forma silenciosa, un agujero distinto.
Si solo aplicas el límite, o solo haces el trabajo, cuando la dirección realmente tiene una cuenta, entonces el endpoint se comporta de forma distinta con las cuentas reales que con las inventadas. Un atacante que pueda ver esa diferencia, en la respuesta, en el código de estado o simplemente en el tiempo, ahora tiene un oráculo de qué direcciones de correo están registradas contigo. Los formularios de restablecimiento son una fuga clásica de enumeración de cuentas precisamente por esto: la solución ingenua para la bomba de correos crea el fallo de enumeración.
La verdadera solución tiene que hacer las dos cosas a la vez, y las dos mitades son independientes. Primero, aplica el límite de tasa sobre la dirección de correo normalizada, exista o no una cuenta. La clave del límite es la propia dirección, en minúsculas y sin espacios sobrantes, de modo que Victim@ y victim@ compartan un mismo cubo, y el contador se aplica antes de haber buscado nada. Ese contador tiene que vivir en un almacén compartido y duradero, no en la memoria de un solo proceso, o se evapora en un reinicio y no hace nada entre varias instancias. Segundo, responde de forma idéntica en todos los casos: el mismo estado, el mismo mensaje "si esa dirección tiene una cuenta, hemos enviado un enlace", la misma forma temporal, sea o no una de tus direcciones. Sigues enviando correo solo cuando hay una cuenta detrás. Pero nada que un extraño pueda observar cambia en función de ese secreto. El límite de tasa protege al tercero; la respuesta constante protege el hecho de quién tiene una cuenta.
La lección general va más allá de los restablecimientos de contraseña. Cualquier endpoint sin autenticación que provoque un efecto secundario en el mundo real, enviar un correo, enviar un SMS, llamar a un webhook, no es solo parte de tu superficie de ataque. Es un arma apuntada a quien esté en el extremo receptor, y la factura por dispararla cae sobre tu reputación, no sobre la del atacante. Aplica el límite de tasa según aquello sobre lo que se actúa, que es el destinatario, no quien hace la llamada. Y hazlo sin permitir que la presencia o ausencia de estado secreto cambie lo que ve un observador.
El formulario de restablecimiento de contraseña parece fontanería. Es la única pieza de fontanería que rociará encantada a cualquiera en el mundo cuando se lo ordenes. Limítalo en consecuencia.
Poner un límite a un endpoint sin autenticación con efectos secundarios sin filtrar quién tiene cuenta es más delicado de lo que parece. Authagonal entrega el flujo de restablecimiento ya con límite de tasa y a prueba de enumeración, para que tu reputación de remitente nunca esté a un bucle de curl de la ruina.