
Preuve de concept et rapport technique pour CVE-2026-73312, une vulnérabilité de rejeu de jeton d'actualisation OAuth2 dans XenForo avant la version 2.3.13. Inclut un script Python pour tester le problème.
XenForo avant la version 2.3.13 peut laisser un jeton d'actualisation OAuth2 réutilisable lorsque son jeton d'accès parent a expiré.
XenForo laisse intentionnellement un jeton d'actualisation survivre à son jeton d'accès à courte durée de vie. Lors de la rotation, il crée la famille de jetons de remplacement, puis demande au révocateur de jetons d'accès parent de consommer l'ancienne famille. Ce révocateur renvoie une réponse anticipée lorsque le jeton d'accès a expiré, avant de révoquer le jeton d'actualisation associé.
Le jeton d'actualisation d'origine peut par conséquent être soumis à nouveau, produisant une autre famille de jetons indépendante avec le même utilisateur et les mêmes portées. L'attaquant doit déjà posséder un jeton d'actualisation valide (ainsi que le secret client pour un client confidentiel). Le problème prolonge la durée de vie utile d'un identifiant compromis ; il ne s'agit pas en soi d'un contournement de connexion ni d'une élévation de portées.
J'ai reproduit le problème sur XenForo 2.3.12 (build 2031270) après avoir laissé le jeton d'accès parent expirer. XenForo 2.3.13 contient le correctif.
python poc.py https://xenforo.example CLIENT_ID REFRESH_TOKEN --verify-me
Le script soumet un jeton de test autorisé deux fois et n'affiche que des hachages et des statuts. Un rejet de relecture se termine avec le statut 0 ; un résultat confirmé comme vulnérable se termine avec le statut 1 afin que l'automatisation ne confonde pas la condition vulnérable avec un succès.
Découvert par Marco Paciaroni (BomboBombone).