
Laboratorio di validazione Docker e PoC in Python per CVE-2026-92084, una vulnerabilità di esecuzione di shortcode non autenticata in Beaver Builder Lite <= 2.11.0.5, con controllo patchato e screen di nuclei.
Materiale di ricerca sulla sicurezza per riprodurre e validare CVE-2026-92084:
Beaver Builder (Lite) <= 2.11.0.5 esegue shortcode arbitrari registrati in WordPress
inseriti nell'output dei widget renderizzato dal modulo Sidebar, tramite il
passaggio do_shortcode() a livello di layout del builder.
'renders_shortcodes' => false;
il meccanismo di codifica delle parentesi quadre è stato introdotto in precedenza ed è invariato)AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) - CWE-94Utilizzare solo su sistemi di propria proprietà o per i quali si è esplicitamente autorizzati a eseguire test. Il PoC pubblica un commento il cui nome autore contiene uno shortcode marcatore registrato nel laboratorio. Non viene utilizzato alcuno shortcode distruttivo e nulla viene scritto su disco.
Stato: dimostrato nel laboratorio fornito.
Beaver Builder Lite 2.11.0.5 (WordPress 7.1.2, pagina del builder con un modulo 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])
Ciò dimostra l'esecuzione lato server di uno shortcode registrato arbitrario con output incorporato nella pagina, divulgato a ogni visitatore. Non dimostra RCE; l'impatto dipende da quali shortcode sono registrati sul target (esposizione di post/meta, form, shortcode forniti da plugin con effetti collaterali).
Il sink. FLBuilder::render_content() esegue il layout del builder assemblato attraverso un ampio passaggio di shortcode prima di restituirlo in output:
// classes/class-fl-builder.php:2139, Beaver Builder Lite 2.11.0.5
$content = do_shortcode( $content );
Il punto di iniezione. Il modulo Sidebar renderizza l'output dei widget di una sidebar di WordPress testualmente in quel layout:
// modules/sidebar/includes/frontend.php:4, 2.11.0.5
if ( ! dynamic_sidebar( $settings->sidebar ) ) {
Il contenuto del widget è dato utente non attendibile: il widget principale Recent Comments restituisce get_comment_author_link(), cioè qualunque nome abbia fornito un commentatore (non autenticato). FLBuilder::double_escape_shortcodes() si limita a riapplicare le parentesi alla forma con escape [[x]], quindi un semplice [cve92084] passa attraverso e la passata di do_shortcode() lo esegue.
La correzione. La versione 2.11.0.5 include già il meccanismo di neutralizzazione: FLBuilderModule::$renders_shortcodes = true (class-fl-builder-module.php:143) e FLBuilder::escape_foreign_module_shortcodes() agganciato a entrambi i filtri di rendering dei moduli (class-fl-builder.php:109-110, applicato alla riga 3240), che codifica come entità le parentesi di qualsiasi shortcode registrato nell'output del modulo. Il modulo Sidebar semplicemente non ha mai effettuato l'opt-out. L'unica modifica funzionale nella 2.11.0.6 è l'opt-out:
// 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 con il payload shortcode come
nome autore del commento.do_shortcode() esegue il
payload. Il suo output sostituisce il nome autore, visibile a ogni visitatore.Requisiti: Docker con Compose v2, Python 3.10+ sull'host.
./lab verify
Crea il lab 2.11.0.5, richiede che il marker si attivi, poi crea il
lab 2.11.0.6 e richiede la sua assenza. Rimuovi tutto con
./lab reset.
Controllo vulnerabile:
[!!!] 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
Controllo corretto:
[=] shortcode text present but NOT executed: brackets entity-encoded
(patched >= 2.11.0.6 behavior: escape_foreign_shortcodes).
RESULT: PATCHED CONTROL CONFIRMED
Un marker nella pagina solo all'interno del commento visualizzato (testo grezzo) non è accettato come prova; il marker deve apparire come output eseguito dello 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
Esegui il PoC manualmente (loopback predefinito; i target esterni autorizzati richiedono l'override esplicito):
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]
Il template nuclei (nuclei/cve-2026-92084.yaml) è solo un controllo di versione
(readme.txt stable tag <= 2.11.0.5). La catena comportamentale richiede l'invio di un commento
più una transizione di approvazione, cosa non pratica da esprimere in
nuclei; il PoC Python esegue il flusso completo.
| Versione | Valutazione |
|---|---|
| Beaver Builder Lite 2.11.0.5 | Esecuzione dello shortcode riprodotta end to end |
| Beaver Builder Lite 2.11.0.6 | Controllo negativo con patch riprodotto |
| Beaver Builder Lite <= 2.11.0.4 | Interessata secondo l'advisory; non testata singolarmente |
| Beaver Builder (Pro/Agency) | Non testata - l'ambito dell'advisory è il 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 committato: assets/ (zip dei plugin), .lab-state, __pycache__/.