IPBUF安全漏洞报告
English
CVE-2026-39412 CVSS 5.3 中危

CVE-2026-39412 LiquidJS原型属性泄露漏洞

披露日期: 2026-04-08

漏洞信息

漏洞编号
CVE-2026-39412
漏洞类型
信息泄露
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
LiquidJS

相关标签

信息泄露LiquidJS侧信道攻击原型污染

漏洞概述

LiquidJS是一款纯JavaScript实现的模板引擎,兼容Shopify和GitHub Pages。在10.25.4版本之前,该引擎存在安全漏洞,`sort_natural`过滤器未能正确执行`ownPropertyOnly`安全选项。攻击者利用这一缺陷,通过排序侧信道攻击,可以提取原型继承属性的值。对于依赖`ownPropertyOnly`作为安全隔离机制(如多租户模板系统)的应用程序,此漏洞可能导致敏感原型属性(如API密钥和令牌)的信息泄露,建议用户尽快升级至修复版本。

技术细节

该漏洞的核心在于LiquidJS的`sort_natural`过滤器在实现安全策略时的逻辑缺陷。当开发者启用`ownPropertyOnly: true`选项时,旨在防止模板访问对象原型链上的属性,从而保护敏感的全局变量或内部状态。然而,在受影响版本中,`sort_natural`过滤器在进行排序比较时,未正确过滤掉原型上的属性,导致安全选项失效。攻击者可以精心构造包含特定数据的输入,触发排序操作。由于JavaScript的动态特性及排序算法的实现细节,排序过程可能会间接访问或比较原型上的属性,导致排序结果发生可预测的变化。通过观察这些变化(侧信道),攻击者能够还原出原型上的敏感数据,例如全局配置的API密钥或令牌。这种攻击方式巧妙地绕过了预期的安全边界,对依赖沙箱隔离的多租户系统构成了严重威胁,无需直接属性访问即可实现信息窃取。

攻击链分析

STEP 1
侦察
攻击者识别目标应用程序使用了LiquidJS模板引擎,并确认启用了`ownPropertyOnly: true`作为安全边界。
STEP 2
构造载荷
攻击者编写包含`sort_natural`过滤器的恶意模板,该模板旨在触发排序操作并引入特定的输入数据以影响排序逻辑。
STEP 3
执行攻击
将恶意模板提交给服务器端进行渲染。在渲染过程中,`sort_natural`过滤器处理数据并意外地访问了原型链上的属性。
STEP 4
信息泄露
攻击者分析排序后的输出结果或通过观察排序行为的差异(侧信道),推断并提取出原型上存在的敏感属性值(如API密钥)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2026-39412: LiquidJS sort_natural filter bypass // This demonstrates how prototype properties can be leaked via sorting side-channel. const { Liquid } = require('liquidjs'); // Initialize LiquidJS with the security feature enabled const engine = new Liquid({ ownPropertyOnly: true }); // Simulate a sensitive property on the prototype (e.g., leaked from global scope) Object.prototype.SECRET_TOKEN = "admin_secret_key_123"; // User input context const ctx = { items: ['user_data', 'public_info'] }; // Template using the vulnerable filter // The sort operation may interact with the prototype property const template = `{{ items | sort_natural }}`; try { // Render the template const result = engine.renderSync(template, ctx); console.log("Rendered Output:", result); // In a real exploit, the attacker analyzes the output or behavior // to infer the existence or value of 'SECRET_TOKEN'. } catch (e) { console.error(e); }

影响范围

LiquidJS < 10.25.4

防御指南

临时缓解措施
若无法立即升级,应确保运行环境中(如Object.prototype)不包含敏感的原型属性,或者在模板沙箱中严格禁用`sort_natural`过滤器的使用。

参考链接

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