欢迎光临
我们一直在努力

OpenClaw 的 100 条安全公告解剖:51 条高危里,有 49 条其实是同一类错

2026 年 10 月 15 日,我们把 OpenClaw 官方仓库的 GitHub Security Advisory(GHSA)全量清单拉下来做了逐条解析。结论有点反直觉:这个项目 100 条安全公告里,严重级别排第一的问题不是”代码有洞”,而是”权限校验写漏了一处”。CWE-863(Incorrect Authorization,授权错误)出现 49 次,CWE-862(Missing Authorization,缺失授权)出现 30 次——两者相加 79 条,占全部公告的 79%。

更值得看的是修复节奏:这些修复被压缩进极少数几个补丁版本里,其中 2026.8.1 一个版本就关掉了 51 条公告,占整个账本的 51%。换句话说,你只要从 2026.8.1 之前直接升到最新,就一次性跨过了全部历史安全债;而如果你卡在 extended-stable 通道的 2026.8.35 上,有 3 条公告在那个版本上根本没修。

本文所有数字来自 GitHub REST API 的原始 JSON 字段(severity、cvss.score、cwes[].cwe_id、vulnerabilities[].patched_versions),逐条统计,不做抽样。抓取时间 2026-10-15。

一、先把账本摊开:100 条公告到底长什么样

OpenClaw 的安全公告没有散落在博客或论坛,而是统一发布在仓库的 Security Advisories 页面。这个页面在 GitHub 侧栏显示为 “Moderate 100″,共 4 页、每页 25 条。

OpenClaw 仓库 Security Advisories 列表页,侧栏显示 Moderate 100,共 4 页

先看整体的严重度分布。需要说明的是,这 100 条的 published_at 字段只有两个日期:2026-06-30(25 条)和 2026-09-11(75 条)。这不是漏洞突然爆发,而是项目在这个时间点把积压的公告集中公开、补齐了披露流程。

严重级别 条数 占比 最高 CVSS 3.1 基础分
High 51 51% 8.8
Medium 44 44% 6.5
Low 5 5% 2.6
合计 100 100% —

值得注意的是:100 条公告里没有一条 Critical(CVSS ≥ 9.0),最高分是 8.8。GitHub 的 severity 字段与 CVSS 基础分的 High 档(7.0–8.9)在这批数据里 100/100 完全一致,没有出现”标了 High 但分数不到 7″的错配。这是一份口径干净的账本。

另外,100 条公告全部没有分配 CVE 编号(cve_id 均为 null)。如果你在企业漏洞管理平台里按 CVE 检索,这 100 条一条都查不到——只能按 GHSA ID 或 npm 包名匹配。这是一个实操上容易踩空的点。

完整列表可以在 OpenClaw Security Advisories 页面按发布时间查看。

二、核心发现:79% 的公告是同一个根因

按 CWE(Common Weakness Enumeration,通用弱点枚举)统计,前两位是授权类问题:

CWE 名称 出现次数 占比
CWE-863 Incorrect Authorization 49 49%
CWE-862 Missing Authorization 30 30%
CWE-200 敏感信息暴露给未授权主体 7 7%
CWE-918 服务端请求伪造(SSRF) 7 7%
CWE-400 不可控资源消耗 6 6%
CWE-78 OS 命令注入 5 5%
CWE-22 路径遍历 4 4%
CWE-269 权限管理不当 4 4%
CWE-639 用户可控键导致的授权绕过 3 3%

单条公告可以挂多个 CWE,所以这张表的次数总和会超过 100。但趋势毫无争议:授权校验是绝对主战场。

如果你熟悉 OWASP Top 10,会发现一个错位。CWE-863/862 属于访问控制类(OWASP 2021 的 A01),而 SSRF(CWE-918)、命令注入(CWE-78)这些通常更”上头条”的注入类问题,在这里各自只有个位数。一个 AI Agent 项目的攻击面和传统 Web 应用很不一样:它的入口不是表单,而是 IM 消息、语音通话、浏览器会话、MCP 工具调用——每一条都是”谁在说话、这个人有没有权限”。

