
Laboratório Docker reproduzindo CVE-2026-10795: bypass de autenticação no UpdraftPlus UpdraftCentral encadeado com instalação de plugin para RCE. Inclui alvos vulneráveis/corrigidos, exploit PoC e passo a passo no nível de código-fonte.
Este repositório contém um laboratório Docker local para reproduzir e validar a CVE-2026-10795, uma vulnerabilidade de bypass de autenticação não autenticado que afeta o plugin UpdraftPlus do WordPress por meio da camada de comunicação remota UpdraftCentral.
O comportamento vulnerável existe no fluxo de tratamento de mensagens RPC do UpdraftCentral. Em versões vulneráveis, uma mensagem RPC forjada com format=1 pode ignorar a verificação de assinatura, acionar um caminho de descriptografia RSA com falha e ainda assim chegar à descriptografia simétrica com um comportamento previsível de chave nula/IV nulo. Isso permite que uma mensagem RPC criptografada e manipulada seja aceita e despachada como um comando UpdraftCentral.
Este laboratório compara duas versões do UpdraftPlus:
| Serviço | Versão do UpdraftPlus | Finalidade | URL |
|---|---|---|---|
vuln | 1.26.4 | Alvo de comparação vulnerável | http://127.0.0.1:8081 |
patched | 1.26.5 | Alvo de comparação corrigido | http://127.0.0.1:8082 |
A cadeia demonstrada é:```text Unauthenticated attacker → forged UpdraftCentral RPC request → format=1 signature verification bypass → failed RSA decrypt not rejected in vulnerable version → predictable zero-key/zero-IV decrypt path → forged JSON RPC command accepted → privileged UpdraftCentral command dispatch → plugin.upload_plugin → install and activate marker plugin → hard-coded /usr/bin/id proof endpoint
A vulnerabilidade principal é um bypass de autenticação. O laboratório demonstra que o bypass pode ser encadeado a um impacto do tipo RCE quando um estado de chave UpdraftCentral privilegiado está presente, porque o UpdraftCentral expõe comandos legítimos de gerenciamento de plugins que podem instalar e ativar plugins do WordPress.
Esta não é uma vulnerabilidade direta de injeção de comandos. A prova de execução de código vem do abuso da funcionalidade autenticada de instalação de plugins após contornar o limite de autenticação RPC.
Este laboratório foi projetado apenas para pesquisa local controlada, compreensão em nível de código-fonte e demonstração em portfólio.
## Fatos Verificados
| Afirmação | Evidência | Como verificar neste laboratório |
| ---------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
| O UpdraftPlus 1.26.4 é vulnerável neste laboratório. | O serviço vulnerável aceita uma mensagem RPC forjada `format=1` e despacha `plugin.upload_plugin`. | Execute `python3 poc/poc.py --url http://127.0.0.1:8081`. |
| O UpdraftPlus 1.26.5 bloqueia a mensagem forjada neste laboratório. | O serviço corrigido não retorna corpo de resposta RPC e não despacha o comando forjado. | Execute `python3 poc/poc.py --url http://127.0.0.1:8082`. |
| O problema é um bypass de autenticação na camada RPC do UpdraftCentral. | Uma requisição RPC forjada não autenticada pode alcançar o despacho de comandos na versão vulnerável. | Compare o comportamento de `--ping` entre as portas `8081` e `8082`. |
| O laboratório não pré-instala o plugin marcador. | A configuração instala apenas WordPress, UpdraftPlus e um estado de chave UpdraftCentral local. | Verifique `/wp-json/cve-lab/v1/id` antes de executar o PoC. |
| O PoC instala o plugin marcador por meio de RPC forjado. | O PoC envia `plugin.upload_plugin` com um payload de plugin ZIP no campo de dados RPC. | Execute o PoC e então solicite `/wp-json/cve-lab/v1/id`. |
| O alvo vulnerável atinge impacto do tipo RCE. | O plugin marcador expõe um endpoint fixo que retorna a saída de `/usr/bin/id`. | O alvo vulnerável retorna `uid=33(www-data) gid=33(www-data)`. |
| O alvo corrigido não instala o plugin marcador. | O endpoint marcador retorna `404 rest_no_route` no serviço corrigido. | Execute o PoC contra `http://127.0.0.1:8082`. |
| O laboratório requer um estado de chave UpdraftCentral. | O despacho do UpdraftCentral depende de uma entrada de chave local e dos metadados associados. | Revise `scripts/setup-wordpress.sh`. |
## Suposições e Incógnitas
Este laboratório intencionalmente insere um estado de chave UpdraftCentral local para reproduzir uma condição de site onde o controle remoto foi configurado.
O estado de chave inserido é um pré-requisito do laboratório, não a vulnerabilidade em si. Ele permite que o laboratório exercite consistentemente o caminho vulnerável de análise e descriptografia RPC.
O laboratório não afirma que toda instalação do UpdraftPlus é imediatamente explorável. A cadeia demonstrada depende da presença de uma entrada de chave UpdraftCentral local associada a um usuário WordPress privilegiado.
O laboratório demonstra um impacto controlado do tipo RCE ao instalar um plugin marcador que expõe um endpoint fixo de prova `/usr/bin/id`. Ele não fornece um web shell genérico, parâmetro arbitrário de execução de comandos, reverse shell, mecanismo de persistência, roubo de credenciais ou callback externo.
O PoC é limitado apenas a alvos locais e recusa hostnames não locais por padrão.
## Resumo da Causa Raiz
A causa raiz é a validação inadequada das mensagens RPC do UpdraftCentral em versões vulneráveis do UpdraftPlus.
O fluxo RPC vulnerável aceita uma mensagem `format=1`. O caminho `format=1` não exige a mesma verificação de assinatura que os formatos de mensagem mais recentes.
O problema em alto nível é:```text
format=1 message
→ signature verification is bypassed
→ RSA decrypt of the symmetric key can fail
→ failed decrypt result is not rejected
→ false is passed into the symmetric cipher as a key
→ phpseclib normalizes this into a predictable null key path
→ attacker-controlled encrypted JSON can decrypt successfully
→ command is dispatched
Em comportamento vulnerável, a descriptografia RSA pode retornar:```text false
Em vez de rejeitar o resultado de descriptografia com falha, o fluxo vulnerável continua e passa o valor para a camada de descriptografia simétrica.
O padrão vulnerável efetivo é:```php
$sym_key = $rsa->decrypt($sym_key);
$rij->setKey($sym_key);
$decrypted = $rij->decrypt($ciphertext);
O problema é que $sym_key não é validado antes de ser usado.
Quando $sym_key é false, a configuração da cifra segue um comportamento previsível de chave nula/IV nulo. Isso torna possível criar um payload RPC criptografado usando uma chave zero e um IV zero conhecidos.
A versão corrigida adiciona uma proteção antes de a chave simétrica ser usada:```php if (false === $sym_key || !is_string($sym_key) || strlen($sym_key) < 16) { return false; }
Isso altera o limite de confiança.
Antes do patch:```text
failed RSA decrypt result could still reach symmetric decrypt
Após o patch:```text failed RSA decrypt result is rejected before command dispatch
É por isso que o serviço vulnerável despacha o comando RPC forjado, enquanto o serviço corrigido não o faz.
## Por que um bypass de autenticação pode levar à execução de código