
Prueba de concepto del exploit para CVE-2026-7482, una lectura fuera de límites del heap sin autenticación en el cargador GGUF de Ollama, que demuestra la exfiltración de memoria mediante un archivo de modelo manipulado.
Este repositorio contiene una cadena de explotación de Prueba de Concepto (PoC) de 1 día para CVE-2026-7482, una vulnerabilidad de lectura Fuera de Límites (OOB) no autenticada en el cargador de modelos GGUF de Ollama (versiones anteriores a la 0.17.1).
Nota: Esta es una reproducción de investigación de 1 día. No descubrí el CVE original. Este PoC fue diseñado basándose en los detalles del aviso público para demostrar la mecánica de la vulnerabilidad con fines educativos y de investigación defensiva.
Al suministrar un archivo GGUF truncado y manipulado maliciosamente al endpoint /api/create, un atacante puede forzar al analizador de cuantización en fs/ggml/gguf.go y server/quantization.go a leer más allá del búfer del heap asignado. La memoria filtrada se exfiltra posteriormente enviando el artefacto del modelo resultante a un registro Docker controlado por el atacante a través del endpoint /api/push.
Durante esta investigación de 1 día, reproducir el fallo fue trivial, pero lograr una exfiltración estable sin bloquear el servidor ni chocar con los bloqueos de validación de la API requirió un forjado arquitectónico específico:
F16 (general.file_type = 1) para satisfacer las estrictas comprobaciones previas al vuelo de la API de Ollama.Q4_K_M. Debido a que el payload se ve como F16, el backend C++ ggml se ve forzado a procesar el payload en lugar de realizar una copia de memoria segura 1:1.token_embd.weight) debe tener forma de matriz 2D donde la dimensión más interna sea exactamente 256 (por ejemplo, [num_rows, 256]). Esto se alinea estrictamente con los requisitos de bloque de Q4_K_M, evitando que el backend omita la capa.pip install requests numpy gguf
También necesitas un listener HTTP de acceso público (como Ngrok) para capturar los envíos de capas Docker exfiltradas.
1. Iniciar el Registro Falso Inicia el listener para capturar los bloques de memoria filtrados.
sudo python3 registry.py
2. Forjar el Payload Malicioso
Genera el archivo GGUF truncado. Puedes ajustar TARGET_LEAK_SIZE_MB dentro del script para controlar cuánta memoria del heap se extrae por solicitud. (Recomendado: 0.5MB a 2.0MB para evitar fallos de segmentación en páginas no mapeadas).
python3 forge.py
3. Disparar el Exploit
Edita exploit.py para incluir tu IP objetivo y la URL de tu registro falso, luego ejecuta:
python3 exploit.py
4. Analizar el Artefacto
El registro depositará los volcados de memoria del heap filtrados en el directorio exfils/.
Nota sobre la Integridad de los Datos (La Trampa de la Cuantización): Aunque el exploit captura y exfiltra con éxito hasta varios megabytes de memoria del heap del servidor, los datos se someten al algoritmo de cuantización descendente Q4_K_M de Ollama durante la lectura OOB. El backend convierte los bytes de memoria crudos a float16 y aplica un esquema de compresión de bloques de 4 bits con pérdida. En consecuencia, la memoria filtrada queda matemáticamente alterada. Las herramientas estándar de extracción de ASCII producirán basura binaria, lo que hace que la recuperación de credenciales en texto plano sea prácticamente inviable a través de esta vía de coerción específica.
Este proyecto es solo para fines educativos y de investigación de vulnerabilidades autorizada. No utilices esta herramienta contra sistemas que no poseas o para los que no tengas permiso explícito de prueba.