Aller au contenu

CVE-2026-73431 : rejeu de jetons sans état et prise de contrôle de compte dans CIRCL vulnerability-lookup

HERMES

SCORE DE MENACE HERMES & EXPLOITABILITÉ OPÉRATIONNELLE

Cible : CIRCL Vulnerability-Lookup (vulnerability-lookup <= 5.5.1)
Confiance : 96%
82 / 100
ÉLEVÉ

Mesure la pertinence opérationnelle réelle, la militarisation de l'exploit et la posture de menace active.

Décomposition des dimensions
Exploitabilité 19 / 20
Activité de menace 14 / 20
Militarisation 16 / 20
Exposition 17 / 20
Prévalence 14 / 20
Impact 18 / 20
Maturité de l'exploit 16 / 20
Potentiel d'attaque en chaîne 17 / 20
⚖️ Divergence & Justification opérationnelle

Le score CVSS v3.1 (8.8 Élevé) et le score Hermes HTS (82 Élevé) concordent. Révélée dans le cadre de recherches proactives menées par l'ENISA et CERT-EU à l'aide de modèles d'IA, cette faille illustre comment l'absence d'invalidation à usage unique transforme une interception réseau temporaire en prise de contrôle permanente de compte.

🕸️ Graphe de connaissances connecté & Provenance

CVE-2026-73431: CIRCL Vulnerability-Lookup Stateless Token Replay Account TakeoverVULNÉRABILITÉ

Nœuds connectés : 1
Relations sortantes actives
→ affectsCOMPOSANTMicrosoft Office & 365 Apps
98% VERY_HIGH

Software platform affected by security vulnerabilities and agentic attack patterns.

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Confirmed security vulnerability in Microsoft Office & 365 Apps documented in Hermes dossier.”

Preuves vérifiées associées :

1. Mécanisme technique : jetons sans état & absence de liaison d’usage

Section intitulée « 1. Mécanisme technique : jetons sans état & absence de liaison d’usage »

Dans vulnerability-lookup <= 5.5.1, les flux d’inscription et de réinitialisation généraient des jetons signés cryptographiquement contenant l’identifiant utilisateur et un horodatage :

sequenceDiagram
autonumber
actor User as Analyste Légitime
actor Attacker as Attaquant en Écoute
participant App as Serveur Vulnerability-Lookup
participant DB as Base de Données
User->>App: Demande de réinitialisation (/reset_password)
App-->>User: Envoi du courriel avec jeton T
Attacker->>User: Interception du jeton T (proxy / écoute réseau)
User->>App: Soumission du jeton T avec NouveauMdp_User
App->>DB: Mise à jour du mot de passe (Jeton T NON invalidé)
Note over App,DB: Le jeton T reste valide pendant 24 à 72h !
Attacker->>App: Rejeu du jeton T avec Mdp_Attaquant
App->>DB: Écrasement du mot de passe - Compte compromis !

Deux faiblesses architecturales majeures sont en cause :

  1. Absence d’invalidation à usage unique : le serveur vérifiait la validité temporelle et la signature du jeton, mais ne conservait aucun état marquant sa consommation. Un même jeton pouvait être soumis de multiples fois jusqu’à expiration.
  2. Absence de ségrégation d’usage : les jetons ne portaient aucune mention d’action exclusive, rendant possible la confusion entre l’activation initiale d’un compte et la réinitialisation de mot de passe.

2. Analyse du correctif CIRCL (commit bef837242657)

Section intitulée « 2. Analyse du correctif CIRCL (commit bef837242657) »

Le CIRCL a résolu la vulnérabilité dans le commit bef837242657acf680832be56b94428df130ed67 :

  • Génération d’un nonce cryptographique aléatoire : chaque demande de jeton génère un nonce de haute entropie.
  • Stockage du digest SHA-256 : seul le hash du nonce est conservé dans le profil de l’utilisateur.
  • Consommation atomique à usage unique : dès que le mot de passe est validé, le nonce stocké est révoqué ou effacé, invalidant instantanément le jeton.
  • Scellement de l’action : le jeton intègre obligatoirement l’action ciblée (action="account_activation" vs action="password_reset").

3.1 détection dans les journaux web (Nginx / Apache)

Section intitulée « 3.1 détection dans les journaux web (Nginx / Apache) »

Rechercher les jetons soumis plus d’une fois aux points de terminaison d’authentification :

Fenêtre de terminal
grep -E "POST /(activate|reset_password)" /var/log/nginx/access.log \
| grep -o "token=[^ &]*" \
| sort | uniq -c | sort -nr | awk '$1 > 1'

(Tout jeton apparaissant avec un code HTTP 200/302 depuis des adresses IP distinctes caractérise une attaque par rejeu).

Surveiller les événements consécutifs de modification de mot de passe sur un même identifiant dans un court laps de temps.


  1. Mise à jour immédiate : Migrer l’instance vulnerability-lookup vers la version 6.0.0 ou ultérieure.
  2. Mesure temporaire (avant mise à jour) : Réduire drastiquement TOKEN_VALIDITY_PERIOD dans la configuration :
    TOKEN_VALIDITY_PERIOD = 300 # 5 minutes au lieu de 24h
  3. Révocation des sessions : Purger les sessions actives et obliger les analystes à réinitialiser leurs accès si des anomalies de requêtes répétées ont été détectées.