Ihr Passwort-Reset-Formular ist eine kostenlose E-Mail-Kanone
Das Passwort-Reset-Formular ist wahrscheinlich der uninteressanteste Endpunkt, den Sie besitzen. Es ist auch der einzige, den ein Angreifer auf jeden beliebigen Menschen richten kann. Unserer hatte eine Zeit lang kein E-Mail-spezifisches Rate Limit, und der Grund, warum das eine Rolle spielt, ist nicht der, den Sie vermuten würden.
Der Reflex, wenn Sie "nicht authentifizierter Endpunkt, kein Rate Limit" hören, ist, an Brute Force zu denken. Aber bei einer Reset-Anfrage gibt es nichts, was sich per Brute Force knacken ließe. Sie raten kein Passwort. Sie geben eine E-Mail-Adresse an, und das System versendet einen Link. Ihn zu bombardieren bringt Sie in kein Konto. Wer wird also geschädigt?
Das Opfer ist ein Dritter. Tippen Sie die Adresse eines anderen ein, [email protected], drücken Sie auf Senden, wiederholen Sie das. Jede Anfrage schickt eine echte E-Mail an ein echtes Postfach, das Sie nicht kontrollieren. Sie haben unser Reset-Formular zu einer Mailbombe zwangsverpflichtet, gerichtet auf jemanden, der sich nie für irgendetwas angemeldet hat. Und weil die Mail von uns kommt, schlägt der Schaden an zwei Stellen gleichzeitig ein. Das Postfach des Opfers läuft voll. Und unsere Sender-Reputation nimmt Schaden, denn eine Flut unerwünschter Mail von unserer Domain ist genau das, worauf Mailbox-Provider achten. Genug davon, und unsere legitime Mail, Verifizierungslinks, tatsächliche Passwort-Resets, beginnt für jeden echten Kunden, den wir haben, im Spam zu landen. Ein nicht authentifizierter Endpunkt, ohne Zugangsdaten und ohne Kosten für den Angreifer, verschlechtert eine Ressource, die alle unsere Nutzer teilen.
Also drosseln Sie ihn per Rate Limit. Pro E-Mail-Adresse, damit ein einzelnes Ziel nicht überflutet werden kann. Einfach. Nur dass die naheliegende Umsetzung ganz nebenbei ein anderes Loch aufreißt.
Wenn Sie das Limit nur dann anwenden, oder die Arbeit nur dann erledigen, wenn die Adresse tatsächlich ein Konto hat, dann verhält sich der Endpunkt bei echten Konten anders als bei erfundenen. Ein Angreifer, der diesen Unterschied erkennen kann, in der Antwort, im Statuscode oder auch nur im Timing, hat jetzt ein Orakel dafür, welche E-Mail-Adressen bei Ihnen registriert sind. Reset-Formulare sind aus genau diesem Grund ein klassisches Account-Enumeration-Leck: die naive Lösung für die Mailbombe erzeugt den Enumeration-Bug.
Die echte Lösung muss beides gleichzeitig tun, und die beiden Hälften sind getrennt. Erstens: Rate-Limit auf der normalisierten E-Mail-Adresse, unabhängig davon, ob ein Konto existiert. Der Limit-Schlüssel ist die Adresse selbst, kleingeschrieben und getrimmt, damit sich Victim@ und victim@ einen Zähler teilen, und der Zähler wird angewendet, bevor Sie irgendetwas nachgeschlagen haben. Dieser Zähler muss in einem dauerhaften, gemeinsam genutzten Speicher liegen, nicht im Arbeitsspeicher eines einzelnen Prozesses, sonst verpufft er bei einem Neustart und bewirkt über mehrere Instanzen hinweg gar nichts. Zweitens: In jedem Fall identisch antworten: derselbe Status, dieselbe Nachricht "falls diese Adresse ein Konto hat, haben wir einen Link gesendet", dieselbe Timing-Form, egal ob die Adresse eine von Ihren ist oder nicht. Sie versenden weiterhin nur dann tatsächlich Mail, wenn ein Konto dahintersteht. Aber nichts, was ein Außenstehender beobachten kann, verändert sich auf Basis dieses Geheimnisses. Das Rate Limit schützt den Dritten; die konstante Antwort schützt die Tatsache, wer ein Konto hat.
Die allgemeine Lehre reicht über Passwort-Resets hinaus. Jeder nicht authentifizierte Endpunkt, der einen realen Nebeneffekt auslöst, das Versenden einer E-Mail, das Versenden einer SMS, das Aufrufen eines Webhooks, ist nicht bloß Teil Ihrer Angriffsfläche. Er ist eine Waffe, gerichtet auf denjenigen, der am empfangenden Ende sitzt, und die Rechnung fürs Abfeuern landet bei Ihrer Reputation, nicht bei der des Angreifers. Rate-Limit nach dem, worauf eingewirkt wird, also nach dem Empfänger, nicht nach dem Aufrufer. Und tun Sie es, ohne dass das Vorhandensein oder Fehlen geheimen Zustands verändert, was ein Beobachter sieht.
Das Passwort-Reset-Formular fühlt sich an wie Sanitärinstallation. Es ist das eine Stück Rohrleitung, das auf Kommando bereitwillig jeden Menschen der Welt beschießt. Bemessen Sie es entsprechend.
Einen nicht authentifizierten Nebeneffekt-Endpunkt zu drosseln, ohne zu verraten, wer ein Konto hat, ist kniffliger, als es aussieht. Authagonal liefert den Reset-Flow bereits mit Rate Limit und enumeration-sicher aus, sodass Ihre Sender-Reputation nie nur eine curl-Schleife vom Ruin entfernt ist.