授权类问题的四种典型写法

从 100 条摘要文本看,授权失败几乎只有四种句式。以官方公告的英文原句为准:

其一,”could omit”(漏掉了检查)——共 12 条。这是最高频的形态:代码路径存在,但某个分支没有调用授权函数。典型如 GHSA-rx8p-qcpv-c7vr:”Prometheus diagnostics could omit operator.read enforcement”(Prometheus 诊断接口可能漏掉 operator.read 权限校验)。这类问题的隐蔽性最强——主流程是对的,只有诊断/边缘端点漏了。

其二,”could ignore”(忽略了已配置的策略)——4 条。系统里有策略配置,但被忽略。危害在于”你明明配了却以为生效”。GHSA-wwcw-jfpp-gpxw(High):”Codex native tools could ignore per-chat policy”。

其三,”could skip”(跳过了授权)——大量出现在 IM 集成包。授权逻辑存在,但在跨 provider 或跨会话时没被调用。

其四,”without authorization/checks”(根本没有检查)——涉及新加的入口,新功能上线时根本没接授权层。

三、真正值得警惕的:exec 审批被绕过的那一族

授权类问题里,有一个子集的破坏力明显高于其他——exec 审批(approval)被绕过。这一族全部是 High,涉及的是 Agent 唯一真正能造成不可逆损害的动作:在宿主机上执行命令。

我们从账本里完整提取了这一族:

GHSA 严重度 CVSS 受影响版本 修复版本 官方摘要
GHSA-3fp5-v549-9v66 High 8.8 <= 2026.6.6 2026.6.9 flock 包装器可绕过持久化 exec 审批绑定
GHSA-9f86-pvv5-rxfw High 8.0 < 2026.8.1 2026.8.1 转义换行符可干扰 exec 白名单解析
GHSA-74gc-hg2m-79p9 High 7.5 < 2026.8.1 2026.8.1 可复用的 exec 审批可授权被改动的参数
GHSA-3mq7-q27j-mq7q High 7.3 < 2026.8.1 2026.8.1 exec 审批的生命周期可能长于它审核过的工作目录
GHSA-224w-vfr9-h35c High 8.8 < 2026.7.1 2026.7.1 Google Meet 节点命令可跳过 exec 审批
GHSA-7jfq-rmfm-29wp Medium 6.4 < 2026.8.1 2026.8.1 文件传输审批可扩大持久化权限范围
GHSA-356g-m7rx-7pm3 Medium 5.5 = 2026.7.1-2 2026.8.1 ACP file URL 可跳过工作目录之外的读取审批
GHSA-r88x-r7jj-f2cf High 7.1 < 2026.7.1 2026.7.1 Signal 表情回应可能绑定到错误的审批

这八条串起来看,是一个完整的审批生命周期被逐段击穿的过程。举其中最典型的一条:GHSA-3fp5-v549-9v66,官方原文写明"flock wrapper could bypass durable exec approval binding",影响 openclaw <= 2026.6.6,CVSS 8.8,攻击向量是网络、低复杂度、低权限、无需用户交互,且保密性/完整性/可用性三项全 High。官方 Impact 段落说得直白:攻击者可以让执行或持久化动作绕过调用方的既定授权。

GHSA-3fp5-v549-9v66 公告详情页,CVSS 8.8,Confidentiality/Integrity/Availability 全 High

这八条里最值得警惕的是 GHSA-74gc-hg2m-79p9("可复用的 exec 审批可授权被改动的参数")和 GHSA-3mq7-q27j-mq7q("审批的生命周期长于它审核过的工作目录")。前者的危险在于审批被复用于不同的命令——你批准了 git status,某个逻辑缺陷让这次批准被拿去执行别的东西。后者则是授权范围随时间漂移——审批时目录是安全的,之后目录被替换成了敏感位置,审批却仍然有效。

