
Docker-Validierungslabor und Python-PoC für CVE-2026-92084, eine nicht authentifizierte Shortcode-Ausführungsschwachstelle in Beaver Builder Lite <= 2.11.0.5, mit gepatchter Kontrolle und Nuclei-Screen.
Sicherheitsforschungsmaterial zur Reproduktion und Validierung von CVE-2026-92084:
Beaver Builder (Lite) <= 2.11.0.5 führt beliebige registrierte WordPress-
Shortcodes aus, die in der Widget-Ausgabe platziert wurden, die vom Sidebar-Modul gerendert wird, und zwar über den
layoutweiten do_shortcode()-Durchlauf des Builders.
'renders_shortcodes' => false;
die Mechanik zur Klammer-Kodierung selbst wurde früher eingeführt und ist unverändert)AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) – CWE-94Nur auf Systemen verwenden, die Sie besitzen oder für die Sie ausdrücklich autorisiert sind zu testen. Der PoC veröffentlicht einen Kommentar, dessen Autorenname einen im Labor registrierten Marker- Shortcode enthält. Es wird kein destruktiver Shortcode verwendet und nichts auf die Festplatte geschrieben.
Status: im bereitgestellten Labor nachgewiesen.
Beaver Builder Lite 2.11.0.5 (WordPress 7.1.2, Builder-Seite mit einem Sidebar- Modul + Recent Comments-Widget):
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])
Dies demonstriert die serverseitige Ausführung eines beliebigen registrierten Shortcodes mit in die Seite eingebetteter Ausgabe, die jedem Besucher offengelegt wird. Es demonstriert keine RCE; die Auswirkung hängt davon ab, welche Shortcodes auf dem Ziel registriert sind (Post-/Meta-Offenlegung, Formulare, pluginbereitgestellte Shortcodes mit Nebenwirkungen).
Die Senke. FLBuilder::render_content() führt das zusammengesetzte Builder-Layout durch einen breiten Shortcode-Durchlauf, bevor es ausgegeben wird:
// classes/class-fl-builder.php:2139, Beaver Builder Lite 2.11.0.5
$content = do_shortcode( $content );
Der Injektionspunkt. Das Sidebar-Modul rendert die Widget-Ausgabe einer WordPress-Sidebar unverändert in dieses Layout:
// modules/sidebar/includes/frontend.php:4, 2.11.0.5
if ( ! dynamic_sidebar( $settings->sidebar ) ) {
Widget-Inhalte sind nicht vertrauenswürdige Benutzerdaten – das zentrale Recent Comments-Widget gibt get_comment_author_link() aus, also den Namen, den ein (nicht authentifizierter) Kommentator angegeben hat. FLBuilder::double_escape_shortcodes() setzt lediglich die [[x]]-Escape-Form wieder in Klammern, sodass ein einfaches [cve92084] durchgelassen wird und der do_shortcode()-Durchlauf es ausführt.
Die Korrektur. 2.11.0.5 enthält bereits die Neutralisierungsmechanismen – FLBuilderModule::$renders_shortcodes = true (class-fl-builder-module.php:143) und FLBuilder::escape_foreign_module_shortcodes(), das an beide Modul-Render-Filter angehängt ist (class-fl-builder.php:109-110, angewendet bei 3240) und die Klammern jedes registrierten Shortcodes in der Modulausgabe entity-kodiert. Das Sidebar-Modul hat schlicht nie widersprochen. Die einzige funktionale Änderung in 2.11.0.6 ist der Widerspruch:
// 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 mit der Shortcode-Payload als
Namen des Kommentarautors.do_shortcode()-Durchlauf führt die
Payload aus. Deren Ausgabe ersetzt den Autorennamen und ist für jeden Besucher sichtbar.Voraussetzungen: Docker mit Compose v2, Python 3.10+ auf dem Host.
./lab verify
Erstellt das 2.11.0.5-Lab, erfordert, dass der Marker ausgelöst wird, und erstellt dann das
2.11.0.6-Lab und erfordert dessen Abwesenheit. Alles mit
./lab reset entfernen.
Anfällige Kontrolle:
[!!!] 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
Bereinigte Steuerung:
[=] shortcode text present but NOT executed: brackets entity-encoded
(patched >= 2.11.0.6 behavior: escape_foreign_shortcodes).
RESULT: PATCHED CONTROL CONFIRMED
Ein Marker auf der Seite, der nur innerhalb des angezeigten Kommentars (Rohtext) erscheint, wird nicht als Nachweis akzeptiert; der Marker muss als die ausgeführte Ausgabe des Shortcodes erscheinen.
./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
Führen Sie das PoC manuell aus (Loopback als Standard; autorisierte externe Ziele erfordern die explizite Überschreibung):
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]
Die nuclei-Vorlage (nuclei/cve-2026-92084.yaml) ist nur ein Versions-Screen
(readme.txt stable tag <= 2.11.0.5). Die Verhaltenskette erfordert eine Kommentar-
Einreichung plus einen Genehmigungsübergang, was sich in
nuclei nicht praktikabel ausdrücken lässt; der Python-PoC führt den vollständigen Ablauf aus.
| Version | Bewertung |
|---|---|
| Beaver Builder Lite 2.11.0.5 | Shortcode-Ausführung von Anfang bis Ende reproduziert |
| Beaver Builder Lite 2.11.0.6 | Gepatchte Negativkontrolle reproduziert |
| Beaver Builder Lite <= 2.11.0.4 | Laut Advisory betroffen; nicht einzeln getestet |
| Beaver Builder (Pro/Agency) | Nicht getestet – der Geltungsbereich des Advisories ist das Lite-Plugin |
.
├── .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
Nicht eingecheckt: assets/ (Plugin-Zips), .lab-state, __pycache__/.