OpenClaw漏洞允许通过恶意链接一键远程执行代码
OpenClaw 这类“能替你干活”的 agent,本质上握着你的消息渠道、文件、API key、甚至本机命令执行能力。权限越大,安全边界就越不能模糊。不要信任来自 URL 的配置不要在页面加载时自动带 token 连接陌生端点不要把“本地监听”当成安全护身符真正的安全,不是“默认没事”,而是“默认不做危险动作”,嗯。。。换句话说:宁愿不做,也不要犯错!喜欢就奖励一个“👍”和“在看”呗~
很多人用 OpenClaw(曾用名 Moltbot/Clawdbot)是冲着它那句隐含承诺:“本地优先,数据在自己机器上,更安全。”
但这次事件需要你再注重注重安全了:哪怕你的网关只监听在回环地址(也就是“只在本机用”),只要用户点开一个链接,攻击链就可能从浏览器里“借道”,把你的控制权送出去。
这不是玄学,是官方安全公告里写得很直白的一条高危漏洞:“1-Click RCE via Authentication Token Exfiltration From gatewayUrl”,影响版本 <= v2026.1.28,修复版本是 v2026.1.29。
官方公告:https://github.com/openclaw/openclaw/security/advisories/GHSA-g8p2-7wf7-98mq

这次到底炸在哪?
把“配置入口”做成了“自动连接开关”
控制台(Control UI)做了两件看起来很“贴心”的事:
- 信任 URL 上的
gatewayUrl参数(来自 query string), - 页面加载时自动连接到这个地址,并且把本地保存的网关 token 放进 WebSocket 的 connect payload 里发出去。
于是风险就变成了:
用户只要点了一个被构造过的链接(或访问了会跳转的页面),token 就可能被送到攻击者控制的服务器。
而 token 一旦泄露,攻击者拿到的不是“看你聊天记录”这么简单——公告里直接说,攻击者能连进受害者本地 gateway,修改配置(包括 sandbox、工具策略)o( ̄▽ ̄)d,再调用高权限动作,最终达成 1-Click RCE。
“我只跑在 localhost,为啥也能挨揍?
很多人对“本地服务”的安全直觉是:外网访问不了,那就安全。
但这条链路的关键点是:外网不需要直接访问你的 localhost,只要能让“你的浏览器”去访问即可。
安全公告里点得很清楚:即使 gateway 只绑定在 loopback,上述攻击依然能成立,因为受害者的浏览器会发起对外连接,充当桥梁。
这也是为什么现在越来越多的安全问题不再是“端口开没开”,而是“前端/控制台能不能被诱导执行某些网络动作”。

修复方案
根因是 “缺少 gatewayUrl 校验 + 页面自动连接” 的组合。
修复策略也很直接:当 UI 检测到新的 gateway 地址时,要求用户确认,不再“悄悄自动连”。
顺带一提,OpenClaw 自己的 Security Policy 也写了警告:Web 界面是给本地用的,别绑到公网,它并没有按公网暴露去做硬化。
你现在该做什么?
如果你是用户(自托管/本地跑):
- 立刻升级到 v2026.1.29 或更高(<= v2026.1.28 都在影响范围内)。
- 轮换/重置 gateway token(公告定义本质是 token 外泄风险)。
- 不要把 Control UI 暴露到公网(哪怕你觉得“我加了 token 就行”)。
- 对“看似无害的链接”保持警惕:这种漏洞最吃“点一下”。
如果你是做类似产品的开发者:
- 任何能从 URL/剪贴板/深链写入配置的入口,都按“外部输入”处理
- 敏感 token 永远别跟着“自动连接”一起发(尤其是首次连接/地址变更时)
- 浏览器端做 allowlist/confirm;服务端也要做 origin/鉴权/最小权限
给工程师的“怎么写才不踩坑”示例(防御性)
下面是一个“最低配但管用”的思路:只允许 wss:// + 固定域名白名单,其余一律弹窗确认或拒绝。
// 只示意防御思路:严格校验 + 显式确认
function sanitizeGatewayUrl(raw: string): string | null {
try {
const u = new URL(raw);
// 1) 强制 wss
if (u.protocol !== "wss:") return null;
// 2) 域名白名单(示例)
const allowedHosts = new Set(["gateway.example.com", "corp-gw.example.com"]);
if (!allowedHosts.has(u.hostname)) return null;
// 3) 可选:固定端口/路径
return u.toString();
} catch {
return null;
}
}
// 地址变更时:必须用户确认
async function onGatewayUrlFromQuery(raw: string) {
const safe = sanitizeGatewayUrl(raw);
if (!safe) return;
const ok = window.confirm(`Connect to new gateway?\n${safe}`);
if (!ok) return;
// 再执行保存/连接
// saveSettings({ gatewayUrl: safe }); connectGateway(safe);
}
这段代码核心原则:把“隐式自动行为”改成“显式用户决策”。
很多 1-click 事故,就是从“帮用户省一步”开始的。
结语
OpenClaw 这类“能替你干活”的 agent,本质上握着你的消息渠道、文件、API key、甚至本机命令执行能力。权限越大,安全边界就越不能模糊。
这次的教训其实很统一:
- 不要信任来自 URL 的配置
- 不要在页面加载时自动带 token 连接陌生端点
- 不要把“本地监听”当成安全护身符
真正的安全,不是“默认没事”,而是“默认不做危险动作”,嗯。。。换句话说:宁愿不做,也不要犯错!
喜欢就奖励一个“👍”和“在看”呗~

更多推荐

所有评论(0)