夜雨聆风学习资料网

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_KEYDATABASE_URL、云凭证一类变量。人以为「命令在远处跑」,钥匙还在环境块里跟着走。

我们的修法:白名单拼最小环境(PATH、HOME、SSH agent 等),密钥类丢掉。

平台回复:没有 CODEOWNER 合入说明。2026-04-09 我们在 #48134 自关:main 已改用 buildOpenShellSshExecEnv() → sanitizeEnvVars(process.env).allowed。方向对,补丁不是我们的 SHA。同样没有 CVE。

#48134:上游已独立消毒环境变量,作者关闭未 Merge 的 PR

审批:同一根线不能自己点头

位置exec.approval.request 会记下 requestedByConnIdexec.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。
 协调披露那条水管从一开始就没灌进去。维护者按「加固提交」处理,不必申请 CVE。
合入方式是另写补丁,不是 Merge。
 commit 作者是 steipete。自动化统计贡献、 Dependabot 溯源,都看不见 kn1ghtc。
关单致谢 ≠ 发布公告。
 「Thanks @kn1ghtc」停在评论区,不会同步到 CVE JSON 的 Credit 字段。
CWE 我们在 PR 里写了,CVE 要 CNA 发。
 CWE-918 / 526 / 284 是分类;CVE 是编号。没有 GHSA,GitHub 这个 CNA 就不会给号。

要补名字,只能请 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-526CWE-284。我们会接受 GitHub 发来的 credit 邀请。

    作者对openclaw的安全判断,其安全能力已经超越绝大部分Agent平台,但是就商业化安全而言仍然任重道远,需要有专业的安全团队长期保驾护航才行。安全就是最奢华的成本。

    你怎么看:开源智能体该不该把「公开安全 PR」默认走成 GHSA?留言。不写未授权怎么打,只谈门和署名。

    相关学习资料