
CVE-2026-14669에 대한 PoC 익스플로잇: PostgreSQL의 to_char() 시간대 약어 힙 버퍼 오버플로우로, 정보 유출과 ROP 체인을 통해 RCE를 가능하게 합니다. Docker 랩과 자동화된 PoC를 포함합니다.
PostgreSQL to_char() 함수는 시간대 형식화를 처리할 때 힙 버퍼 오버플로 취약점이 존재합니다. 공격자는 과도하게 긴 POSIX 시간대 약어를 설정하여 25바이트 고정 버퍼의 경계를 벗어난 쓰기를 트리거할 수 있으며, 정보 유출 및 ROP 체인과 결합하여 원격 코드 실행을 달성할 수 있습니다.
to_char(timestamptz) 함수| PostgreSQL 시리즈 | 영향 범위 |
|---|
| 18.x | 18.0 – 18.5 |
| 17.x | 17.0 – 17.10 |
| 16.x | 16.0 – 16.14 |
| 15.x | 15.0 – 15.18 |
| 14.x | 14.0 – 14.23 |
formatting.c의 DCH_TZ / DCH_tz 처리 경로는 25바이트 고정 스택 버퍼를 사용하여 시간대 약어를 저장하지만 입력 길이에 대한 검사가 전혀 없습니다. 시간대 약어가 24바이트를 초과하면 strcpy()가 힙 메모리에 경계를 벗어난 쓰기를 수행합니다.
트리거 경로:
SET TIME ZONE '<超长缩写>+00';
SELECT to_char(now()::timestamptz, 'TZ');
↓
DCH_to_char() → DCH_from_char_action()
↓
strcpy(buf, tmtcTzn(...)) ← 堆溢出
V12 Security의 PoC는 세 단계로 구성됩니다:
힙 오버플로를 통해 인접한 힙 객체를 손상시키고 PIE 베이스 주소와 힙 포인터를 유출하여 ASLR을 무력화합니다.
대형 객체(large object) 또는 bytea 필드를 이용해 힙에 ROP 가젯 체인을 배치합니다.
두 번째 오버플로로 힙의 함수 포인터를 덮어써 ROP 체인으로 점프하여 임의 명령을 실행합니다(postgres 사용자 권한으로).
poc.py - 전체 이용 스크립트(210줄, PostgreSQL 19beta1 대상)requirements.txt - Python 종속성(psycopg, pwntools)docker-compose.yml - 취약점 테스트 환경docker-compose up -d
컨테이너 시작이 완료될 때까지 기다립니다(헬스 체크 통과):
docker logs pg-tzlab
pip install -r requirements.txt
python3 poc.py
기본적으로 127.0.0.1:55432에 연결하며 사용자 이름은 postgres, 비밀번호는 postgres입니다.
이용에 성공하면 컨테이너 로그에서 명령 실행 출력을 확인할 수 있습니다:
docker logs pg-tzlab | grep PWNED
poc.py의 다음 상수를 편집하세요:
HOST, PORT - 대상 주소DEFAULT_COMMAND - 실행할 명령⚠️ 중요: 이 PoC는 특정 빌드의 오프셋 주소(postgres:19beta1 Docker 이미지 sha256:a6bdd01...)를 하드코딩합니다. 다른 버전에서는 gadget을 다시 찾아야 합니다.
SET TIME ZONE 문(> 50자) 모니터링⚠️ 본 PoC는 보안 연구, 취약점 검증 및 방어적 테스트 목적으로만 사용해야 합니다.
본 PoC를 사용하면 현지 법률 및 규정과 대상 시스템의 권한 경계를 준수하는 데 동의하는 것입니다.