这两条揭示的是一个设计层面的事实:在 Agent 系统里,"审批"不是一次性动作,而是一份需要持续绑定的授权凭据。它必须绑定到:具体命令 + 具体参数 + 具体工作目录 + 特定时间窗。这四个绑定里少任何一个,审批就会退化成一句"我批准过了"。

白名单解析也是攻击面

GHSA-9f86-pvv5-rxfw 揭示了一个容易忽略的点:exec 白名单本身是一个解析目标。官方摘要"Eescaped newlines could confuse exec allowlist parsing",配合 CWE-78(OS 命令注入)和 CWE-863 双重标注。这意味着攻击者不需要绕过白名单,只需要让待执行字符串里的换行符被错误解释——解析器视角和白名单策略视角看到的不是同一行。

同类还有 GHSA-ghpx-6xwq-2w4w("exec 包装器白名单可能信任任意内层命令",High,2026.8.1 修复)。白名单机制的强度,取决于解析层有多严格,而不是规则列表有多长。

四、修复节奏:一个版本关掉 51 条

这是整份账本里对运维最有操作价值的一张表。把 103 条漏洞条目(部分公告覆盖多个包)按修复版本归并:

修复版本 关闭条目数 累计关闭 占全部条目 该版本 npm 发布时间
2026.6.1 1 1 1.0% 2026-06-03
2026.6.6 10 11 10.7% 2026-06-12
2026.6.8 1 12 11.7% 2026-06-16
2026.6.9 10 22 21.4% 2026-06-21
2026.7.1 20 42 40.8% 2026-07-13
2026.8.1 51 93 90.3% 2026-08-31
2026.8.2 1 94 91.3% 2026-09-01
2026.8.11 3 97 94.2% 未在 npm 上
2026.9.2 1 98 95.1% 2026-09-05
2026.9.3 2 100 97.1% 2026-09-08

2026.8.1 一个补丁版本关掉了 51 条,占全部安全债的 51%。 这个版本自身在 npm 上的发布时间是 2026-08-31 02:45:39 UTC,距它所关闭的第一批公告公开(2026-06-30)刚好两个月。

这带来一个非常具体的运维结论:OpenClaw 的安全状态是"版本台阶型"的,不是"持续修补型"的。你不需要逐条跟踪 100 个公告——你只需要判断自己在哪一级台阶上。

  • 在 2026.8.1 之前 → 升级即可一次性跨过 90% 的历史安全债
  • 在 2026.8.1~2026.9.1 之间 → 还剩 10 条(1 + 3 + 1 + 2,另加 3 条 iOS)
  • 在 2026.9.3 及以上 → 全部 103 条已覆盖

五、三个容易踩空的实操细节

5.1 一条公告修四个包

GHSA-g7fw-3gjp-g5hf 是个特例:它在 vulnerabilities 数组里挂了 4 个包——@openclaw/feishu、@openclaw/googlechat、@openclaw/matrix、@openclaw/msteams,受影响版本都是 < 2026.8.1,修复版本都是 2026.8.1,CWE-862 + CWE-863。标题是"Channel read actions could skip target allowlists"(频道读取动作可能跳过目标白名单)。

GHSA-g7fw-3gjp-g5hf 公告详情页,一页覆盖 4 个 IM 集成包

这意味着 100 条公告实际覆盖 103 个包版本条目,涉及 12 个不同的包名:

包名 条目数
openclaw(主包) 84
@openclaw/feishu 4
OpenClaw iOS 3
@openclaw/discord 2
@openclaw/slack 2
@openclaw/matrix 2
@openclaw/diagnostics-prometheus 1
@openclaw/whatsapp / @openclaw/voice-call / @openclaw/line / @openclaw/msteams / @openclaw/googlechat 各 1

主包占 84 条,另外 19 条散落在 11 个卫星包和 iOS 客户端里。 如果你的资产清单只登记了 openclaw 主包,会漏掉将近五分之一的公告。

5.2 extended-stable 通道并不覆盖全部安全修复

