MongoBleed 是一款高性能安全审计工具,旨在检测并演示 CVE-2025-14847。该漏洞允许未经身份验证的远程攻击者通过利用 zlib 解压缩逻辑中的长度不匹配缺陷,从 MongoDB 服务器泄漏未初始化的堆内存片段。
为了安全测试此脚本,请使用以下 docker-compose.yml 启动一个存在漏洞的 MongoDB 8.2.2 实例。
运行实例:
docker-compose up -d
确保已安装 Python 3.8 或更高版本。无需外部库(使用内置的 socket、zlib 和 concurrent.futures)。
基本扫描
python mongobleed.py --host 127.0.0.1 --port 27017
高级选项
python mongobleed.py --host 127.0.0.1 --threads 50 --range 100 10000 --output leak_dump.bin
该脚本发送一条特制的 OP_COMPRESSED(操作码 2012)消息。它谎报了有效负载的未压缩长度。MongoDB 服务器会按照“谎报”的大小分配一个堆缓冲区,将少量数据解压到其中,然后错误地将整个未初始化的缓冲区返回给客户端。
解决 CVE-2025-14847 的唯一永久方法是升级 MongoDB 二进制文件到包含 OP_COMPRESSED 长度验证逻辑修复的版本。
永久修复(升级)
应用 MongoDB 的官方补丁。这些版本包含强制性检查,以确保解压缩后的数据大小与消息头中的 uncompressedSize 字段相匹配。
如果由于正常运行时间要求而无法立即升级,可以通过修改服务器配置来阻止攻击向量。
禁用存在漏洞的压缩器(推荐)
该漏洞特定于 zlib 实现。您可以禁用 zlib 并强制服务器使用 snappy 或 zstd,这两种压缩器不受此特定堆越界读取错误的影响。
通过命令行: 使用以下标志重启 mongod 实例(请注意排除了 zlib):
mongod --networkMessageCompressors snappy,zstd
通过配置文件 (mongod.conf):
net:
compression:
compressors: snappy,zstd
此工具仅用于教育和授权的安全测试。未经授权访问计算机系统是违法的。作者不对任何滥用此工具的行为负责。请立即将您的 MongoDB 实例修补到 8.2.3+ 或 8.0.17+ 版本。
| 主要分支 | 推荐安全版本 |
|---|
| MongoDB 8.2 | 升级到 8.2.3 或更高版本 |
| MongoDB 8.0 | 升级到 8.0.17 或更高版本 |
| MongoDB 7.0 | 升级到 7.0.28 或更高版本 |
| MongoDB 6.0 | 升级到 6.0.27 或更高版本 |
| MongoDB 5.0 | 升级到 5.0.32 或更高版本 |
| MongoDB 4.0 | 升级到 4.4.30 或更高版本 |