人工智能黑客--黑客如何在网络攻击中使用人工智能

立即阅读
我们利用人工智能进行网站翻译,虽然我们力求准确,但不一定总是 100%精确。感谢您的理解。

Mongoose CVE-2025-23061 和 CVE-2024-53900 的技术发现

OPSWAT
分享此贴

Mongoose 是用于 MongoDB 的对象数据建模(ODM)库,可简化 Node.js 应用程序中的数据库交互。通过提供基于模式的解决方案,Mongoose可将JavaScript对象映射到MongoDB文档,作为一个抽象层,帮助构建数据结构,从而简化管理和验证。Mongoose具有用于自定义逻辑执行的中间件和直观的查询构建系统等功能,可提高MongoDB的工作效率。Mongoose被誉为 "Node.js的优雅MongoDB对象建模",在GitHub上获得了27K颗星,反映了它在开发人员中的广泛使用和好评。

OPSWAT 研究金计划和重大漏洞发现

OPSWAT 关键基础设施网络安全研究生奖学金计划设在越南,为研究生提供保护关键基础设施安全的实践经验。作为该计划的一部分,研究员有机会分析和解决网络安全漏洞,与OPSWAT 专家合作应对恶意软件检测、文件安全和威胁预防等领域的实际挑战。 

在OPSWAT 研究员计划期间,参与者系统地调查和重现各种产品、库和操作系统中的已知 CVE。作为该计划的一部分,我们的杰出研究员之一 Dat Phung 选择研究 Mongoose,因为它在生产环境中被广泛采用。2024 年 11 月,他在对 Mongoose 库进行深入分析时发现了一个关键漏洞。该漏洞允许攻击者利用$where值,有可能导致 Node.js 应用服务器上的远程代码执行 (RCE)。在及时向 Mongoose 报告该问题后,Mongoose 在 8.8.3 版本中发布了一个补丁,并在国家漏洞数据库 (NVD) 中披露了 CVE-2024-53900。

CVE-2024-53900 和 CVE-2025-23061 时间轴

  • 2024 年 11 月 7 日: Dat Phung 发现 Mongoose 中存在一个关键漏洞,并向 Snyk 提交了一份安全报告。 
  • 2024 年 11 月 26 日: Mongoose 发布 8.8.3 版,以解决并修复此漏洞。 
  • 2024 年 12 月 2 日: 国家漏洞数据库(NVD)披露了此漏洞的 CVE-2024-53900。 
  • 2024 年 12 月 17 日:在分析 Mongoose 的 8.8.3 补丁时,Dat Phung 发现了一个仍可实现 RCE(远程代码执行)的旁路。向 Tidelift 提交了一份详细的安全报告。 
  • 2025 年 1 月 13 日:Mongoose 发布了 8.9.5 版,推出了一个增强补丁,有效解决了旁路问题。 
  • 2025 年 1 月 15 日:国家漏洞数据库(NVD)正式披露了 CVE-2025-23061,强调了新发现漏洞的严重性。

Mongoose 的 Populate() 方法

Mongoose 还提供了一个名为 populate() 的实用功能,它增强了处理文档间关系的能力。虽然 MongoDB ≥ 3.2 版本有用于连接的 $lookup 聚合操作符,但 Mongoose 的 populate() 提供了更强大的替代功能,可自动用相关文档中的相应数据替换引用。这对于管理不同 MongoDB 集合之间的关系尤其有用,例如当一个文档通过 _id 引用另一个文档时。[2] 

为作者定义 Mongoose 模式的 JavaScript 代码,包含姓名、年龄和简历字段
作者模式
定义 Mongoose 图书模式的 JavaScript 代码,包括标题、描述、价格和作者参考信息
图书模式
检索图书详细信息并填充作者或评论字段的 Node.js 路由的 JavaScript 代码片段
Nodejs 应用程序

在 Mongoose 中定义模式时,可使用 ref 选项将字段设置为引用另一个模型。然后,populate() 方法将用相关模型中的完整文档替换引用字段(ObjectId)。例如,在一个书店应用程序中,bookSchema中的作者字段引用了作者文档,而评论字段引用了评论文档。通过 populate() 方法,开发人员可以在查询图书模型时将作者字段(对象 ID)替换为完整的作者文档。

populate() 允许开发人员在查询图书模型时用完整的作者文档替换作者字段(这是一个 ObjectId):

存储图书详细信息的 MongoDB 文档的 JSON 表示形式,未扩展作者信息
不使用 populate()
MongoDB 文档的 JSON 表示形式,使用 populate 函数扩展了作者详细信息
使用 populate()

此外,Mongoose的populate()方法支持自定义查询,以定义检索哪些相关文档以及如何获取这些文档。通过匹配选项等属性,开发人员可以过滤、排序、限制和跳过相关文档,从而提供灵活的数据检索功能。

