Recherche de vulnérabilités · Deep Dive

Magical 2FA Bypass : deux facteurs dans l'interface, un seul dans l'API

Lors d'une évaluation offensive de la sécurité d'une application, Uzair Kaaf est tombé sur un point de terminaison de connexion qui renvoyait immédiatement, sur la seule base du nom d'utilisateur et du mot de passe, un jeton de session doté de tous les droits, alors même que l'authentification à deux facteurs par TOTP était activée pour le compte. L'interface web demandait le code en bonne et due forme. À ce moment-là, l'API avait déjà ouvert la porte.

Classe
CWE-287 · CWE-304
Gravité
CVSS 3.1 : 7,4 (élevée)
Prérequis
Mot de passe valide de la victime
Impact
Prise de contrôle complète du compte
En bref

Le second facteur n'existait que dans l'interface

L'authentification à deux facteurs doit empêcher qu'un mot de passe volé permette, à lui seul, d'accéder au compte. Ici, elle ne l'empêchait que pour les personnes passant par un navigateur. Quiconque s'adressait directement à l'API n'avait pas besoin du second facteur.

  • 01

    Ce qui se passe

    Le point de terminaison de connexion vérifie le nom d'utilisateur et le mot de passe, puis émet immédiatement un jeton de session doté de tous les droits. Le fait qu'un code TOTP manque encore n'apparaît que sous forme d'indication dans cette même réponse.

  • 02

    Ce dont l'attaquant a besoin

    Le nom d'utilisateur et le mot de passe de la victime, obtenus par exemple par phishing, lors de fuites de données ou par credential stuffing. Il n'a besoin ni du smartphone ni de l'application d'authentification de la victime.

  • 03

    Ce que l'attaquant obtient

    Tous les droits du compte de la victime. Dans le cas testé, il disposait du rôle workspace_admin : l'attaquant aurait pu exporter les données du locataire, modifier la facturation, éditer les données de profil et régénérer les clés de sécurité.

  • 04

    Comment le classer

    Il relève des catégories Improper Authentication (CWE-287) et Missing Critical Step in Authentication (CWE-304). Le schéma sous-jacent porte le nom de Client-Side Enforcement of Server-Side Security (CWE-602).

Gravité selon CVSS 3.1

7,4Élevée

VecteurCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N (ouvre un site externe)

La complexité d'attaque est jugée élevée, car l'attaquant doit d'abord se procurer le mot de passe de la victime ; la spécification CVSS cite l'obtention de tels secrets comme exemple de complexité élevée. Il n'a besoin d'aucun privilège propre, car sans second facteur, le mot de passe seul n'est censé rien débloquer. Tout le reste s'effectue via le réseau, sans intervention de la victime.

CWE-287 (ouvre un site externe)CWE-304 (ouvre un site externe)

99,22 %

de réduction du risque de compromission : c'est ce qu'a apporté la MFA dans une analyse de comptes Microsoft Azure Active Directory. Un contournement comme celui-ci neutralise précisément cette protection.

How effective is multifactor authentication at deterring cyberattacks? (mai 2023) (ouvre un site externe)

La plateforme concernée n'est pas nommée. Les noms d'hôte, identifiants et jetons figurant sur cette page ont été modifiés ; les flux et les réponses correspondent au constat.

Le schéma

Là où le contrôle aurait dû avoir lieu

Les applications monopages et les applications mobiles communiquent avec le backend via des API REST ou GraphQL. Cela devient dangereux lorsqu'une partie du contrôle d'accès reste confiée à la logique côté client.

Schéma observé

  1. ClientEnvoie le nom d'utilisateur et le mot de passe au point de terminaison de connexion.
  2. ServeurRépond avec le jeton de session complet et l'indication que le second facteur manque encore.auth_token (scope: admin_access) + "two_factor_required": true
  3. Interface webLit l'indication, affiche le champ de saisie du code à six chiffres et attend.
  4. AttaquantIgnore le champ de saisie et utilise directement le jeton contre l'API.Accès sans second facteur

L'exigence du second facteur ne s'appliquait que dans la couche de présentation, pas dans le protocole.

Schéma sécurisé

  1. ClientEnvoie le nom d'utilisateur et le mot de passe au point de terminaison de connexion.
  2. ServeurRépond uniquement par un jeton de challenge à courte durée de vie, valable exclusivement pour la vérification du code.challenge_token (scope: auth:mfa_challenge, 300 s)
  3. ClientEnvoie le code TOTP accompagné du jeton de challenge.
  4. ServeurVérifie le code et n'émet qu'à ce stade le jeton de session de portée complète.auth_token (scope: user:authenticated)

