Schwachstellenforschung · Deep Dive

Magical 2FA Bypass: zwei Faktoren in der Oberfläche, einer in der API

In einem offensiven Application Assessment stieß Uzair Kaaf auf einen Login-Endpunkt, der gleich nach der Prüfung von Benutzername und Passwort ein voll berechtigtes Sitzungstoken zurückgab, obwohl für das Konto die Zwei-Faktor-Authentifizierung per TOTP aktiv war. Die Weboberfläche fragte den Code ordnungsgemäß ab. Die API hatte die Tür zu diesem Zeitpunkt bereits geöffnet.

Klasse
CWE-287 · CWE-304
Schweregrad
CVSS 3.1: 7,4 (Hoch)
Voraussetzung
Gültiges Passwort des Opfers
Wirkung
Vollständige Kontoübernahme
Auf einen Blick

Der zweite Faktor existierte nur in der Oberfläche

Zwei-Faktor-Authentifizierung soll verhindern, dass ein gestohlenes Passwort allein zum Konto führt. Hier verhinderte sie das nur für Menschen im Browser. Wer die API direkt ansprach, brauchte den zweiten Faktor nicht.

  • 01

    Was passiert

    Der Login-Endpunkt prüft Benutzername und Passwort und gibt sofort ein voll berechtigtes Sitzungstoken aus. Dass noch ein TOTP-Code fehlt, steht nur als Hinweis in derselben Antwort.

  • 02

    Was der Angreifer braucht

    Benutzername und Passwort des Opfers, etwa aus Phishing, Datenlecks oder Credential Stuffing. Das Smartphone oder die Authenticator-App des Opfers braucht er nicht.

  • 03

    Was der Angreifer erreicht

    Alle Rechte des Opferkontos. Im getesteten Fall hatte es die Rolle workspace_admin: Der Angreifer hätte Mandantendaten exportieren, die Abrechnung ändern, Profildaten bearbeiten und Sicherheitsschlüssel neu erzeugen können.

  • 04

    Wie man es einordnet

    Als Improper Authentication (CWE-287) und Missing Critical Step in Authentication (CWE-304). Das Muster dahinter heißt Client-Side Enforcement of Server-Side Security (CWE-602).

Schweregrad nach CVSS 3.1

7,4Hoch

VektorCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N (öffnet externe Website)

Die Angriffskomplexität ist hoch angesetzt, weil der Angreifer zuerst das Passwort des Opfers beschaffen muss; die CVSS-Spezifikation nennt das Beschaffen solcher Geheimnisse als Beispiel für hohe Komplexität. Eigene Berechtigungen braucht er nicht, denn ohne zweiten Faktor soll das Passwort allein nichts freigeben. Alles Weitere gelingt aus dem Netz, ohne Mitwirkung des Opfers.

CWE-287 (öffnet externe Website)CWE-304 (öffnet externe Website)

99,22 %

weniger Risiko einer Kompromittierung: So viel brachte MFA in einer Auswertung von Konten in Microsoft Azure Active Directory. Ein Bypass wie dieser setzt genau diesen Schutz außer Kraft.

How effective is multifactor authentication at deterring cyberattacks? (Mai 2023) (öffnet externe Website)

Die betroffene Plattform wird nicht genannt. Hostnamen, Kennungen und Tokens auf dieser Seite sind verfremdet; Abläufe und Antworten entsprechen dem Befund.

Das Muster

Wo die Prüfung hätte stattfinden müssen

Single-Page-Anwendungen und mobile Apps sprechen über REST- oder GraphQL-APIs mit dem Backend. Gefährlich wird es, wenn ein Teil der Zugangskontrolle der Client-Logik überlassen bleibt.

Beobachtetes Muster

  1. ClientSendet Benutzername und Passwort an den Login-Endpunkt.
  2. ServerAntwortet mit dem vollen Sitzungstoken und dem Hinweis, dass der zweite Faktor noch fehlt.auth_token (scope: admin_access) + "two_factor_required": true
  3. WeboberflächeLiest den Hinweis, zeigt das Eingabefeld für den sechsstelligen Code und wartet.
  4. AngreiferIgnoriert das Eingabefeld und verwendet das Token direkt gegen die API.Zugriff ohne zweiten Faktor

