CVE-2026-24001jsdiff是一个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文件即可触发漏洞,无需大量数据。