Sans code valide, aucun jeton exploitable n'existe.

Le navigateur s'est comporté correctement : il a respecté l'indicateur et bloqué la navigation. Mais comme le serveur émettait le jeton en même temps, toute l'efficacité de la protection reposait sur la coopération volontaire de chaque client.

Preuve de concept

Le chemin d'attaque en quatre étapes

Les requêtes et les réponses ont été modifiées ; le déroulement et le contenu correspondent au constat.

Un compte avec TOTP activé

Dans les paramètres de sécurité du compte cible, l'authentification à deux facteurs par TOTP était activée. Des tentatives de connexion dans le navigateur l'ont confirmé : sans le code à six chiffres, l'interface ne donnait accès à rien.

À reproduire uniquement sur vos propres systèmes ou avec l'autorisation écrite de l'exploitant.

Cause

Deux erreurs de conception, un seul résultat

L'erreur ne réside pas dans une ligne de code isolée, mais dans la façon dont le flux de connexion a été conçu.

1

Le piège côté client

Le backend partait du principe que chaque appel passait par l'interface prévue et que celle-ci interrompait le flux dès que two_factor_required valait true. Un attaquant écrit tout simplement son propre client.

2

Pas de jeton de challenge à courte durée de vie

Le service d'authentification ne séparait pas la phase « mot de passe vérifié » de la phase « session accordée ». Un jeton de session complet ne doit être émis qu'une fois tous les facteurs vérifiés.

Pourquoi l'erreur passe inaperçue au quotidien

Pour les utilisateurs, tout fonctionne comme prévu, et chaque réponse est un 200 OK anodin. L'erreur ne devient visible que lorsque quelqu'un appelle le point de terminaison sans l'interface et lit la réponse champ par champ.

Correction

Comment combler la faille

La première mesure élimine la cause. Les deux autres veillent à ce que l'erreur ne réapparaisse nulle part ailleurs.

  1. 01

    Connexion en deux étapes avec un jeton de challenge à courte durée de vie

    Lorsque le second facteur est activé, le point de terminaison de connexion n'émet qu'un jeton de challenge : à courte durée de vie (environ cinq minutes), à usage unique, lié au compte et à la tentative de connexion, et valable uniquement pour la vérification du code. Le jeton de session n'est créé qu'à la deuxième étape.

    Flux en deux phases
    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

    Application du contrôle dans la passerelle et le middleware

    La passerelle d'API ou le middleware vérifie les claims du jeton à chaque point d'entrée. Les routes protégées n'acceptent que les jetons dotés du scope user:authenticated ; un jeton de challenge (auth:mfa_challenge) y reçoit un 401 ou un 403. Si le jeton de session consigne en outre les facteurs vérifiés, par exemple dans le claim amr, chaque service peut le contrôler lui-même.

    Middleware devant les routes protégées
    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

    Tests de régression automatisés

    Des tests de bout en bout connectent, avec un client HTTP brut et sur chaque chemin de connexion, un compte dont le second facteur est activé, et s'assurent qu'aucun point de terminaison protégé n'est accessible sans le code. Une régression est ainsi repérée dès la prochaine version, et non par le prochain attaquant.

    Test de régression (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)

Durcissement complémentaire

  • Traiter tous les chemins de connexion de la même manièreLes anciennes versions d'API, les applications mobiles, le SSO, le rafraîchissement de jeton et la réinitialisation du mot de passe nécessitent le même contrôle. Les recommandations de l'OWASP sur la MFA citent explicitement les API distinctes par lesquelles les utilisateurs peuvent se connecter.
  • Limiter les saisies de codeDes limites strictes au nombre de tentatives échouées lors de la vérification du code empêchent de trouver un code à six chiffres en essayant toutes les combinaisons.
  • Encadrer strictement le jeton de challengeL'invalider après une vérification réussie ou quelques tentatives échouées, et ne jamais l'accepter en remplacement d'un jeton de session.
  • Journaliser les flux inhabituelsDes vérifications de mot de passe réussies sans vérification de code consécutive, suivies d'accès à des points de terminaison sensibles, constituent un signal fort pour la supervision et le SOC.
  • Tester les points de terminaison isolémentLes tests d'intrusion et les tests de sécurité des API devraient examiner les points de terminaison d'authentification sans passer par l'interface et inspecter chaque réponse à la recherche de jetons émis prématurément.

