安全研究/和中谈安全/MongoDB Server 未授权内存泄露漏洞(CVE-2025-14847)
MongoDB Server 未授权内存泄露漏洞(CVE-2025-14847)
2025-12-30 03:43分享

漏洞介绍:

MongoDB** 是一个流行的开源 NoSQL 文档数据库,广泛用于现代 Web 应用和大数据处理场景。CVE-2025-14847是 MongoDB 数据库服务器中的一个高危内存泄露漏洞,源于在处理 zlib 压缩数据时对 OP_COMPRESSED 消息中 `uncompressedSize` 字段的校验存在缺陷。攻击者可通过构造恶意的 OP_COMPRESSED 数据包,将 `uncompressedSize` 设置为远大于实际压缩数据大小的值(如 64KB,而实际解压数据仅 40 字节),服务器解压缩时会分配对应大小的内存缓冲区,但实际解压数据只能填充缓冲区的前一小部分,剩余部分保持未初始化状态并包含堆内存中的残留数据,服务器随后将整个缓冲区(包括未初始化部分)压缩后返回给客户端,导致攻击者无需任何身份验证即可从服务器内存中泄露敏感信息,包括数据库凭证、TLS 私钥、用户查询数据、会话令牌等。该漏洞需要服务器启用 zlib 压缩支持才能被利用,攻击者可以通过多次请求获取不同内存区域的数据,从而收集大量敏感信息。

漏洞影响:

CVE-2025-14847 允许攻击者在无需任何身份验证的情况下,通过网络远程触发 MongoDB 服务器的内存泄露,从堆内存中窃取敏感信息,包括但不限于数据库用户凭证、TLS/SSL 私钥、其他客户端的查询语句和数据、会话令牌、连接字符串等高价值信息。由于该漏洞影响范围极广(MongoDB 3.6 至 8.2.2 的数百个版本),且全球存在大量暴露在公网上未启用认证的 MongoDB 实例(根据 Shodan/FOFA 数据,公网暴露的 27017 端口数以万计),攻击者可以批量扫描并利用该漏洞,对企业数据安全、用户隐私、业务连续性造成严重威胁,泄露的凭证还可能被用于进一步的横向移动和权限提升攻击。

全球相关资产分布Top10:

fofa-query: protocol="mongodb" || port="27017"

 

漏洞编号:CVE-2025-14847

漏洞等级:高危

受影响版本:

MongoDB 8.2.0 至 8.2.3

MongoDB 8.0.0 至 8.0.16

MongoDB 7.0.0 至 7.0.26

MongoDB 6.0.0 至 6.0.26

MongoDB 5.0.0 至 5.0.31

MongoDB 4.4.0 至 4.4.29

所有 MongoDB Server v4.2 版本

所有 MongoDB Server v4.0 版本

所有 MongoDB Server v3.6 版本

威胁类型:内存读取未初始化旧数据

利用流程:

 

漏洞复现:

攻击者向目标 MongoDB 服务器(默认端口 27017)发送一个特制的 OP_COMPRESSED (opCode=2012) 数据包,该数据包在协议头中包含恶意构造的 `uncompressedSize` 字段(例如设置为 64KB 或更大值),而实际的 zlib 压缩数据仅有几十字节。由于 MongoDB 服务器在处理压缩数据时对 `uncompressedSize` 字段的校验存在缺陷,当服务器解压缩时会分配 `uncompressedSize` 大小的内存缓冲区,并尝试将解压后的数据(实际很小)填充到该缓冲区中。由于实际解压数据无法填满整个缓冲区,剩余部分保持未初始化旧数据状态(包含堆内存中的残留数据),服务器随后将整个缓冲区(包括未初始化旧数据部分)压缩后作为响应返回给客户端。攻击者无需任何身份验证即可通过这种方式从服务器内存中泄露敏感信息,包括数据库凭证、TLS 私钥、用户查询数据、会话令牌、内部变量值等,整个攻击过程仅需发送一个特制的网络数据包即可完成,响应大小通常超过 1KB(正常响应约 200-300 字节),从而可以识别漏洞是否成功利用。

漏洞环境:

使用 Docker 搭建受影响的 MongoDB 漏洞环境:

 

启动命令:

docker-compose up -d

 

漏洞利用:

 

 

漏洞验证:

基于 Nuclei 模板的漏洞验证通过遍历不同的文档长度偏移量(从 20 到 8192),为每个偏移量构造恶意的 OP_COMPRESSED 数据包,其中将 `uncompressedSize` 字段设置为 `docLen + 500`(远大于实际压缩数据大小),`originalOpcode` 设置为 2013,`compressorId` 设置为 2(zlib),然后通过 TCP 连接发送到目标 MongoDB 服务器的 27017 端口。验证脚本接收服务器响应后,通过多种方法检测是否存在内存泄露:提取响应中 "field name '" 模式后的字段名(排除常见字段如 '?', 'a', '$db', 'ping')、提取 "type " 模式后的 BSON 类型字节、检测 "InvalidBSON" 和 "bson length" 错误信息、提取长度大于等于 10 的可打印字符串序列、以及分析十六进制编码数据中可打印字符比例超过 50% 的片段。如果检测到任何泄露数据或响应中包含 BSON 错误信息且原始数据长度超过 50 字节,则判定漏洞存在并返回 "leak found at offset X",整个验证过程无需身份验证,仅需网络可达即可完成,一旦发现泄露数据即停止扫描以提高效率。

 

修复建议:

1、升级至官方修复版本:

8.2.x 用户升级至 8.2.3

8.0.x 用户升级至 8.0.17

7.0.x 用户升级至 7.0.28

6.0.x 用户升级至 6.0.27

5.0.x 用户升级至 5.0.32

4.4.x 用户升级至 4.4.30

2、禁用 zlib 压缩

3、网络访问控制(辅助措施)

防火墙规则

绑定地址限制

VPN/专线访问