CVE-2026-34166LiquidJS是一个纯JavaScript模板引擎。在10.25.3版本之前,当启用memoryLimit选项时,其replace过滤器对内存使用的计算存在缺陷。代码仅计算原始字符串和替换内容的长度,但在模式多次出现时,实际输出的大小可能呈二次方增长。这允许攻击者通过控制模板内容绕过DoS防护机制,造成约2500倍的内存放大,从而导致服务器内存耗尽和拒绝服务。
该漏洞的根源在于LiquidJS的replace过滤器在启用memoryLimit保护时的算法逻辑错误。当系统计算内存消耗时,仅使用了str.length + pattern.length + replacement.length的线性公式。然而,底层的执行逻辑是str.split(pattern).join(replacement)。如果攻击者构造了一个包含大量特定模式的输入字符串(例如重复字符),split操作会产生一个巨大的数组,随后的join操作生成的字符串长度可能远超预期。这种差异导致了内存消耗的二次方增长。攻击者无需认证即可利用此漏洞,只需发送包含恶意模板的请求,即可触发约2500倍的内存放大。由于内存限制检查被错误地通过,攻击者可以耗尽服务器内存,导致Node.js进程崩溃,从而实现拒绝服务攻击。