ARTICLE · 1049787
我们给OpenClaw补了三处洞 为何没有CVE
我们给OpenClaw补了三处洞 为何没有CVE
我们发现openclaw(小龙虾)的3处安全问题,顺带说说如何获取开源项目的CVE
2026 年 3 月 16 日起,我们用账号 kn1ghtc 给开源智能体平台 openclaw/openclaw 连续提安全补丁:#48133 Firecrawl 抓取 SSRF、#48134 OpenShell 环境变量泄漏、#63680 命令审批自批准。
今天突然再翻仓库信息,无意看了一下致谢,才发现当前提的几个补丁都没有合入,实际情况是:GitHub 上 author:kn1ghtc is:merged 是 0;Advisory 搜 kn1ghtc 是 0。#48133 的问题被维护者另写补丁修了,PR 本身写着 Closed with unmerged commits——修了洞,没合我们的分支,也没发带我们名字的 CVE。

三条攻击面:出网、出密、出审批
借着这次事情,我们重温一下openclaw的3处风险问题(2个已经其它方式修复,第3个在主对话做了校验,可能还存在问题):
Firecrawl:对话里的地址,不该摸到机房
位置:firecrawl_scrape 把调用方给的 URL 原样交给抓取服务,本地不做私网/元数据拦截。CWE-918。社区审稿人 ademczuk 在 2026-03-16 复述过:当时 main 的 firecrawl-client.ts 对用户 URL 零校验。
影响:提示词一旦把地址写进工具参数,抓取端可能去碰回环、RFC1918、链路本地和云元数据。返回值进对话,等于把内网探测外包给「帮我看看这个网页」。我们没有在文章里写可复现步骤;要的是门在哪。
我们的修法:在 runFirecrawlScrape 入口加 assertFirecrawlUrlAllowed(),复用仓库已有的 isBlockedHostnameOrIp。缓存上限那一半后来证明 main 已有共享淘汰,维护者没收。
平台回复:2026-05-02,维护者 steipete 在 #48133 写道:Thank you,他已在 main 落地 scrape 目标 SSRF 加固,本 PR 视为被替代后关闭。页面同时写 Closed with unmerged commits。

steipete:致谢、另补补丁、关单,分支未 Merge
这条的结果是:漏洞被承认、被修、被关;合入的不是 kn1ghtc 的 commit,CVE 记录也不存在。
OpenShell:远端壳子不该看见家里的钥匙
位置:OpenShell 走 SSH 时,两处 env: process.env 把宿主整份环境交给子进程。CWE-526。ademczuk 2026-03-16 顺着调用链核对到 supervisor.spawn。
影响:远端沙箱或跳板机能看见 OPENAI_API_KEY、DATABASE_URL、云凭证一类变量。人以为「命令在远处跑」,钥匙还在环境块里跟着走。
我们的修法:白名单拼最小环境(PATH、HOME、SSH agent 等),密钥类丢掉。
平台回复:没有 CODEOWNER 合入说明。2026-04-09 我们在 #48134 自关:main 已改用 buildOpenShellSshExecEnv() → sanitizeEnvVars(process.env).allowed。方向对,补丁不是我们的 SHA。同样没有 CVE。

#48134:上游已独立消毒环境变量,作者关闭未 Merge 的 PR
审批:同一根线不能自己点头
位置:exec.approval.request 会记下 requestedByConnId,exec.approval.resolve 当时只看允许哪些决定,不看是不是同一条 WebSocket。CWE-284,我们按 CVSS 3.1 自评 8.5。这是人机共管的最后一道门:命令先挂起,等人点允许。
影响:被提示词带偏或被扩展拿住的连接,可以自己申请、自己点「允许一次」,人眼审批形同虚设。我们不写利用链,只写门没锁。
我们的修法:同一 connId 禁止 allow-once / allow-always,允许自己点拒绝以便取消。#48149 因架构拆到 approval-shared.ts 对不上而关闭;#63680 是对准新架构的最小补丁。
平台回复:ClawSweeper 给 #63680 打了 P0 和 needs proof,并写过当时 main 的 resolve 仍不比较 resolver 的 connId 和 requestedByConnId。它担心和后来的 trusted-backend 聊天回放打架。2026-05-26 该 PR 仍是 Closed with unmerged commits。仓库后来另做了 APPROVAL_CLIENT_MISMATCH 一类绑定,那是「回放要对上原客户端」,不是把 #63680 Merge 进去,也没有给我们 CVE。

#63680:P0 仍未 Merge,Closed with unmerged commits
为何 CVE 上没有 kn1ghtc
GitHub 官方文档说明,看看开源项目如何申请CVE:CVE 通常挂在 已发布的仓库 Security Advisory 上;Credits 只能由 advisory 创建者 加上,被加的人再点接受。GitHub Support 不管署名。

GitHub Advisory 搜 kn1ghtc:0 条
48133 没有我们的名字,不是「洞不成立」,是流程没走完:
我们走了公开 PR,没有先开私有 GHSA。要补名字,只能请 openclaw 仓库管理员发一条 GHSA,Credits 勾 Finder + Remediation developer,再勾 Request CVE。我们这边会点接受邀请。
2026-09-20 我们已在 #48133 评论 公开申请:请 steipete 为 Firecrawl scrape 目标校验发 GHSA、向 GitHub CNA 要 CVE、把 kn1ghtc 写入 Credits(Finder + Remediation developer);CWE 用 CWE-918。#48134、#63680 若他们愿意一并建稿,CWE 分别是 CWE-526、CWE-284。我们会接受 GitHub 发来的 credit 邀请。
作者对openclaw的安全判断,其安全能力已经超越绝大部分Agent平台,但是就商业化安全而言仍然任重道远,需要有专业的安全团队长期保驾护航才行。安全就是最奢华的成本。
你怎么看:开源智能体该不该把「公开安全 PR」默认走成 GHSA?留言。不写未授权怎么打,只谈门和署名。