近日,OPSWAT在其中详细阐述了针对MongoDB和Node.js的开源Mongoose对象数据建模(ODM)库的两个关键漏洞及其概念验证(PoC)利用方式。这两个漏洞被追踪为CVE-2024-53900和CVE-2025-23061,具有危急的CVSS3得分,分别为9.1和9.0。
CVE-2024-53900最早于2024年11月被发现并修复,可能通过搜索注入导致Node.js应用服务器的远程代码执行。而CVE-2025-23061上个月修复,实际上是在绕过CVE-2024-53900的原始补丁,稍微调整代码后也能导致远程代码执行。
Mongoose作为一个方便的工具,极大地简化了MongoDB与Node.js应用之间的交互,受到许多应用开发者的欢迎,在GitHub上拥有超过27,000个星标和3,800个分支,在NPM包库中更是有超过19,000个依赖。
这两个漏洞涉及到$where操作符,该操作符可以与populate()函数结合使用,从MongoDB文档中过滤出需要替换引用并填充的特定数据。$where操作符允许执行任意的JavaScript代码来定义特定的数据检索条件,这就意味着如果攻击者控制了$where后面的输入,可能会执行恶意代码。
通常情况下,试图在MongoDB服务器上通过$where执行恶意代码会导致错误,因为MongoDB服务器仅允许执行预定义的一系列基本操作和函数。然而,OPSWAT的关键基础设施网络安全研究员DatPhung发现,恶意代码可以通过位于populate()内部的sift()函数,得以在应用服务器上本地执行。
通过精心设计查询以确保请求能够传递到sift(),同时避免触发MongoDB服务器错误(方法是包含一个MongoDB无法识别的变量),Phung成功在Node.js应用服务器上实现了远程代码执行。
Mongoose的维护者在8.8.3版本中修复了CVE-2024-53900漏洞,禁止在传递给populate()的匹配属性中使用$where。然而,Phung发现如果$where操作符嵌入在$or操作符之中,仍然可以传递给populate(),这就是被追踪为CVE-2025-23061的漏洞。
Phung开发了一个新的PoC利用,展示了即使在初始补丁之后,通过将$where嵌套在$or子句内,仍然可以在应用服务器上实现远程代码执行。该绕过漏洞在Mongoose版本8.9.5中得到修复,OPSWAT建议开发者升级至最新版Mongoose以解决这两个漏洞。
建议开发者尽快更新Mongoose库 ,以确保系统安全。
Leave a Reply