这是最容易被忽略的一条。npm 上 openclaw 的 dist-tags 显示:latest = 2026.10.3,beta = 2026.10.5-beta.4,extended-stable = 2026.8.35。

extended-stable 的设计意图是给生产环境一个稳定的落点。但交叉核对后有三条公告的修复版本高于 2026.8.35,也就是这个通道上的用户拿不到:

GHSA 包 修复版本 摘要
GHSA-5x6q-wg56-rxg8 openclaw 2026.9.2 Discord 实时转录可能继承另一位说话者的 owner 身份
GHSA-rx8p-qcpv-c7vr @openclaw/diagnostics-prometheus 2026.9.3 Prometheus 诊断接口可能漏掉 operator.read 校验
GHSA-xvwp-wmh2-fq48 @openclaw/discord 2026.9.3 Discord 资源上传可能跳过发送者媒体策略

加上 3 条 iOS 公告(修复版本 2026.8.11,该版本从未在 npm 上发布过——iOS 客户端走的是 App Store 分发链路),extended-stable 通道上一共滞留 6 条公告。

如果你用 extended-stable 是为了避开 beta 的变更风险,那这 6 条是你需要单独评估的敞口。其中 GHSA-rx8p-qcpv-c7vr 的影响面要特别注意:Prometheus 是运维监控组件,接入它的通常是有较高权限的基础设施。

5.3 版本区间写法有四种形态,手工核对容易漏

103 条漏洞条目里的 vulnerable_version_range 字段不是统一格式:

写法 条数 示例
< 版本(简单上界) 65 < 2026.8.1
>= 低, < 高(区间窗口) 24 >= 2026.7.2, < 2026.9.2
<= 版本(闭区间上界) 8 <= 2026.6.6
= 版本(精确锁定) 3 = 2026.7.1-2

那 3 条精确锁定是最容易在自动化扫描里被漏掉的:

  • GHSA-356g-m7rx-7pm3:= 2026.7.1-2,修复版本 2026.8.1
  • GHSA-v7hx-r36p-f68m:= 2026.6.6,修复版本 2026.6.9
  • GHSA-3pmr-x9g8-m55r:= 2026.6.6,修复版本 2026.6.9

前者的 2026.7.1-2 是一个 npm 上真实存在的预发布版本号,而大多数 semver 范围匹配逻辑处理带连字符后缀的版本时会走到特殊分支。手写 >= 2026.7.1 && < 2026.8.1 这类判断很容易把它算进去,但如果你的规则是"低于 2026.8.1 全部命中",那另外 24 条区间窗口型条目又可能被误判。

这也是为什么不要自己解析版本区间——用官方通道。GitHub 的 Security Advisories 文档 说明了通告结构与查询方式,npm 上的包元数据也会带上受影响版本信息。

六、怎么判断你的实例处在哪一级台阶

把上面的分析转成一份可执行的自查清单:

第一步:查你的当前版本落在哪个区间


npm view openclaw version

第二步:对照四个关键分界线

你的版本 状态 建议
< 2026.6.6 存在 CVSS 8.8 的 exec 审批绕过 立即升级,不要评估
< 2026.7.1 仍受 exec 审批族 2 条影响 尽快升级
< 2026.8.1 90.3% 的历史安全债未修复 升级,这是最重要的台阶
2026.8.1 ~ 2026.9.1 剩余 7 条(不含 iOS) 评估是否接受
>= 2026.9.3 且非 extended-stable 全部 103 条已覆盖 可以放松跟踪频率
2026.8.35(extended-stable) 6 条未覆盖 单独评估这 6 条是否命中你的配置

第三步:确认资产清单的完整性

检查你是否同时追踪了 IM 集成包。如果只跟踪 openclaw 主包,19 条公告会被漏掉。具体看哪些集成在用——飞书是条目最多的(4 条),Discord/Slack/Matrix 各 2 条。

第四步:验证 exec 审批的绑定方式

