JavaScript Web 应用程序和 Web 服务器容易受到称为正则表达式(regex)拒绝服务(ReDoS)的特定类型的漏洞/攻击。当攻击者将大量复杂的文本发送到基于 JavaScript 的 Web 服务器或应用程序的开放输入时,就会发生这些漏洞。
如果服务器组件或应用程序库不是专门设计用于处理各种边缘情况,则攻击者的输入最终会一次阻止整个应用程序或服务器几秒钟或几分钟,而服务器会分析并模式匹配输入。
各种编程语言和 Web 服务器技术在模式匹配操作和 ReDoS 攻击的性能方面存在类似的问题,由于大多数 JavaScript 服务器的单线程执行模型,每个请求都由同一个线程处理,因此在 JavaScript 的情况下它们被夸大了。
2017 年发布的后续研究显示,Node.js 库和应用程序中发现的漏洞总数中有 5% 是 ReDoS 漏洞。在上周的一次安全会议上,ReDoS 问题由于多年未得到解决,在 JavaScript 社区引起重视。来自德国达姆施塔特技术大学(Technical University in Darmstadt, Germany)的两名学者 Cristian-Alexandru Staicu 和 Michael Pradel 表示,他们在流行的 Node.js 模块中发现了 25 个以前未知的漏洞。
Staicu 和 Pradel 说这些漏洞的主要原因是缺乏对正则表达式匹配性能的关注,因为大多数开发人员似乎都专注于准确性,在代码中留下了大量漏洞,攻击者可以使用 ReDoS 攻击来利用这些漏洞。
两人经过进一步研究,设计出了一种在实际网站上检测这些漏洞而无需实际使用 ReDoS 漏洞利用代码的方法。他们使用这种方法扫描 2,846 个流行的基于 Node.js 的站点,显示 339 个大约 12% 的站点容易受到至少一个 ReDoS 漏洞的攻击。研究小组表示,“ReDoS 对这些网站的可用性构成严重威胁,我们会开发用于检测和缓解 JavaScript 中 ReDoS 漏洞的技术。”