Node.js 修复了可能让攻击者使应用程序崩溃的严重 HTTP 错误

Node.js 发布了一个高危漏洞的更新,攻击者可能利用该漏洞破坏进程并导致意外行为,例如应用程序崩溃和潜在的远程代码执行 (RCE)。

被称为 CVE-2021-22930 的释放后使用漏洞与该语言中 HTTP2 流的处理方式有关。

Node.js 推出了针对该缺陷的即时修复程序

本周,Node.js 推出了针对高严重性、释放后使用漏洞的修复程序,跟踪为 CVE-2021-22930。

当程序尝试访问先前已释放且不再持有该资源的内存地址处的资源时,会出现释放后使用漏洞。

在某些情况下,这可能会导致数据损坏或意外行为,例如应用程序崩溃,甚至远程代码执行 (RCE)。

修复程序出现在最新的 Node.js 版本 16.6.0 中,并且还向后移植到版本 12.22.4 (LTS) 和 14.17.4 (LTS)。

下面显示的修复程序已应用于多个 Node.js 分支以压缩释放后使用漏洞:

Node.js 修复了可能让攻击者使应用程序崩溃的严重 HTTP 错误
简单的修复解决了漏洞GitHub

Eran Levin 因报告此漏洞而受到赞誉。

高严重性漏洞的突然更新发布的解释是围绕该漏洞的讨论已经公开:

“我们通常喜欢提前通知并提供唯一更改是安全修复的版本,但由于此漏洞已经公开,我们认为在已经计划的版本中快速修复此修复程序更为重要,” 红帽宣布首席软件工程师和 NodeJS 技术指导委员会 (TSC) 成员 Daniel Bevenius。

中止 HTTP 连接时触发的错误

该漏洞是在 Node.js 解析传入的 RST_STREAM 帧的情况下触发的,没有错误代码或取消代码。

在基于HTTP/2 协议的应用程序中 ,RST_STREAM 帧由打算终止连接的任一主机发送。

例如,在客户端-服务器架构中,如果客户端应用程序想要结束连接,它会向服务器发送一个 RST_STREAM 帧。

收到帧后,服务器将停止响应客户端,最终中止连接。服务器即将发送给客户端的任何“数据”帧都可以被丢弃。

但是在存在漏洞的 Node.js 版本的情况下,当服务器收到带有“取消”代码 ( nghttp2_cancel )的 RST_STREAM 帧时,接收方会尝试“强制清除”收到的任何数据。

并且,一旦完成,自动回调将另外运行“关闭”函数,尝试第二次释放在上一步中已经释放的内存。

而且,这将导致应用程序崩溃,或由于双重释放错误而导致的不稳定行为。

马修·道格拉斯 (Matthew Douglass) 于 2021 年 6 月 8 日在公共线程上报告了这个错误——以前被认为是“错误”而不是可利用的漏洞。

Douglass 能够在他的系统上 100% 的时间重现该错误,从而导致应用程序崩溃。

Douglass 和 Node.js 贡献者之间的讨论持续了一个多月:

“这个问题似乎是因为处理收到的 RST_STREAM 帧没有错误代码和取消错误代码。”

“节点试图强制处理它并清除流的任何现有数据。这会导致nghttp2关闭已经破坏的流,从而导致双重释放错误,”GitHub 用户kumarak回应道。

推出的修复将 RST_STREAM 帧的传入流添加到队列中,并在安全时处理队列。这将防止任何双重释放或释放后使用错误。

Node.js 用户应升级到最新版本 16.6.0,或修补的向后移植版本。

正文完
 0