JavaScript 代码演示了使用 Mongoose 的 populate 函数按年龄筛选作者的自定义查询
Mongoose 中 populate() 中的自定义查询

CVE-2024-53900 分析

作为OPSWAT 网络安全研究生奖学金项目的一部分,Dat Phung 在分析 Mongoose 以重现已知 CVE 的同时,对 populate() 方法的内部运作进行了全面审查,该方法在处理 MongoDB 文档之间的关系方面发挥着关键作用。populate() 方法支持字符串和对象参数,开发人员可以使用匹配选项对检索到的数据进行特定过滤:

展示使用 $where 操作符在查询中按年龄筛选作者的 JavaScript 代码

在上面的示例中,匹配选项是一个过滤器对象,它可以包含 MongoDB查询操作符,详见《查询和投影操作符--MongoDB 手册 v8.0》。其中一个值得注意的操作符是$where,它可以直接在 MongoDB 服务器上执行 JavaScript。不过,这种在 MongoDB 服务器上的执行受到限制,仅支持基本操作和函数。

列出可用于 MongoDB 映射还原操作的 JavaScript 函数和属性的表格

Dat Phung 对 Mongoose 源代码进行了深入分析,以了解populate()方法的工作流程。他发现,应用程序在模型上调用 populate()方法后,会触发 populate() 函数。在该函数中,Mongoose 调用 _execPopulateQuery() 函数,该函数使用 MongoDB 服务器上的$where操作符执行查询。随后,将检索外部集合中的所有文档,以便在接下来的步骤中进行填充。

分析 Mongoose 填充查询执行情况的 VS 代码调试会话截图

从 MongoDB 获取数据后,Mongoose 会执行回调函数_done(),该函数会调用_assign()来准备数据,然后通过调用assignVals()函数来 "连接 "两个模型。

VS Code 中的调试会话,显示 Mongoose 中与 $where 查询相关的高亮 JavaScript 代码

当 Mongoose 的assignVals() 函数处理检索到的数据时,可能会出现该漏洞。该函数检查匹配选项是否为数组,如果是,则将每个运算符传递给sift()函数。sift() 函数是从一个同名的外部库中导入的,它在应用服务器上本地处理这些查询。这种本地处理会带来安全风险,尤其是在处理用户控制的输入时。

显示 JavaScript 函数内部变量赋值的 VS 代码调试会话

为了进一步研究这个问题,Dat Phung 修改了匹配选项中的值,以确保满足条件,从而调用sift() 函数对数据流进行额外分析。

示例 Mongoose 查询的 JavaScript 代码片段,其中包含 $where 过滤条件

有了这个条件,$where操作符随后就被传递给了sift()函数。

显示 JavaScript 函数中过滤值的 VS 代码调试会话

sift 库是一个轻量级 JavaScript 工具,旨在使用类似 MongoDB 的语法过滤和查询数组或 JSON 对象等数据集合。根据官方文档,"Sift 是一个用于在 JavaScript 中使用 MongoDB 查询的微型库"。sift()函数在应用服务器上而不是在数据库服务器上评估类似 MongoDB 的过滤操作,这在处理不信任的输入时会使系统面临重大安全风险。

使用 Sift.js 根据年龄标准过滤对象数组的简单 JavaScript 代码段
Sift 代码示例

通过继续分析,我们的研究员在 sift 库的createDefaultQueryTester()函数中发现了一个问题。该函数将匹配数组中的每个操作转换为可执行的 JavaScript 函数,然后用于在本地过滤和处理 MongoDB 文档数据。为此,createDefaultQueryTester()会调用createNamedOperation()函数,并将匹配数组中的$where等操作作为参数传递。 

以查询操作和函数执行为重点的 VS 代码调试课程

对于匹配数组中的每个操作,createNamedOperation 都会检查是否支持该操作,然后将其传递给相应的函数。

显示 $where、$eq 和 $exists 等查询操作符的 JavaScript 调试会话

如果操作为$where,则会使用原始 "params "值生成 JavaScript 函数,该值来自匹配数组中的$where操作符,可由用户控制。

高亮显示的 JavaScript 代码段,演示了 CSP(内容安全策略)启用时的函数执行情况

CVE-2024-53900:漏洞利用详情

虽然 MongoDB 通过$where操作限制 JavaScript 函数的执行,但如前文所分析,sift()函数允许这些函数不受此类限制地执行。由于 "params "值直接由用户输入控制,因此这种缺乏输入验证和限制的情况会带来严重的安全漏洞,从而可能导致代码注入攻击。为了更深入地研究这个问题,Dat Phung 构建了以下查询:

