Craft CMS 一次披露 6 个漏洞,官方在 5.11.2 中全部修复,CVSS 3.1 最高 9.8、CVSS 4.0 最高 9.3。其中最值得注意的有两条:匿名 GraphQL 客户端可以通过 prev/next 字段逐跳读取被 schema 排除在外的 section 内容;非管理员的控制面板账号则可以利用模板签名问题,以 PHP worker 的身份执行系统命令。CVE 记录于 2026 年 11 月 8 日集中建档,分配方为 VulnCheck。
事件概述
受影响范围为 Craft CMS 5.0.0 至 5.11.1,修复版本 5.11.2。项目当前最新发布为 5.12.0.1(2026 年 11 月 3 日),说明补丁已经在一周多以前落地,但只在官方公告渠道流通,很多站点并未跟进。Craft CMS 在国内多用于企业官网、品牌站与内容中台,暴露在公网的多为带 GraphQL 接口的 headless 部署,恰好是本次两枚高分漏洞的正中靶心。
六枚漏洞逐条说明
- CVE-2026-124427(9.3 / 3.1 向量 9.8):GraphQL schema 范围绕过。匿名客户端利用
prev/next字段,从一个可见的 in-scope 条目跳到下一个,逐跳枚举出被刻意排除的 section 条目,读到标题、slug 与自定义字段内容。 - CVE-2026-124430(8.7 / 8.8):远程代码执行。非管理员的面板用户可以通过
app/render-elements端点拿到 HMAC 签名的 Twig 模板,再把这段签名模板作为登录跳转的returnUrl提交,触发不走沙箱的renderObjectTemplate()求值。 - CVE-2026-124429(8.7 / 8.7):公开注册提权。未认证访客用已停用的账号注册,设置新密码后继承
userpermissions_users里残留的直接权限;在关闭邮箱验证的站点上,这直接等于接管一个特权账号。 - CVE-2026-124428(7.1 / 7.1):任意文件读取。5.7.0 起,已登录的面板用户可向
app/icon-svg提交任意路径(含别名与绝对路径),读取 PHP 进程有权限读取的任何 SVG 内容文件,可越出安装目录。 - CVE-2026-124426(6.9 / 6.9):GraphQL Sites 范围绕过。POST 到
/actions/graphql/api查询 localized 字段时不带siteId,即可读到 schema 站点范围之外的内容。 - CVE-2026-124431(5.3 / 5.3):低权限用户绕过卷权限,借替换卷弹窗浏览无权限卷的目录结构(不含文件内容)。
技术细节:两条链为什么能串起来
GraphQL 那条链的本质是「以对象为单位的权限判定」被「以字段为单位的跳转」绕开。schema 的 Sites 与 Section 范围限制只校验了入口查询的顶层对象,prev/next 这类关系字段在解析下一跳时没有重新套用同一套范围检查,于是攻击者用一个合法可见的条目做跳板,沿着关系边一路走到不该看的 section。修复方式是让每一跳都重新过一遍范围校验,而不是只在入口校验一次。
RCE 那条链的关键在于「签名」被当成了「可信」。app/render-elements 会把待渲染模板做成 HMAC 签名载荷,本意是防止客户端篡改模板内容,但签名只保证「内容没被改」,不保证「内容来自可信来源」。攻击者让服务端为自己的一段 Twig 签好名,再把这段签名当作登录成功后的跳转地址交回去,登录流程把它当作内部可信模板直接求值,沙箱与转义都被跳过。这类「签名预言机」模式在 2026 年已经出现过多次,凡是把签名等同于授权的接口都值得复查。
影响评估
对外只读的展示型站点,9.8 分的 GraphQL 越权意味着被隐藏、未发布、仅内部可见的内容可能被整体拖走,包括未公开的产品线、报价字段与草稿。带会员体系或多站点授权的 Craft 部署,风险更高:注册提权可以零门槛拿到面板账号,再叠加模板签名链就是完整的代码执行。
需要提醒的是,RCE 需要「非管理员面板账号」这一前提,纯前后端分离、完全关闭控制面板的部署不具备该条件;但公开注册若开着,攻击者可以自行注册一个最低权限账号来满足前提。
修复建议
- 升级到 5.11.2 或更高版本(最新 5.12.0.1)。这是唯一彻底方案,官方未提供独立补丁包。
- 关闭公开注册,或强制开启邮箱验证;删除长期停用的账号而非保留,避免残留在
userpermissions_users里的权限被回收利用。 - 不需要 GraphQL 的站点,直接在配置中关闭 GraphQL 接口,或对
/actions/graphql/api加 IP 白名单,这是成本最低的收敛手段。 - 审计控制面板账号清单,移除不必要的面板访问权限,尤其是仅有内容编辑需求却拥有
render-elements调用能力的账号。 - 检查访问日志中的
/actions/graphql/api高频匿名 POST,以及returnUrl参数带长 Base64 或 Twig 片段特征({{、{%)的登录请求,这类特征在真实利用中极易识别。