Références : Multifactor Authentication Cheat Sheet (ouvre un site externe) · SP 800-63B-4, Digital Identity Guidelines: Authentication and Authenticator Management (juillet 2025) (ouvre un site externe) · RFC 6238: TOTP: Time-Based One-Time Password Algorithm (mai 2011) (ouvre un site externe) · RFC 8176: Authentication Method Reference Values (juin 2017) (ouvre un site externe)

Autodiagnostic

Votre API est-elle concernée ?

Huit questions pour les équipes de développement et de sécurité. L'autodiagnostic ne remplace pas un test, mais il montre où regarder de plus près. Vos réponses restent dans votre navigateur.

  1. 01Lorsque le second facteur est activé, votre point de terminaison de connexion renvoie-t-il exclusivement un jeton de challenge à courte durée de vie ?
  2. 02Chaque route protégée rejette-t-elle avec un 401 ou un 403 tout jeton sans second facteur validé ?
  3. 03Le jeton de session consigne-t-il de manière vérifiable les facteurs contrôlés, par exemple dans le claim amr ?
  4. 04Les mêmes règles s'appliquent-elles à tous les chemins de connexion : anciennes versions d'API, applications mobiles, SSO, rafraîchissement de jeton et réinitialisation du mot de passe ?
  5. 05Le jeton de challenge est-il à usage unique, lié au compte et à la tentative de connexion, et expire-t-il au bout de quelques minutes ?
  6. 06Limitez-vous le nombre de tentatives échouées lors de la saisie du code ?
  7. 07Existe-t-il des tests automatisés qui rejouent la connexion avec un client HTTP brut, sans second facteur ?
  8. 08Vos points de terminaison d'authentification ont-ils déjà été testés isolément, c'est-à-dire sans l'interface ?

Réponses : 0/8

Le résultat donne une orientation ; il ne constitue pas une preuve d'audit.

Mise en perspective pour la GRC et l'audit

Quand la MFA n'est efficace que sur le papier

De nombreux référentiels exigent une authentification multifacteur ou des contrôles d'accès robustes. Un contournement comme celui-ci signifie que la mesure est documentée, mais sans effet.

NIS2 et la loi allemande sur le BSI

NIS2 cite expressément les solutions d'authentification multifacteur parmi les mesures de gestion des risques en matière de cybersécurité, et la loi allemande sur le BSI (BSIG) transpose cette exigence en droit allemand. Une MFA contournable via l'API ne remplit pas cet objectif.

Directive (UE) 2022/2555 (NIS2) (décembre 2022) (ouvre un site externe) · Loi allemande sur le BSI (BSIG), mesures de gestion des risques (ouvre un site externe)

Mettre en œuvre NIS2

ISO/IEC 27001

La mesure « Authentification sécurisée » exige des procédures d'authentification sécurisées, et un SMSI doit évaluer l'efficacité de ses mesures. Les audits devraient donc examiner également le flux de connexion de l'API, et pas seulement la configuration de l'interface.

SMSI selon ISO 27001

RGPD

Si quelqu'un accède par ce biais à des données personnelles, il s'agit d'une violation de données à caractère personnel. Le responsable du traitement doit la notifier à l'autorité de contrôle dans les meilleurs délais et, si possible, 72 heures au plus tard après en avoir pris connaissance, à moins qu'elle ne soit pas susceptible d'engendrer un risque pour les personnes concernées.

Règlement (UE) 2016/679 (RGPD) (ouvre un site externe)

Système de management de la protection des données

Cyber Resilience Act

À partir du 11 décembre 2027, les fabricants de produits comportant des éléments numériques devront les protéger contre tout accès non autorisé au moyen de contrôles appropriés, comme l'authentification. Les obligations de notification des vulnérabilités activement exploitées s'appliquent déjà depuis le 11 septembre 2026. Les offres purement SaaS n'en relèvent généralement pas, contrairement aux applications et aux logiciels distribués, y compris les services back-end du fabricant sans lesquels ils ne pourraient pas remplir l'une de leurs fonctions.

Règlement (UE) 2024/2847 (Cyber Resilience Act) (ouvre un site externe)

Conformité CRA

Cette mise en perspective ne constitue pas un conseil juridique.

Livre blanc · gratuit

Magical 2FA Bypass – une MFA efficace pour les CISO

