🔴 严重 | CVE-2026-65008 — Grav 2.0.4 (fixed in 2.0.7) contains a remote code...
🔴 【深度分析】严重安全漏洞:CVE-2026-65008
CVSS 评分: 严重(9.3)🔴 状态: Deferred 发布时间: 2026-07-21
🔍 技术细节速览
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2026-65008 |
| CVSS 评分 | 9.3 🔴 |
| 严重程度 | 严重 |
| CVSS 向量 | CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X |
| CWE 分类 | CWE-94 |
| 发布时间 | 2026-07-21 |
| 最后更新 | 2026-07-22 |
| 状态 | Deferred |
| 数据来源 | disclosure@vulncheck.com |
CVSS 4.0 评分:9.3(严重)
攻击向量:AV:N(网络) | 攻击复杂度:AC:L(低) | 攻击前置条件:AT:N(无)
所需权限:PR:N(无需认证) | 用户交互:UI:N(不需要)
影响范围:机密性/完整性/可用性均为高,但仅限于被攻击组件自身(无波及)
漏洞概述
CVE-2026-65008 是 Grav CMS 中存在的一处严重远程代码执行(RCE)漏洞。攻击者通过利用 Blueprint::dynamicData() 方法中缺少白名单的 call_user_func_array() 调用,可在服务器上以 Web 服务器用户身份执行任意 PHP 代码。该漏洞影响 Grav 2.0.4 版本,已在 2.0.7 中修复。由于漏洞的利用链可通过公共可访问页面触发,具有极高的实际威胁性。
受影响组件与版本
- 组件: Grav CMS(基于 PHP 的扁平化内容管理系统)
- 受影响版本: 2.0.4(包含)至 2.0.7(不含)
- 修复版本: 2.0.7
- 关键文件:
system/src/Grav/Common/Data/Blueprint.php中的BluePrint::dynamicData()方法
漏洞原理分析
技术成因
漏洞位于 Grav 核心的 Blueprint::dynamicData() 方法中。该方法用于动态解析页面 Frontmatter(YAML 格式的元数据),并期望接收 Class::method 格式的可调用字符串及参数数组。问题是:该方法直接将用户可控的输入作为 call_user_func_array() 的第一个参数($callable)和第二个参数($params)进行调用,且未实施任何白名单或类型验证。
// 简化示意(非精确源码)
public function dynamicData($data) {
if (is_string($data) && strpos($data, '::') !== false) {
list($class, $method) = explode('::', $data, 2);
return call_user_func_array([$class, $method], $data['params'] ?? []);
}
}
由于 call_user_func_array() 能够调用任意 PHP 类/对象上的静态方法(甚至是内置类),攻击者可以指定如 System::exec、Shell_exec 等危险组合,或者通过 __callStatic 魔术方法实现代码执行。
攻击路径
- 前提条件: 攻击者需要拥有一个具有
admin.pages或api.pages.write权限的账户(通常为页面编辑器或管理员)。 - 注入点: 在编辑页面时,攻击者可以在页面 Frontmatter(YAML 头部)中嵌入一条恶意
callable指令,例如:callable: 'System::exec' params: ['ls -la /etc/passwd'] - 触发方式: 当任何用户(包括未认证的访客)访问该页面时,Grav 在渲染过程中解析 Frontmatter,触发
dynamicData(),进而执行恶意call_user_func_array()。 - 执行效果: 命令以 Web 服务器用户身份运行,实现远程代码执行。
关键点: 漏洞的触发不需要攻击者直接访问目标页面,只需受害者(普通访客)访问即可完成攻击,因此利用条件非常宽松。
影响评估
| 维度 | 评估 |
|---|---|
| 攻击复杂度 | 低。只需编辑器权限,构建恶意 Frontmatter 即可,无需特殊技术。 |
| 利用前置条件 | 需要获得低权限后台账户(编辑者级别)。但攻击不需要额外网络访问或绕过认证。 |
| 攻击向量 | 网络远程,HTTP POST 操作(编辑页面)和 HTTP GET(触发访问)均可。 |
| 权限要求 | 触发执行不需要认证(访客可访问),但开始注入需要认证的后台编辑权限。 |
| 潜在后果 | 完全控制 Web 服务器(机密性、完整性、可用性均受破坏);可横向移动至内网;可能持久化后门。 |
| 可利用性 | 高。公开 PoC 已存在(参考 VulnCheck 报告),且利用链简单。 |
严重性评级: 9.3(严重)——符合实际威胁。
修复建议
官方补丁
- 升级 Grav 至 2.0.7 或更高版本。该版本为
Blueprint::dynamicData()添加了严格的白名单,仅允许已知安全的本地可调用函数。 - 升级命令(以 CLI 为例):
bin/gpm update
临时缓解措施(无法立即升级时)
- 限制管理员账户权限:减少拥有
admin.pages或api.pages.write的用户数量,并加强密码与多因素认证。 - 禁用 Form 插件(如果不需要):由于漏洞路径通过 Form 插件触发,临时禁用该插件可阻断攻击:
- 修改
user/config/plugins/form.yaml,设置enabled: false
- 修改
- WAF 规则:在 Web 应用防火墙中增加检测
callable、params等异常键的规则,对包含::的 YAML 字段进行拦截。 - 文件权限加固:确保 Web 用户对
user/pages/目录只有必要写入权限,避免恶意页面被创建。
检测与响应
- 检查服务器上近期编辑的页面 Frontmatter 是否包含异常内容(如
callable:字段)。 - 查看 Web 日志中是否存在访问带有
callable参数的页面行为。 - 使用文件完整性监控(如 Tripwire)追踪
system/src/Grav/Common/Data/Blueprint.php文件是否被篡改。
参考资料
| 资源 | 链接 |
|---|---|
| NVD 官方详情页 | https://nvd.nist.gov/vuln/detail/CVE-2026-65008 |
| CWE-94(代码生成控制不当) | https://cwe.mitre.org/data/definitions/94.html |
| VulnCheck 安全公告(原始披露) | https://www.vulncheck.com/advisories/CVE-2026-65008 |
| Grav 官方发布公告(2.0.7) | https://getgrav.org/blog/grav-2.0.7-security-release |
| CVSS 4.0 计算器 | https://www.first.org/cvss/calculator/4.0 |
总结
CVE-2026-65008 是一类经典的“未过滤动态函数调用”型漏洞,常见于框架对用户输入过于信任。Grav 开发团队在 2.0.7 中通过白名单方式解决了根本问题。建议所有运行 Grav 2.0.4 的站点立即升级,并检查是否已有恶意页面被植入。由于攻击门槛极低(仅需编辑权限),且受害者无法避免触发,该漏洞在当前活跃的 CMS 攻击威胁中处于高危行列。
本文基于 NVD 和 VulnCheck 公开数据撰写,技术细节推论限于现有信息,如有新增信息将及时更新。