
Эксплойт proof-of-concept для CVE-2026-7482 — неаутентифицированное чтение за пределами кучи в загрузчике GGUF в Ollama, демонстрирующее эксфильтрацию памяти через специально созданный файл модели.
Этот репозиторий содержит 1-day Proof of Concept (PoC) цепочку эксплуатации для CVE-2026-7482 — неаутентифицированную уязвимость чтения за пределами границ (OOB Read) в загрузчике моделей GGUF в Ollama (версии до 0.17.1).
Примечание: Это 1-day исследовательская репродукция. Я не обнаруживал исходную CVE. Данный PoC был разработан на основе публичного advisory для демонстрации механики уязвимости в образовательных и защитных исследовательских целях.
Отправляя специально созданный, усечённый файл GGUF на конечную точку /api/create, злоумышленник может заставить парсер квантования в fs/ggml/gguf.go и server/quantization.go читать за пределы выделенного буфера кучи. Утёкшая память затем эксфильтруется путём отправки полученного артефакта модели в контролируемый злоумышленником Docker registry через конечную точку /api/push.
В ходе этого 1-day исследования воспроизведение краха было тривиальным, но достижение стабильной эксфильтрации без падения сервера или обхода блокировок API-валидации потребовало специфической архитектурной подгонки:
F16 (general.file_type = 1), чтобы пройти строгие предварительные проверки Ollama API.Q4_K_M. Поскольку полезная нагрузка воспринимается как F16, C++ бэкенд ggml вынужден обрабатывать полезную нагрузку, а не выполнять безопасное копирование памяти 1:1.token_embd.weight) должен быть сформирован как 2D-матрица, где внутреннее измерение ровно 256 (например, [num_rows, 256]). Это строго соответствует требованиям блоков Q4_K_M, предотвращая пропуск слоя бэкендом.pip install requests numpy gguf
Вам также понадобится публично доступный HTTP-слушатель (например, Ngrok) для перехвата эксфильтрированных Docker layer push.
1. Запустите Rogue Registry Запустите слушатель для перехвата утёкших блоков памяти.
sudo python3 registry.py
2. Создайте вредоносную полезную нагрузку
Сгенерируйте усечённый файл GGUF. Вы можете настроить TARGET_LEAK_SIZE_MB внутри скрипта, чтобы контролировать, сколько памяти кучи извлекается за запрос. (Рекомендуется: 0.5MB до 2.0MB, чтобы избежать segfault на незамапленных страницах).
python3 forge.py
3. Запустите эксплойт
Отредактируйте exploit.py, указав IP вашей цели и URL вашего rogue registry, затем выполните:
python3 exploit.py
4. Проанализируйте артефакт
Registry сохранит дампы утёкшей кучи в каталог exfils/.
Примечание о целостности данных (Ловушка квантования): Хотя эксплойт успешно захватывает и эксфильтрирует до нескольких мегабайт памяти кучи сервера, данные подвергаются алгоритму понижающего квантования Q4_K_M Ollama во время OOB чтения. Бэкенд приводит сырые байты памяти к float16 и применяет сжатие с потерями по 4-битной блочной схеме. Следовательно, утёкшая память математически искажается. Стандартные инструменты извлечения ASCII дадут бинарный мусор, что делает восстановление открытого текста учётных данных практически невозможным через этот конкретный путь принуждения.
Этот проект предназначен только для образовательных и авторизованных исследований уязвимостей. Не используйте этот инструмент против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.