
CVE-2026-7482에 대한 개념 증명 익스플로잇으로, Ollama의 GGUF 로더에서 발생하는 인증되지 않은 힙(heap) out-of-bounds 읽기 취약점을 악용하여, 조작된 모델 파일을 통해 메모리 유출을 시연합니다.
이 저장소는 CVE-2026-7482에 대한 1-day PoC(개념 증명) 공격 체인을 포함하고 있습니다. 이 취약점은 Ollama의 GGUF 모델 로더(0.17.1 이전 버전)에서 발생하는 인증되지 않은 OOB(범위 밖) 읽기 취약점입니다.
참고: 이는 1-day 연구 재현입니다. 저는 원본 CVE를 발견하지 않았습니다. 이 PoC는 공개된 권고 세부 정보를 기반으로 교육 및 방어 연구 목적으로 취약점의 메커니즘을 시연하기 위해 제작되었습니다.
/api/create 엔드포인트에 악의적으로 제작된 잘린 GGUF 파일을 제공하면, 공격자는 fs/ggml/gguf.go 및 server/quantization.go의 양자화 파서가 할당된 힙 버퍼를 넘어 읽도록 강제할 수 있습니다. 유출된 메모리는 이후 /api/push 엔드포인트를 통해 결과 모델 아티팩트를 공격자가 제어하는 Docker 레지스트리로 푸시하여 외부로 유출됩니다.
이 1-day 연구에서 크래시를 재현하는 것은 간단했지만, 서버를 크래시시키거나 API 검증 차단에 걸리지 않고 안정적인 유출을 달성하려면 특정 아키텍처 위조가 필요했습니다:
F16(general.file_type = 1)로 태그되어야 합니다.Q4_K_M 다운 양자화를 요청합니다. 페이로드가 F16으로 인식되므로 C++ ggml 백엔드는 안전한 1:1 메모리 복사를 수행하는 대신 페이로드를 처리하도록 강제됩니다.token_embd.weight)는 가장 안쪽 차원이 정확히 256인 2D 행렬(예: [num_rows, 256])로 형성되어야 합니다. 이는 Q4_K_M 블록 요구 사항과 엄격히 정렬되어 백엔드가 레이어를 건너뛰는 것을 방지합니다.pip install requests numpy gguf
또한 유출된 Docker 레이어 푸시를 수신하려면 Ngrok과 같은 공개적으로 접근 가능한 HTTP 리스너가 필요합니다.
1. 악성 레지스트리 시작 유출된 메모리 블롭을 수신할 리스너를 시작합니다.
sudo python3 registry.py
2. 악성 페이로드 위조
잘린 GGUF 파일을 생성합니다. 스크립트 내부의 TARGET_LEAK_SIZE_MB를 조정하여 요청당 스크랩할 힙 메모리 양을 제어할 수 있습니다. (권장: 매핑되지 않은 페이지의 세그폴트를 피하기 위해 0.5MB ~ 2.0MB).
python3 forge.py
3. 익스플로잇 실행
exploit.py를 편집하여 대상 IP와 악성 레지스트리 URL을 포함시킨 후 실행합니다:
python3 exploit.py
4. 아티팩트 분석
레지스트리는 유출된 힙 덤프를 exfils/ 디렉토리에 저장합니다.
데이터 무결성에 관한 참고 사항(양자화 함정): 익스플로잇이 최대 수 메가바이트의 서버 힙 메모리를 성공적으로 캡처하고 유출하지만, 데이터는 OOB 읽기 중에 Ollama의 Q4_K_M 다운 양자화 알고리즘을 거치게 됩니다. 백엔드는 원시 메모리 바이트를 float16으로 캐스팅하고 손실이 있는 4비트 블록 압축 방식을 적용합니다. 결과적으로 유출된 메모리는 수학적으로 변형됩니다. 표준 ASCII 추출 도구는 바이너리 쓰레기를 생성하므로, 이 특정 강제 경로를 통한 평문 자격 증명 복구는 실질적으로 불가능합니다.
이 프로젝트는 교육 및 승인된 취약점 연구 목적으로만 제공됩니다. 소유하지 않거나 명시적 테스트 권한이 없는 시스템에 이 도구를 사용하지 마십시오.