
Kit de ferramentas de deteção, verificação e resposta a incidentes para CVE-2026-85097: avaliação remota do Bricksforge, caça a IOCs em logs, auditoria de implantes no sistema de ficheiros, além de regras Sigma e WAF.
Upload Arbitrário de Arquivos Não Autenticado → RCE no plugin Bricksforge para WordPress
Kit de detecção, verificação e resposta a incidentes para CVE-2026-85097, um CVSS 10.0
upload arbitrário de arquivos não autenticado no plugin Bricksforge
para WordPress que está ativamente explorado em ambiente real.
Um script, três modos: avaliar remotamente um alvo, procurar exploração em logs históricos, e auditar uma raiz web em busca de implantes deixados.
____ _ _ _ __ ___ _ _
| __ ) _ __(_) | _| | __/ _| ___ _ __ __ _ / _ \ ___| | _| | ___ _ __
| _ \| '__| | |/ / |/ / |_ / _ \| '__/ _` | | | / __| |/ / |/ _ \| '_ \
| |_) | | | | <| <| _| (_) | | | (_| | |_| \__ \ <| | (_) | | | |
|____/|_| |_|_|\_\_|\_\_| \___/|_| \__, |\___/|___/_|\_\_|\___/|_| |_|
|___/
CVE-2026-85097 | Unauthenticated Arbitrary File Upload -> RCE
CVSS 10.0 CRITICAL | Bricksforge <= 3.1.8.9 | Fixed 3.1.8.10
| Campo | Valor |
|---|---|
| CVE | CVE-2026-85097 |
| Produto | Bricksforge (plugin WordPress, addon para Bricks Builder) |
| Tipo | Upload Arbitrário de Arquivo Não Autenticado → Execução Remota de Código |
| CWE | CWE-434: Upload Irrestrito de Arquivo com Tipo Perigoso |
| CVSS | 10.0 CRÍTICO: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H (vetor inferido, ver Limitações) |
| Autenticação | Nenhuma |
| Afetados | <= 3.1.8.9 |
| Corrigido | 3.1.8.10 (linha de lançamento do fornecedor referenciada na imprensa: 4.0.1) |
| Exploração | ATIVA EM CAMPO |
| Primeira observação | 2026-10-07 21:47:17 UTC |
| Instalações | ~6.000 |
| IPs de origem observados | 63 únicos (top 6 ≈ 46% das requisições) |
| Endpoint principal | POST /wp-json/bricksforge/v1/form_submit |
| Endpoint alternativo | POST /wp-admin/admin-ajax.php (action=bricksforge_form_submit) |
| Nomeação do implante | login_admin_*.php |
[!CAUTION] Apenas uso autorizado. Esta ferramenta destina-se a avaliação de segurança permitida, validação defensiva e resposta a incidentes. Executar qualquer teste ativo contra um sistema que você não possui ou para o qual não tem permissão por escrito para testar é ilegal na maioria das jurisdições. Ver SAFETY-AND-LEGAL.md.
O Bricksforge estende o Bricks Builder com formulários avançados,
animações e dados dinâmicos. Seu recurso Pro Forms aceita uploads de arquivos. O plugin
valida corretamente o tipo MIME de um arquivo quando ele é enviado pela primeira vez, mas quando o
formulário é posteriormente submetido, ele confia nos metadados do arquivo enviados pelo cliente e nunca
valida o campo url dentro do parâmetro temporaryFileUploads.
Essa única verificação ausente converte um upload de imagem benigno em execução remota
de código não autenticada. Um atacante não precisa de conta, nem de token CSRF que não possa gerar
por conta própria, e nem de interação do usuário. A Patchstack observou exploração começando em
2026-10-07 21:47:17 UTC a partir de 63 IPs de origem únicos abrangendo infraestrutura de datacenter, nuvem, VPN e
residencial.
file (o caminho no lado do servidor que teve o MIME verificado) e url (o destino para o qual o plugin
gravará) estão desacoplados. O plugin relê o url fornecido pelo cliente no
momento da submissão e grava os bytes preparados ali.
{
"temporaryFileUploads": [
{
"field": "form-field-file",
"file": {
"file": "/var/www/example.com/wp-content/uploads/bricksforge/tmp/img_example.gif",
"url": "https://example.com/wp-content/uploads/bricksforge/tmp/img_example.php",
"type": "image/gif"
}
}
]
}
A assinatura é a incompatibilidade: o caminho do lado do servidor é um .gif, a URL de destino
é um .php. Em 95% das requisições capturadas, o caminho do lado do servidor terminava em .gif ou .png.
| Arquivo | Função |
|---|---|
wp-content/plugins/bricksforge/includes/elements/pro-forms/actions/init.php | Ponto de injeção: metadados fornecidos pelo cliente (incluindo url) são mesclados no contexto da ação do formulário sem validação. |
wp-content/plugins/bricksforge/includes/elements/pro-forms/actions/base.php | Sink: os metadados confiáveis orientam a gravação final do arquivo, de modo que o atacante controla o nome do arquivo de destino em disco e a extensão. |
| # | Etapa | Observável |
|---|---|---|
| 1 | Obter um nonce não autenticado: POST /wp-admin/admin-ajax.php com action=bricksforge_regenerate_nonce. Nenhuma autenticação necessária; retorna um nonce válido. | Requisição admin-ajax.php com action=bricksforge_regenerate_nonce |
| 2 | Enviar um polyglot GIF/PHP: uma imagem válida que também carrega código PHP. A validação de MIME é realizada aqui, então ela passa e cai em wp-content/uploads/bricksforge/tmp/. | Upload multipart gravando em /wp-content/uploads/bricksforge/tmp/ |
| 3 | Submeter o formulário com metadados incompatíveis: file aponta para o .gif validado, url termina em .php. | Requisição form_submit contendo temporaryFileUploads |
| 4 | O plugin grava o conteúdo no local PHP → RCE. Requisitar essa URL executa o código embutido: web shells, modificação de conteúdo, roubo de dados, persistência. | GET HTTP para um arquivo .php recém-criado sob um diretório de uploads |
Atacantes sondam ativamente por formas de contornar a filtragem de extensões. Quatro famílias:
| Família | Amostras | Intenção |
|---|---|---|
| Extensões PHP alternativas | .php .php5 .php7 .php8 .phtml .pht .phtm .phps | Alcançar um handler PHP sob um nome que o filtro não bloqueia |
| Manipulação de maiúsculas/minúsculas | .PHP .Php .pHp .PHTML | Vencer listas de bloqueio sensíveis a maiúsculas/minúsculas; Windows/algumas configurações do Apache resolvem sem distinção de maiúsculas/minúsculas |
| Extensões codificadas | %2ephp .%70hp .%2570%2568%2570 | Contrabandear a extensão por um filtro inspecionado antes da decodificação de URL |
| Metadados modificados | path, name, originalFilename, url alterados/ausentes | Mapear quais campos o plugin realmente valida |