Die Pflicht zum zweiten Faktor galt nur in der Darstellungsschicht, nicht im Protokoll.

Sicheres Muster

  1. ClientSendet Benutzername und Passwort an den Login-Endpunkt.
  2. ServerAntwortet nur mit einem kurzlebigen Challenge-Token, das ausschließlich für die Code-Prüfung taugt.challenge_token (scope: auth:mfa_challenge, 300 s)
  3. ClientSendet den TOTP-Code zusammen mit dem Challenge-Token.
  4. ServerPrüft den Code und gibt erst jetzt das Sitzungstoken mit vollem Umfang aus.auth_token (scope: user:authenticated)

Ohne gültigen Code existiert kein Token, mit dem sich etwas anfangen lässt.

Der Browser verhielt sich korrekt: Er respektierte das Flag und sperrte die Navigation. Weil der Server das Token aber gleichzeitig ausgab, hing die gesamte Schutzwirkung davon ab, dass jeder Client freiwillig mitspielt.

Proof of Concept

Der Angriffsweg in vier Schritten

Anfragen und Antworten sind verfremdet, Ablauf und Inhalte entsprechen dem Befund.

Ein Konto mit aktivem TOTP

Für das Zielkonto war in den Sicherheitseinstellungen die Zwei-Faktor-Authentifizierung per TOTP aktiv. Anmeldeversuche im Browser bestätigten: Ohne den sechsstelligen Code gab die Oberfläche nichts frei.

Nachstellen nur an eigenen Systemen oder mit schriftlicher Freigabe des Betreibers.

Ursache

Zwei Designfehler, ein Ergebnis

Der Fehler steckt nicht in einer einzelnen Codezeile, sondern im Zuschnitt des Anmeldeablaufs.

1

Die Client-Falle

Das Backend ging davon aus, dass jeder Aufruf über die vorgesehene Oberfläche läuft und diese den Ablauf stoppt, sobald two_factor_required auf true steht. Ein Angreifer schreibt sich einfach seinen eigenen Client.

2

Kein kurzlebiges Challenge-Token

Der Authentifizierungsdienst trennte die Phase „Passwort geprüft“ nicht von der Phase „Sitzung freigegeben“. Ein vollwertiges Sitzungstoken darf erst entstehen, wenn alle Faktoren geprüft sind.

Warum der Fehler im Alltag nicht auffällt

Für Nutzer funktioniert alles wie gewollt, und jede Antwort ist ein unauffälliges 200 OK. Sichtbar wird der Fehler erst, wenn jemand den Endpunkt ohne Oberfläche aufruft und die Antwort Feld für Feld liest.

Behebung

So schließen Sie die Lücke

Die erste Maßnahme behebt die Ursache. Die beiden anderen sorgen dafür, dass der Fehler an keiner anderen Stelle zurückkehrt.

  1. 01

    Zweistufiger Login mit kurzlebigem Challenge-Token

    Ist der zweite Faktor aktiv, gibt der Login-Endpunkt nur ein Challenge-Token aus: kurzlebig (etwa fünf Minuten), einmalig nutzbar, an Konto und Anmeldevorgang gebunden und ausschließlich für die Code-Prüfung gültig. Das Sitzungstoken entsteht erst im zweiten Schritt.

    Ablauf in zwei Phasen
    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

    Durchsetzung in Gateway und Middleware

    API-Gateway oder Middleware prüft an jedem Eingang die Claims des Tokens. Geschützte Routen akzeptieren nur Tokens mit dem Scope user:authenticated, ein Challenge-Token (auth:mfa_challenge) erhält dort 401 oder 403. Hält das Sitzungstoken zusätzlich fest, welche Faktoren geprüft wurden, etwa im amr-Claim, kann jeder Dienst das selbst kontrollieren.

    Middleware vor geschützten Routen
    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

    Automatisierte Regressionstests

    End-to-End-Tests melden ein Konto mit aktivem zweitem Faktor per rohem HTTP-Client an, und zwar auf jedem Login-Pfad, und stellen sicher, dass ohne Code kein geschützter Endpunkt erreichbar ist. So fällt ein Rückfall beim nächsten Release auf und nicht erst beim nächsten Angreifer.

    Regressionstest (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)

