CVE-2025-67442 分析报告:CE 6.2.0-4 存在性评估
分析日期:2026-05-15
分析版本:EVE-NG CE 6.2.0-4
分析方法:源码分析 + 三步过滤法(情境/链路/场景)
1. CVE 概述
| 项目 |
内容 |
| CVE ID |
CVE-2025-67442 |
| 原始报告 |
XunMInt/cve |
| 影响版本 |
EVE-NG 6.4.0-13-PRO(专业版) |
| CVSS 3.1 |
7.6 HIGH (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:L) |
| CWE |
CWE-22 — Path Traversal |
| 漏洞类型 |
目录遍历(/api/export 接口) |
漏洞描述
/api/export 接口在处理用户提交的文件路径参数时,未对 .. 路径穿越序列做过滤。攻击者构造包含 ../../ 的 JSON 请求,可读取任意系统文件并打包到 ZIP 导出。
2. 源码验证
2.1 路由入口
api.php:1236
$app -> post('/api/export', function() use ($app, $db) {
// ...
$p = json_decode(json_encode($event), True);
$output = apiExportLabs($p);
});
2.2 漏洞函数
api_labs.php:201-278 — apiExportLabs()
path 参数有校验(安全)
api_labs.php:208
if (checkFolder(BASE_LAB.$p['path']) !== 0) {
// Path is not valid → 返回 400
}
functions.php:88-92 — checkFolder() 正则:
function checkFolder($s) {
if (preg_match('/^\/[\/A-Za-z0-9_\s-]*$/', $s) && is_dir($s)) {
return 0;
}
// ...
}
✅ path 参数被正则保护,., .. 字符被禁止
element 参数无校验(漏洞)
api_labs.php:224-258
foreach ($p as $key => $element) {
if ($key === 'path') {
continue; // 跳过 path,处理其他参数
}
$relement = substr($element, strlen($p['path']));
if ($relement[0] != '/') {
$relement = '/'.$relement;
}
// ❌ 未对 $relement 做任何过滤,直接拼接到 is_file / zip 命令
if (is_file(BASE_LAB.$p['path'].$relement)) {
$cmd = 'zip '.$export_file.' ".' .$relement.'"';
exec($cmd, $o, $rc);
}
}
❌ element 参数(如 "1": "/../../../../../etc/passwd")没有经过 checkFolder() 或任何 .. 过滤
2.3 调用链
POST /api/export
→ api.php:1236 路由
→ api_labs.php:201 apiExportLabs($p)
→ checkFolder(BASE_LAB.$p['path']) ← path 参数受保护
→ foreach: $relement = ... ← element 参数不受保护
→ is_file(BASE_LAB.$path.$relement) ← 路径穿越
→ exec('zip ... ".'.$relement.'"') ← 打包任意文件
3. 三步过滤法评估(适用于 CE 6.2.0-4)
第一层:情境过滤 — 多用户模型
| 检查项 |
结果 |
| CVE 原始攻击者角色 |
regular user(PRO 多用户) |
| CE 用户模型 |
单用户(只有 admin) |
| CE 中是否有权限边界可跨越? |
❌ 无 — admin = root |
| 结论 |
CE 单用户下无提权路径 |
第二层:链路过滤 — 前端盲区
| 检查项 |
结果 |
| 前端是否调用了此 API? |
✅actions.js:1695, mainCtrl.js:474 |
| 前端是否允许用户手动输入路径? |
❌ 用 data-path 属性,非自由输入 |
| API 是否可直接 curl 访问? |
✅ 带认证 cookie 即可 |
前端是否阻止 ..? |
无此需求(data-path 不含 ..) |
| 结论 |
API 层可绕过前端,但 CE 中攻击者已是 admin |
第三层:场景过滤 — 功能正确性
| 检查项 |
结果 |
导出系统文件(如 /etc/passwd)是否是用户意图? |
❌ 不是 |
| 这是否是代码缺陷? |
✅ 是(缺少输入校验) |
| admin 能否通过漏洞读到本不可读的文件? |
❌ 不能 — admin 已有完全文件访问权限 |
| 结论 |
是代码质量缺陷,非 CE 安全漏洞 |
4. 最终结论
| 维度 |
结论 |
| 漏洞代码是否存在? |
✅存在 — api_labs.php:235-237,element 参数无 .. 过滤 |
| CE 中能否从 Web UI POC? |
✅ 可行(curl + cookie) |
| CE 中是否构成安全风险? |
❌ 否 |
| 原因 |
CE 单用户 admin = root,无权限边界可跨越 |
与之前 30→0 审计的关系
本次分析与之前安全审计结论一致:CE 6.2.0-4 中的代码缺陷表现为 代码质量缺陷(缺少输入校验),但 CE 单用户模型下不存在可被有效利用的安全攻击路径。
修复建议(如需)
若 CE 未来支持多用户,需在 apiExportLabs() 中添加 $relement 的 .. 过滤:
// 在 api_labs.php:230 之后添加
if (strpos($relement, '..') !== false) {
continue; // 跳过含路径穿越的参数
}
或使用 realpath() 校验最终路径是否在 BASE_LAB 范围内。
5. 证据索引
| 文件 |
行号 |
说明 |
api.php |
1236 |
/api/export 路由注册 |
api_labs.php |
201-278 |
apiExportLabs() 函数完整实现 |
api_labs.php |
208 |
checkFolder() 保护 path 参数 |
api_labs.php |
235-237 |
❌element 参数无校验 → 路径穿越 |
functions.php |
88-92 |
checkFolder() 正则(禁止 .) |
actions.js |
1695-1700 |
前端调用 /api/export(data-path) |
functions.js |
466-496 |
前端 exportObjects() 封装 |