
Prova de conceito de exploit para CVE-2026-7482, uma leitura fora dos limites do heap não autenticada no carregador GGUF do Ollama, demonstrando exfiltração de memória por meio de um arquivo de modelo maliciosamente elaborado.
Este repositório contém uma cadeia de exploração Proof of Concept (PoC) 1-day para CVE-2026-7482, uma vulnerabilidade de Leitura Fora dos Limites (OOB) não autenticada no carregador de modelos GGUF do Ollama (versões anteriores a 0.17.1).
Nota: Esta é uma reprodução de pesquisa 1-day. Eu não descobri a CVE original. Este PoC foi desenvolvido com base nos detalhes do aviso público para demonstrar a mecânica da vulnerabilidade para fins educacionais e de pesquisa defensiva.
Ao fornecer um arquivo GGUF maliciosamente elaborado e truncado ao endpoint /api/create, um atacante pode forçar o parser de quantização em fs/ggml/gguf.go e server/quantization.go a ler além do buffer de heap alocado. A memória vazada é então exfiltrada enviando o artefato de modelo resultante para um registro Docker controlado pelo atacante via endpoint /api/push.
Durante esta pesquisa 1-day, reproduzir a falha foi trivial, mas alcançar exfiltração estável sem derrubar o servidor ou esbarrar nos bloqueios de validação da API exigiu forjamento arquitetônico específico:
F16 (general.file_type = 1) para satisfazer as verificações pré-voo estritas da API do Ollama.Q4_K_M. Como o payload é visto como F16, o backend C++ ggml é forçado a processar o payload em vez de realizar uma cópia de memória segura, 1:1.token_embd.weight) deve ser moldado como uma matriz 2D onde a dimensão mais interna é exatamente 256 (ex.: [num_rows, 256]). Isso se alinha estritamente com os requisitos de bloco Q4_K_M, impedindo que o backend pule a camada.pip install requests numpy gguf
Você também precisa de um listener HTTP publicamente acessível (como Ngrok) para capturar os pushes de camadas Docker exfiltradas.
1. Inicie o Registro Rogue Inicie o listener para capturar os blocos de memória vazados.
sudo python3 registry.py
2. Forje o Payload Malicioso
Gere o arquivo GGUF truncado. Você pode ajustar TARGET_LEAK_SIZE_MB dentro do script para controlar quanta memória de heap é raspada por requisição. (Recomendado: 0,5MB a 2,0MB para evitar segfault em páginas não mapeadas).
python3 forge.py
3. Dispare a Exploração
Edite exploit.py para incluir seu IP alvo e a URL do seu registro rogue, então execute:
python3 exploit.py
4. Analise o Artefato
O registro depositará os dumps de heap vazados no diretório exfils/.
Nota sobre Integridade dos Dados (A Armadilha da Quantização): Embora a exploração capture e exfiltre com sucesso até vários megabytes de memória de heap do servidor, os dados são submetidos ao algoritmo de down-quantização Q4_K_M do Ollama durante a leitura OOB. O backend converte os bytes de memória brutos para float16 e aplica um esquema de compressão de bloco de 4 bits com perdas. Consequentemente, a memória vazada é matematicamente distorcida. Ferramentas padrão de extração ASCII produzirão lixo binário, tornando a recuperação de credenciais em texto puro praticamente inviável por meio deste caminho de coerção específico.
Este projeto é apenas para fins educacionais e de pesquisa de vulnerabilidades autorizada. Não use esta ferramenta contra sistemas que você não possui ou para os quais não tem permissão explícita de teste.