Ce que le Magical 2FA Bypass enseigne sur l'authentification des API, préparé pour les décideurs : modèle et chemins de connexion, connexion en deux phases et contrôle des jetons, tests et preuves, questions aux fournisseurs, lecture réglementaire et plan à 30-60-90 jours. Disponible en anglais et en allemand.

Couverture du livre blanc « Magical 2FA Bypass – Effective MFA for CISOs »
PDF · 22 pagesAnglais & allemandAuteur : Uzair Kaaf
  • Dix messages clés pour la direction et l'audit interne
  • Exigences pour le jeton de challenge, la passerelle et le contrôle amr
  • Catalogue de tests pour chaque chemin de connexion et questions aux fournisseurs SaaS
  • Lecture réglementaire NIS2, ISO 27001, RGPD et CRA
Téléchargement gratuit

Demander un livre blanc

Magical 2FA Bypass – Effective MFA for CISOs

Version linguistique *
Poursuivre la recherche

Recherches connexes

Deep Dives 6

Tests d'intrusionComment fonctionne un test d'intrusion, en quoi il se distingue des scans de vulnérabilités et du red teaming – et quelles méthodologies, étapes et exigences réglementaires sont pertinentes lors de la commande.OWASP pour les équipes devTop 10, ASVS, Cheat Sheet Series, Developer Guide, WSTG, SAMM et des outils comme Dependency-Track et ZAP : ce que chaque projet apporte – et comment ces briques s'articulent au quotidien du développement pour former un processus de bout en bout.Secure CodingComment prévenir systématiquement les vulnérabilités : la cartographie actuelle issue du CWE Top 25 et de l'OWASP Top 10:2025, l'ASVS 5.0 comme référentiel d'exigences et les pratiques qui font la différence dans le quotidien du développement.Threat ModelingComment identifier les risques de sécurité dès la phase de conception grâce au cadre des quatre questions, à STRIDE, à PASTA et aux arbres d'attaque – et ancrer durablement le threat modeling dans le SDLC et les équipes agiles.Zero Trust pour les agents IALes agents IA autonomes agissent à la vitesse de la machine avec des droits légitimement accordés. Zero Trust transpose des principes éprouvés — vérifier plutôt que faire confiance, Least Privilege, Assume Breach — aux systèmes agentiques.MCP & OAuth 2.1Depuis la révision de la spécification de juin 2025, le serveur MCP protégé est un resource server OAuth 2.1 aux rôles clairement séparés. Ce deep dive explique la chaîne de discovery, l'enregistrement des clients, les règles relatives aux tokens et la liaison d'audience – et montre où les implémentations échouent en pratique.

Questions fréquentes

Réponses courtes

Qu'est-ce qu'un contournement de la 2FA ?

Un moyen d'utiliser un compte protégé par une authentification à deux facteurs sans présenter le second facteur. Dans le cas du Magical 2FA Bypass, l'API de connexion émettait le jeton de session dès la vérification du mot de passe.

L'attaquant a-t-il besoin du smartphone de la victime ?

Non. Il n'a besoin que du nom d'utilisateur et du mot de passe, c'est-à-dire précisément ce contre quoi le second facteur est en principe censé protéger.

Comment vérifier si mon application est concernée ?

À l'aide d'un client HTTP brut, connectez au point de terminaison de connexion un compte de test dont le second facteur est activé, puis lisez la réponse dans son intégralité. Si elle contient un jeton qui ouvre l'accès à des points de terminaison protégés sans code, l'application est concernée. Ne testez que vos propres systèmes, ou ceux pour lesquels vous disposez d'une autorisation écrite.

Suffit-il de retirer le jeton de la réponse de connexion ?

Non. Chaque point de terminaison protégé doit en outre rejeter les jetons sans second facteur validé. Sinon, l'erreur réapparaît par un autre chemin, par exemple une ancienne version de l'API ou le rafraîchissement de jeton.

Quelle plateforme était concernée ?

Nous ne le publions pas. Tous les noms d'hôte, identifiants et jetons figurant sur cette page ont été modifiés.

Quel est le lien entre ce constat et l'OWASP API Security Top 10 ?

Il relève de la catégorie API2:2023 Broken Authentication. Les recommandations de l'OWASP sur la MFA citent explicitement les API de connexion distinctes comme un point où la MFA doit également s'appliquer, ou d'autres protections être en place.

Quel est le niveau de sécurité de votre flux de connexion ?

Nous testons les points de terminaison d'authentification comme le font les attaquants et vous montrons où un jeton est créé trop tôt.