Ergänzende Härtung

  • Alle Login-Pfade gleich behandelnÄltere API-Versionen, mobile Apps, SSO, Token-Refresh und Passwort-Reset brauchen dieselbe Prüfung. Die OWASP-Empfehlungen zu MFA nennen ausdrücklich separate APIs, über die sich Nutzer anmelden können.
  • Code-Eingaben begrenzenStrikte Grenzen für Fehlversuche bei der Code-Prüfung verhindern, dass sich ein sechsstelliger Code durchprobieren lässt.
  • Challenge-Token eng fassenNach erfolgreicher Prüfung oder wenigen Fehlversuchen verwerfen und nie als Ersatz für ein Sitzungstoken akzeptieren.
  • Auffällige Abläufe protokollierenErfolgreiche Passwortprüfungen ohne anschließende Code-Prüfung, gefolgt von Zugriffen auf sensible Endpunkte, sind ein starkes Signal für Monitoring und SOC.
  • Endpunkte isoliert testenPentests und API-Security-Tests sollten Authentifizierungs-Endpunkte ohne Oberfläche prüfen und jede Antwort auf vorzeitig ausgegebene Tokens untersuchen.

Grundlagen: Multifactor Authentication Cheat Sheet (öffnet externe Website) · SP 800-63B-4, Digital Identity Guidelines: Authentication and Authenticator Management (Juli 2025) (öffnet externe Website) · RFC 6238: TOTP: Time-Based One-Time Password Algorithm (Mai 2011) (öffnet externe Website) · RFC 8176: Authentication Method Reference Values (Juni 2017) (öffnet externe Website)

Selbsttest

Ist Ihre API betroffen?

Acht Fragen für Entwicklungs- und Sicherheitsteams. Der Selbsttest ersetzt keine Prüfung, zeigt aber, wo Sie genauer hinsehen sollten. Ihre Antworten bleiben im Browser.

  1. 01Gibt Ihr Login-Endpunkt bei aktivem zweitem Faktor ausschließlich ein kurzlebiges Challenge-Token zurück?
  2. 02Lehnt jede geschützte Route ein Token ohne abgeschlossenen zweiten Faktor mit 401 oder 403 ab?
  3. 03Hält das Sitzungstoken nachprüfbar fest, welche Faktoren geprüft wurden, zum Beispiel im amr-Claim?
  4. 04Gelten dieselben Regeln für alle Login-Pfade: ältere API-Versionen, mobile Apps, SSO, Token-Refresh und Passwort-Reset?
  5. 05Ist das Challenge-Token einmalig nutzbar, an Konto und Anmeldevorgang gebunden und nach wenigen Minuten abgelaufen?
  6. 06Begrenzen Sie Fehlversuche bei der Code-Eingabe?
  7. 07Gibt es automatisierte Tests, die den Login mit einem rohen HTTP-Client ohne zweiten Faktor durchspielen?
  8. 08Wurden Ihre Authentifizierungs-Endpunkte schon einmal isoliert getestet, also ohne Oberfläche?

Beantwortet: 0/8

Das Ergebnis ist eine Orientierung, kein Prüfnachweis.

Einordnung für GRC und Audit

Wenn MFA nur auf dem Papier wirkt

Viele Regelwerke verlangen Multi-Faktor-Authentifizierung oder starke Zugangskontrollen. Ein Bypass wie dieser heißt: Die Maßnahme ist dokumentiert, wirkt aber nicht.

ISO/IEC 27001

Die Maßnahme „Sichere Authentifizierung“ verlangt sichere Authentifizierungsverfahren, und ein ISMS muss die Wirksamkeit seiner Maßnahmen bewerten. Audits sollten deshalb auch den Login-Ablauf der API betrachten, nicht nur die Konfiguration der Oberfläche.

