
Скрипт обнаружения эксплуатации MongoBleed
Офлайн-инструмент анализа MongoDB для CVE-2025-14847 (MongoBleed)
Автономный инструмент командной строки для Linux, который анализирует данные MongoDB для выявления вероятной эксплуатации уязвимости CVE-2025-14847 с использованием нескольких модулей обнаружения.
MongoBleed (CVE-2025-14847) — это уязвимость раскрытия памяти в декомпрессии zlib MongoDB, позволяющая злоумышленникам извлекать конфиденциальные данные — учётные данные, токены сессий, PII — напрямую из памяти сервера без аутентификации.
Этот инструмент помогает специалистам по реагированию на инциденты обнаруживать попытки эксплуатации, используя несколько источников доказательств:
Анализирует JSON-журналы MongoDB для выявления шаблонов эксплуатации:
| ID события | Тип | Описание |
|---|---|---|
| 22943 | Соединение принято | Регистрируется при подключении клиента |
| 51800 | Метаданные клиента | Регистрируется, когда клиент отправляет информацию о драйвере/приложении |
| 22944 | Соединение закрыто | Регистрируется при отключении клиента |
Ключевое наблюдение: Легитимные драйверы MongoDB всегда отправляют метаданные клиента. Эксплойт MongoBleed подключается, извлекает память и отключается, но никогда не отправляет метаданные.
Анализирует снимки db.serverStatus().asserts для обнаружения необычных паттернов в счётчике asserts.user:
asserts.user с другими типами assertов. Если пользовательские assertы непропорционально высоки (отношение ≥250x) или все остальные типы равны нулю, помечается как подозрительный (СРЕДНИЙ уровень уверенности)Примечание: Кумулятивные счётчики могут давать ложные срабатывания. Для наилучших результатов используйте в комбинации с модулем FTDC (Модуль B2).
Анализирует файлы полного диагностического сбора данных (FTDC) MongoDB для выявления локализованных по времени всплесков счётчиков assert. FTDC периодически снимает показания serverStatus, что позволяет точно определить время потенциальной атаки.
jq — обработчик JSONawk (рекомендуется gawk)gzip — поддержка сжатых журналовpymongo — декодирование файлов FTDCssh, scp)# Зависимости shell-скрипта
# Debian/Ubuntu
apt-get install jq gawk gzip
# RHEL/CentOS/Fedora
dnf install jq gawk gzip
# macOS
brew install jq gawk
# Зависимости Python (для декодирования FTDC)
pip install -r requirements.txt
# Клонировать репозиторий
git clone https://github.com/your-org/mongobleed-detector.git
cd mongobleed-detector
# Сделать скрипты исполняемыми
chmod +x mongobleed-detector.sh
chmod +x mongobleed-remote.py
chmod +x ftdc-decode.py
# Установить зависимости Python (опционально, для поддержки FTDC)
pip install -r requirements.txt
Анализ данных, собранных вручную с хостов MongoDB.
Автоматический сбор данных с нескольких хостов через SSH с последующим локальным анализом.
Соберите данные с ваших хостов MongoDB и организуйте их в следующую структуру:
./collected-data/
├── logs/ # JSON-журналы MongoDB
│ ├── mongod.log
│ ├── mongod.log.1
│ └── mongod.log.2.gz
├── assert-counts/ # Снимки serverStatus().asserts
│ ├── asserts-2025-01-01.json
│ └── asserts-2025-01-02.json
└── ftdc-files/ # Содержимое diagnostic.data FTDC
├── metrics.2025-01-02T10-00-00Z-00000
└── metrics.interim
# Копирование с удалённого хоста
scp user@mongohost:/var/log/mongodb/mongod.log* ./collected-data/logs/
Выполните эту команду на хосте MongoDB (требуется доступ к mongosh):
mongosh --quiet --eval 'JSON.stringify({
timestamp: new Date().toISOString(),
hostname: db.hostInfo().system.hostname,
asserts: db.serverStatus().asserts,
uptime: db.serverStatus().uptime
})' > asserts-$(date +%Y%m%d-%H%M%S).json
Скопируйте полученный JSON-файл в ./collected-data/assert-counts/.
Совет: Запускайте эту команду несколько раз (например, ежечасно) для создания базовой линии и обнаружения всплесков.
Файлы FTDC находятся по адресам:
<storage.dbPath>/diagnostic.data/ (обычно /var/lib/mongodb/diagnostic.data/)systemLog.path (например, /var/log/mongodb/mongos.diagnostic.data/)# Копирование файлов FTDC (может потребоваться sudo)
sudo cp /var/lib/mongodb/diagnostic.data/metrics.* ./collected-data/ftdc-files/
# Режим автообнаружения — анализирует все доступные данные
./mongobleed-detector.sh --data-dir ./collected-data/
# С пользовательскими порогами
./mongobleed-detector.sh --data-dir ./collected-data/ \
-t 1440 \ # Просмотр за последние 24 часа
-c 50 \ # Снизить порог соединений
--spike-threshold 50 # Снизить порог всплесков
Для обратной совместимости можно анализировать журналы напрямую:
# Сканирование путей по умолчанию
./mongobleed-detector.sh
# Сканирование конкретных файлов журналов
./mongobleed-detector.sh -p /path/to/logs/*.json
# Криминалистический режим (анализ нескольких хостов)
./mongobleed-detector.sh --forensic-dir /evidence/
Автоматически собирает данные с нескольких хостов и анализирует:
# Создать файл хостов
cat > hosts.txt << EOF
mongo-prod-01.example.com
mongo-prod-02.example.com
mongo-staging.example.com
EOF
# Сбор и анализ
./mongobleed-remote.py --hosts-file hosts.txt --user admin --output-dir ./collected-data/
# Использовать конкретный SSH-ключ
./mongobleed-remote.py --hosts-file hosts.txt --user admin --key ~/.ssh/mongodb_key
# Параллельное выполнение
./mongobleed-remote.py --hosts-file hosts.txt --user admin --parallel 10