
Reproduce la lectura fuera de límites del heap de CVE-2026-7482 en la carga y cuantización GGUF de Ollama, con análisis diferencial de artefactos cuantizados para demostrar la influencia del OOB.
Este repositorio contiene mi script de reproducción local para CVE-2026-7482, una lectura fuera de límites en el montón (heap out-of-bounds read) en las rutas vulnerables de carga y cuantización de GGUF de Ollama.
El resultado importante de este trabajo es limitado: pude hacer que la condición de Heap OOB ocurriera de forma fiable y producir artefactos GGUF cuantizados influenciados por OOB. No pude demostrar un impacto claro de caja negra, como la recuperación fiable de secretos en texto plano o la extracción directa de cadenas canary del artefacto resultante.
exp.py crea dos archivos GGUF:
Sube ambos archivos a una instancia vulnerable de Ollama a través de la API local de Ollama, activa la cuantización con /api/create, copia los blobs GGUF generados desde el contenedor Docker local y compara la salida maliciosa con la salida de control de ceros.
La comparación diferencial es útil porque muestra que la ruta de cuantización vulnerable utilizó bytes que no estaban presentes en el archivo GGUF malicioso original. En mis pruebas, este comportamiento fue estable en Ollama 0.17.0 y rechazado por la ruta corregida .
0.17.1requests0.17.0 expuesto en un puerto API localollama-old-testEjemplo de objetivo de laboratorio:
docker run -d --name ollama-old-test -p 11435:11434 ollama/ollama:0.17.0
Instala la única dependencia de Python:
python3 -m pip install requests
Ejecuta la prueba predeterminada contra http://localhost:11435 y el contenedor ollama-old-test:
python3 exp.py
Argumentos explícitos:
python3 exp.py http://localhost:11435 ollama-old-test Q4_K_M F16
python3 exp.py http://localhost:11435 ollama-old-test Q8_0 F16
python3 exp.py http://localhost:11435 ollama-old-test Q8_0 F32
El script escribe artefactos locales como:
malicious_model.ggufcontrol_model.ggufquantized_model.ggufcontrol_quantized_model.ggufq8_dequantized_f32.binq8_pseudo_f16.binq8_pseudo_f16.txtEn mis pruebas locales, la versión vulnerable de Ollama creó salidas cuantizadas donde la carga útil del tensor malicioso difería de un tensor de control de ceros a pesar de que el archivo GGUF malicioso no contenía esos bytes.
Eso es suficiente para mostrar un artefacto influenciado por OOB. No es suficiente para afirmar una divulgación práctica de datos en caja negra.
También probé datos estilo canary en prompts de modelos concurrentes y busqué en los artefactos generados, los bytes float32 descuantizados Q8_0 y la salida de reconstrucción pseudo-F16. No recuperé canaries exactos ni fragmentos de texto plano significativos.
La razón probable es que los bytes no se copian como memoria bruta del montón. Pasan a través del pipeline de conversión y cuantización del modelo:
bytes del montón -> interpretados como valores de tensor F16/F32 -> convertidos/cuantizados -> salida de tensor GGUF
Esta ruta es con pérdidas, especialmente con formatos cuantizados como Q4_K_M. Q8_0 conserva más información numérica que Q4_K_M, pero aun así no produjo una recuperación fiable de texto plano en mis pruebas de estilo caja negra.
Esto es una reproducción de laboratorio local y una ayuda para el análisis de artefactos.
No proporciona un primitivo fiable de exfiltración remota de secretos. También requiere acceso local a Docker para copiar el blob generado por Ollama desde el contenedor de prueba, por lo que el paso de análisis no es un flujo de trabajo puramente remoto de caja negra.
La conclusión práctica de mis pruebas es:
También existe un repositorio PoC separado de 0x0OZ:
Esa implementación demuestra un flujo de trabajo más sólido de estilo caja blanca al enviar el artefacto del modelo generado a un registro controlado. Con la corrección del flujo de subida al registro de mi PR, se completa limpiamente en mi laboratorio local:
Incluso con esa mejor ruta de recopilación de artefactos de extremo a extremo, la misma advertencia sobre la calidad de los datos sigue siendo importante: la salida son datos cuantizados/transformados por el modelo, no un volcado directo de memoria bruta del montón.
Este repositorio es solo para investigación de vulnerabilidades autorizada y reproducción defensiva. Prueba únicamente contra sistemas que poseas o para los que tengas permiso explícito de evaluación.