ISMS nach ISO 27001

Cyber Resilience Act

Ab dem 11. Dezember 2027 müssen Hersteller von Produkten mit digitalen Elementen diese durch geeignete Kontrollen wie Authentifizierung vor unbefugtem Zugriff schützen. Die Meldepflichten für aktiv ausgenutzte Schwachstellen gelten bereits seit dem 11. September 2026. Reine SaaS-Angebote fallen meist nicht darunter, ausgelieferte Apps und Software schon, einschließlich der Backend-Dienste des Herstellers, ohne die sie eine ihrer Funktionen nicht erfüllen könnten.

Verordnung (EU) 2024/2847 (Cyber Resilience Act) (öffnet externe Website)

CRA-Compliance

Diese Einordnung ist keine Rechtsberatung.

Whitepaper · kostenlos

Magical 2FA Bypass – Wirksame MFA für CISOs

Was der Magical 2FA Bypass über API-Authentifizierung lehrt, aufbereitet für Entscheider: Muster und Login-Pfade, Zwei-Phasen-Login und Token-Prüfung, Tests und Nachweise, Fragen an Lieferanten, die regulatorische Einordnung und ein 30-60-90-Tage-Plan.

Cover des Whitepapers „Magical 2FA Bypass – Wirksame MFA für CISOs“
PDF · 22 SeitenDeutsch & EnglischAutor: Uzair Kaaf
  • Zehn Kernaussagen für Vorstand und Revision
  • Anforderungen an Challenge-Token, Gateway und amr-Prüfung
  • Prüfkatalog für alle Login-Pfade und Fragen an SaaS-Anbieter
  • Einordnung für NIS2, ISO 27001, DSGVO und CRA
Kostenloser Download

Whitepaper anfordern

Magical 2FA Bypass – Wirksame MFA für CISOs

Sprachfassung *
Weiterforschen

Verwandte Forschung

Häufige Fragen

Kurz beantwortet

Was ist ein 2FA-Bypass?

Ein Weg, ein durch Zwei-Faktor-Authentifizierung geschütztes Konto zu nutzen, ohne den zweiten Faktor vorzulegen. Beim Magical 2FA Bypass gab die Login-API das Sitzungstoken schon nach der Passwortprüfung aus.

Braucht der Angreifer das Smartphone des Opfers?

Nein. Er braucht nur Benutzername und Passwort, also genau den Fall, gegen den der zweite Faktor eigentlich schützen soll.

Wie prüfe ich, ob meine Anwendung betroffen ist?

Melden Sie ein Testkonto, für das der zweite Faktor aktiv ist, per rohem HTTP-Client am Login-Endpunkt an und lesen Sie die Antwort vollständig. Enthält sie ein Token, das ohne Code geschützte Endpunkte öffnet, ist die Anwendung betroffen. Testen Sie nur eigene Systeme oder solche, für die eine schriftliche Freigabe vorliegt.

Reicht es, das Token aus der Login-Antwort zu entfernen?

Nein. Zusätzlich muss jeder geschützte Endpunkt Tokens ohne abgeschlossenen zweiten Faktor ablehnen. Sonst kehrt der Fehler über einen anderen Pfad zurück, etwa eine ältere API-Version oder den Token-Refresh.

Welche Plattform war betroffen?

Das veröffentlichen wir nicht. Alle Hostnamen, Kennungen und Tokens auf dieser Seite sind verfremdet.

Wie hängt der Befund mit der OWASP API Security Top 10 zusammen?

Er gehört zu API2:2023 Broken Authentication. Die OWASP-Empfehlungen zu MFA nennen separate Login-APIs ausdrücklich als Stelle, an der MFA ebenfalls greifen oder ein anderer Schutz bestehen sollte.

Wie sicher ist Ihr Login-Ablauf?

Wir testen Authentifizierungs-Endpunkte so, wie Angreifer es tun, und zeigen, wo ein Token zu früh entsteht.