这是本文最想传达的一条工程建议。基于 GHSA-74gc-hg2m-79p9 和 GHSA-3mq7-q27j-mq7q 这两条 High,你的审批配置应当做到:

  • 审批绑定到完整命令字符串,而非命令名前缀
  • 审批绑定到绝对工作目录,且目录内容变更即失效
  • 审批设置有效时间窗,不长期复用
  • 对 exec 白名单的输入解析做严格转义,特别是换行符

七、这份数据不能证明什么

为避免过度解读,明确标注本文的口径边界:

UNKNOWN / 未验证项:

  1. 公告数量上界未知。 GitHub API 对该仓库返回的 100 条是当前全量(侧栏显示 Moderate 100,4 页),但我们只通过 API 分页取到 100 条,无法排除存在未公开或已撤回的条目。100 是已公开量的观测值,不是安全问题的真实总数。
  2. 未验证任何漏洞的实际可利用性。 本文所有结论来自公告元数据字段,未做任何渗透测试或漏洞复现。CVSS 8.8 是官方评分,不是实测影响。
  3. 未在真实环境验证升级路径。 版本号与发布时间取自 npm registry 元数据与 GitHub Releases,未实际执行升级、未验证各版本间的兼容性。2026.8.1 一次性关闭 51 条公告这一事实,可能包含相关联的一组修复,但它们是否构成一个可独立回滚的变更集,官方未说明。
  4. extended-stable 滞留 6 条的判断基于版本号比较,未核实 OpenClaw 是否通过其他方式(如补丁分发)向该通道回补了这几条修复。
  5. IM 集成包的分发渠道未核实。 @openclaw/feishu 等卫星包的版本发布节奏是否与主包同步,官方未公开说明;我们只比对了公告声明的修复版本与 npm 上的发布时间。
  6. 100 条公告全部无 CVE 编号这一观察基于 GitHub API 的 cve_id 字段当前值。CVE 编号存在滞后分配的可能,不能据此断言这些漏洞永远不会有编号。

八、来源

本文全部数据来自以下来源,抓取时间 2026-10-15:

  1. OpenClaw Security Advisories 列表页 — 100 条公告的官方发布入口
  2. GitHub Advisory Database:影响 openclaw 的公告 — 跨仓库视角的交叉核对
  3. GHSA-3fp5-v549-9v66 — flock 包装器绕过持久化 exec 审批绑定,CVSS 8.8
  4. GHSA-74gc-hg2m-79p9 — 可复用 exec 审批授权改动参数
  5. GHSA-3mq7-q27j-mq7q — exec 审批生命周期超出审核过的工作目录
  6. GHSA-jjpc-p3xf-8g7p — iOS Control UI 未强制已保存的 Gateway TLS 固定
  7. GHSA-g7fw-3gjp-g5hf — 一条公告覆盖 4 个 IM 集成包
  8. GitHub Docs:Security Advisories — 通告结构与官方查询方式
  9. npm registry: openclaw — 各版本发布时间与 dist-tags
  10. OpenClaw Releases — 官方发布记录
  11. FIRST CVSS v3.1 规范 — CVSS 评分口径
  12. CWE-863 Incorrect Authorization / CWE-862 Missing Authorization — 弱点分类定义

方法说明:通过 GitHub REST API GET /repos/openclaw/openclaw/security-advisories?per_page=100 拉取原始 JSON,逐条解析 severity、cvss.score、cwes[].cwe_id、vulnerabilities[].package.name、vulnerable_version_range、patched_versions 六个字段,聚合统计得出。全量解析,未抽样。同一公告覆盖多个包时按 vulnerabilities 数组分别计数,故条目总数 103 大于公告数 100。

赞(0)
未经允许不得转载:时间网 » OpenClaw 的 100 条安全公告解剖:51 条高危里,有 49 条其实是同一类错

更好的WordPress主题

支持快讯、专题、百度收录推送、人机验证、多级分类筛选器,适用于垂直站点、科技博客、个人站,扁平化设计、简洁白色、超多功能配置、会员中心、直达链接、文章图片弹窗、自动缩略图等...

联系我们联系我们

登录

找回密码

注册