Résumé exécutif
SSD Secure Disclosure a publié le 27 juillet 2026 les détails techniques et un exploit fonctionnel pour CVE-2026-61511, une exécution de code à distance pré-authentification dans vBulletin 6.2.1 et antérieur ainsi que 6.1.6 et antérieur. La faille se situe dans la méthode vB5_Template_Runtime::runMaths() du fichier /includes/vb5/template/runtime.php, où une valeur destinée à la balise de template {vb:math} est insuffisamment filtrée avant d'être transmise à la fonction PHP eval(). Le filtre autorise les chiffres, parenthèses, opérateurs arithmétiques et opérateurs binaires dont le XOR, ce qui suffit à reconstruire des chaînes PHP et des noms de fonctions appelables sans utiliser une seule lettre, une technique connue sous le nom de "phpfuck".
Le point critique du point de vue défensif est que cette valeur est atteignable sans authentification via la route publique ajax/render/pagenav : le template pagenav fourni en standard copie le paramètre visiteur pagenav[pagenumber] dans une variable ensuite passée à {vb:math}, donc à runMaths(), donc à eval(). vBulletin avait corrigé le problème fin juin 2026 avec la version 6.2.2 et des patches dédiés pour 6.2.1, 6.2.0 et 6.1.6, près de quatre semaines avant la publication de l'exploit. Aucune source, y compris SSD, ne rapportait d'exploitation active au 27 juillet 2026, et CVE-2026-61511 ne figurait pas au catalogue KEV de la CISA à cette date. Le risque réel se concentre donc sur les installations auto-hébergées et exposées à internet qui n'ont pas encore appliqué le correctif, sachant que le cycle patch discret puis exploit public quelques semaines plus tard reproduit exactement le schéma observé sur la chaîne vBulletin CVE-2025-48827 / CVE-2025-48828 en mai 2025.
Chronologie
| Date | Événement |
|---|---|
| Mai 2025 | Une chaîne antérieure dans le même moteur de templates vBulletin, CVE-2025-48827 et CVE-2025-48828, est exploitée dans les jours suivant sa divulgation, plusieurs mois après un correctif silencieux du vendeur. |
| Fin juin 2026 | vBulletin publie des patches de sécurité pour les branches 6.2.1, 6.2.0 et 6.1.6. |
| 1er juillet 2026 | Sortie de la version corrigée vBulletin 6.2.2 ; les instances Cloud du vendeur sont patchées. |
| 27 juillet 2026 | SSD Secure Disclosure publie l'avis technique complet et un exploit fonctionnel pour CVE-2026-61511, signé par le chercheur EgiX (Egidio Romano). |
| 27 juillet 2026 | The Hacker News reproduit localement la logique de filtrage et confirme la faille d'expression sous-jacente ; aucune exploitation en conditions réelles n'est confirmée à cette date. |
Fiche vulnérabilité (format fiche CTI)
CVE-2026-61511 | Score CVSS non attribué officiellement à ce jour (ni CVE.org ni NVD n'ont publié de notation ; le NVD a cessé l'enrichissement systématique en CVSS des nouveaux CVE plus tôt cette année). Nature : exécution de code arbitraire pré-authentification, impact qualifié de critique compte tenu de l'absence de prérequis d'accès. | vBulletin 6.2.1 et antérieur, vBulletin 6.1.6 et antérieur (moteur de templates vB5)
Description technique : la méthode vB5_Template_Runtime::runMaths() traite les expressions mathématiques inline de la balise de template {vb:math}. Le code applique une expression régulière censée restreindre les caractères autorisés avant de passer la chaîne résultante à eval(), mais ce filtre laisse passer les chiffres, parenthèses, opérateurs de concaténation, opérateurs arithmétiques et opérateurs binaires tels que le XOR. Cette combinaison suffit à reconstruire, sans aucune lettre, des noms de fonctions PHP appelables et des chaînes arbitraires via la technique dite "phpfuck", puis à les exécuter via eval().
Conditions d'exploitation : la route ajax/render/pagenav, accessible publiquement sans authentification, restitue le template standard pagenav. Ce template copie la valeur du paramètre pagenav[pagenumber], entièrement contrôlée par le visiteur, dans la variable de template pagenav.currentpage, laquelle est ensuite utilisée à l'intérieur d'une balise {vb:math}. Cette chaîne transforme une fonctionnalité de template en exécution de code arbitraire pré-authentification, sans compte, sans accès administrateur et sans interaction d'un tiers.
PoC disponible : oui, publié par SSD Secure Disclosure le 27 juillet 2026, sous la forme d'un script PHP interactif de type shell distant qui reconstruit la fonction system() par la technique phpfuck et exécute des commandes système en retournant leur sortie dans la réponse HTTP. The Hacker News signale que le script tel que publié contient une erreur d'un caractère (une lettre à la place d'un chiffre) qui empêche son exécution telle quelle, mais que la correction est triviale et n'affecte pas la vulnérabilité sous-jacente.
Patch/mitigation : appliquer le patch de sécurité correspondant à la branche utilisée (6.2.1, 6.2.0 ou 6.1.6) ou migrer vers la version corrigée 6.2.2. Les instances vBulletin Cloud sont déjà protégées selon le vendeur. Pour les installations auto-hébergées ne pouvant pas patcher immédiatement, surveiller et filtrer les requêtes POST contenant routestring=ajax/render/pagenav avec des valeurs pagenav[pagenumber] anormalement longues ou riches en opérateurs.
Diagramme de la chaîne d'attaque

Chaîne d'exploitation pré-authentification de CVE-2026-61511, reconstituée à partir de l'avis technique SSD Secure Disclosure du 27 juillet 2026.
Analyse technique
Étape 1 : Requête non authentifiée vers la route de rendu de template
L'attaquant envoie une requête POST vers ajax/render/pagenav, une route de rendu de template exposée publiquement par vBulletin sans exigence d'authentification.
Étape 2 : Injection via le paramètre pagenav[pagenumber]
Le template standard pagenav copie la valeur fournie par le visiteur dans pagenav[pagenumber] vers la variable de template pagenav.currentpage, sans validation de contenu au-delà de ce que permet le moteur de templates lui-même.
Étape 3 : Passage à la balise {vb:math} et à runMaths()
La variable contrôlée par l'attaquant est utilisée dans une balise {vb:math}, ce qui déclenche un appel à vB5_Template_Runtime::runMaths(). Cette méthode applique une expression régulière destinée à filtrer les caractères dangereux, mais celle-ci autorise chiffres, parenthèses, opérateurs arithmétiques et l'opérateur XOR.
Étape 4 : Reconstruction de code PHP via la technique phpfuck
En exploitant les caractères autorisés par le filtre, l'attaquant reconstruit sans utiliser de lettre des noms de fonctions PHP et des chaînes arbitraires, notamment pour appeler system() avec une commande de son choix, selon la méthode documentée par le projet phpfuck.
Étape 5 : Exécution via eval() et récupération du résultat
La chaîne reconstruite est passée à eval() par runMaths(), ce qui exécute la commande système forgée par l'attaquant. Le PoC de SSD récupère la sortie de cette commande directement dans la réponse HTTP retournée par la route ajax/render/pagenav, offrant un shell interactif pré-authentification sur le serveur.
Indicateurs de compromission
| Type | Valeur |
|---|---|
| Route ciblée | ajax/render/pagenav |
| Paramètre exploité | pagenav[pagenumber] (via routestring=ajax/render/pagenav) |
| Fichier vulnérable | /includes/vb5/template/runtime.php, méthode vB5_Template_Runtime::runMaths() |
| Versions affectées | vBulletin 6.2.1 et antérieur, vBulletin 6.1.6 et antérieur |
| Version corrigée | 6.2.2 (sortie le 1er juillet 2026) |
| Marqueur de la technique d'exploitation | Séquences répétées de parenthèses, chiffres encodés et opérateurs XOR dans les valeurs POST du paramètre pagenav[pagenumber] |
| Signature attribuée au PoC | "EgiX" (Egidio Romano) |
Aucune adresse IP, user-agent ou domaine d'attaquant n'a été publié à ce stade puisqu'aucune exploitation active n'est confirmée dans les sources exploitées pour ce rapport.
MITRE ATT&CK
Aucune cartographie ATT&CK officielle n'a été publiée par SSD Secure Disclosure ou par vBulletin. Le tableau ci-dessous constitue notre propre lecture technique de la chaîne, pas une attribution vendeur.
| Tactique | Technique | ID | Justification |
|---|---|---|---|
| Accès initial | Exploitation d'une application exposée publiquement | T1190 | La route ajax/render/pagenav est accessible sans authentification depuis internet sur toute instance vBulletin auto-hébergée exposée. |
| Exécution | Interpréteur de commandes et de scripts | T1059 | Exécution de commandes système arbitraires via la reconstruction de system() par la technique phpfuck puis eval(). |
| Évasion de défense | Obfuscation d'expression | T1027 (lecture élargie) | La technique phpfuck construit dynamiquement le code exécuté sans utiliser de lettre, contournant tout filtrage basé sur des motifs alphabétiques évidents. |
| Impact | Exécution de code à distance avec compromission complète du serveur applicatif | T1210 (Exploitation of Remote Services, lecture élargie) | Une exécution de commande système réussie équivaut à une prise de contrôle du processus serveur web hébergeant vBulletin. |
Remédiation : checklist opérationnelle
- Mettre à jour immédiatement toute installation vBulletin auto-hébergée vers la version 6.2.2, ou appliquer le patch de sécurité correspondant à la branche 6.2.1, 6.2.0 ou 6.1.6 déjà disponible depuis fin juin 2026.
- Confirmer que les instances vBulletin Cloud utilisées sont bien couvertes par la correction appliquée côté vendeur.
- En attendant le déploiement du correctif, filtrer ou bloquer au niveau du WAF les requêtes POST vers ajax/render/pagenav dont le paramètre pagenav[pagenumber] contient un nombre anormal de parenthèses, d'opérateurs XOR ou dépasse une longueur normale de numéro de page.
- Journaliser et surveiller les appels à la route ajax/render/[template] en général, pas uniquement pagenav, pour anticiper une réutilisation de la même technique sur d'autres templates exposant des balises {vb:math}.
- Auditer les templates personnalisés du forum pour vérifier qu'aucune autre valeur contrôlée par le visiteur n'est injectée dans une balise {vb:math} sans validation stricte côté serveur.
- Vérifier les journaux d'accès pour la fenêtre du 1er juillet au 27 juillet 2026, période durant laquelle le correctif était disponible mais l'exploit encore non public, afin d'écarter toute exploitation antérieure à la divulgation.
- Après mise à jour, effectuer un test de non-régression confirmant que runMaths() rejette bien les charges utiles de type phpfuck avant remise en production.