显示 Mongoose 查询的 JavaScript 代码段,该查询使用了带有潜在不安全函数执行的 $where 条件

最初,查询未能执行另一个进程,导致出现以下错误:

MongoDB 错误日志显示由于未定义的全局引用导致服务器执行失败

该错误表明 Mongoose 在将控制权传递给 sift() 函数之前,试图在 MongoDB 服务器上执行$where操作。但是,由于 MongoDB 的$where子句对 JavaScript 函数有限制,因此发生了错误,导致查询无法执行。因此,Mongoose 在到达sift() 函数之前就停止了进程。

为了绕过这一限制,我们的研究员利用了应用服务器上的 "全局 "变量,而 MongoDB 服务器上并不存在该变量。通过这种方法,他绕过了 MongoDB 服务器上的限制,使查询能够到达sift()函数:

电脑显示器上显示 "代码不工作 "的文字,突出了编码过程中的问题

有了这个值,当 Mongoose 在 MongoDB 上执行$where操作时,"global "变量的缺失会导致三元运算符(typeof global != "undefined" ?global.process.mainModule.constructor._load("child_process").exec("calc") :1)返回 1,防止 MongoDB 引发错误。因此,查询可以在 MongoDB 服务器上顺利执行。

然而,当相同的值到达sift()函数时(该函数运行在 "全局 "变量可用的应用服务器上),就会触发以下函数的创建:

黑体字 "hello world "的单色屏幕

远程代码执行 (RCE) 概念验证

在博客开头提供的应用程序示例中,如果攻击者发送以下请求,他们就能成功执行远程代码执行 (RCE) 攻击:

黑白屏幕上以醒目的粗体字显示 "纽约时报 "字样
图表说明 Mongoose CVE 漏洞的技术细节,显示数据流和安全漏洞点

该视频演示了影响 8.8.3 之前 Mongoose 版本的 CVE-2024-53900 概念验证,该版本缺乏适当的输入验证,无法防止与sift库一起滥用$where运算符。

不完全修复和 CVE-2025-23061

根据 Dat Phung 的安全报告,Mongoose 推出了一个补丁,目的是在公开披露之前解决之前发现的漏洞 (CVE-2024-53900)。相关补丁(Automattic/mongoose@33679bc)添加了一项检查,禁止在传递给populate() 的匹配属性中使用$where

此代码段检查传入 populate() 的匹配属性是否为数组。如果是,代码会遍历数组中的每个对象,查看其中是否包含 $where操作符。如果检测到$where,就会引发错误,从而阻止恶意有效载荷传播到有风险的 sift() 函数。  

因此,利用 CVE-2024-53900 的有效负载无法通过此检查,因为匹配数组中的一个对象包含$where,从而有效地阻止了它进入sift()

虽然该更新能正确阻止在单个嵌套层中直接使用$where,但却无法检测到嵌入 $or操作符中的$where ,而 MongoDB 和 sift 库都完全支持这种结构。

MongoDB 支持 $or 操作符
Sift 库支持 $or 运算符

因此,攻击者可以在$or下嵌套$where,以规避补丁的单层检查。由于 Mongoose 只检查匹配数组中每个对象的顶层属性,因此旁路有效载荷不会被检测到,并最终到达 sift 库,实现恶意 RCE。

用于绕过 mongoose 8.8.3 修复的有效载荷

CVE-2025-23061 的概念验证

为了说明修复的不完整性,Dat Phung 使用 Mongoose 8.9.4(晚于 8.8.3)版本重建了示例应用程序。通过在 $or子句中嵌套 $ where,攻击者可以成功绕过检查并实现RCE。

概念验证漏洞利用演示了如何在 Mongoose 8.9.5 之前的版本中触发 CVE-2025-23061,允许攻击者在服务器上执行任意代码:

缓解和指导

为减少上述漏洞,请确保您的系统已更新到 Mongoose 的最新版本。

使用 SBOM 引擎的MetaDefender Core 可以检测到此漏洞

OPSWAT MetaDefender Core配备了先进的SBOM软件 物料清单)功能,使企业能够采取积极主动的方法来应对安全风险。通过扫描软件应用程序及其依赖关系,MetaDefender Core 可识别所列组件中的已知漏洞,如 CVE-2024-53900 和 CVE-2025-23061。这样,开发和安全团队就能确定修补工作的优先次序,在潜在的安全风险被恶意行为者利用之前将其降低。 

下面是MetaDefender Core 通过 SBOM 检测到的 CVE-2024-53900 和 CVE-2025-23061 的截图:

此外,这些 CVE 还可以通过 MetaDefender 软件 Supply Chain利用MetaDefender Core 和 SBOM 来识别这些漏洞。

通过OPSWAT 了解最新信息!

立即注册,即可收到公司的最新动态、 故事、活动信息等。