
CVE-2026-2005용 PoC
PostgreSQL pgcrypto 확장의 PGP 세션 키 구문 분석에 존재하는
힙 기반 버퍼 오버플로우를 위한 PoC 익스플로잇으로, 임의 메모리 읽기/쓰기 및
슈퍼유저로의 권한 상승으로 이어집니다.
전체 기술 세부 사항은 Zeroday Cloud 권고를 참조하세요.

취약한 커밋에서 PostgreSQL을 클론하고 컴파일하여 바이너리의 심볼 오프셋이 정확히 일치하도록 합니다. 익스플로잇은 유출된 포인터를 ELF 심볼 오프셋과 대조하여 ASLR 베이스를 해석합니다. 빌드나 버전이 다르면 오프셋이 달라지므로 실패합니다.
git clone https://github.com/postgres/postgres.git
cd postgres
git checkout 4b324845ba5d24682b9b3708a769f00d160afbd7
./configure \
--prefix="$HOME/projects/pg/pgsql" \
--with-libxml \
--with-libxslt \
--enable-debug \
--with-ssl=openssl
make -j$(nproc)
make install-world-bin
pip install -r requirements.txt
python poc.py \
--binary "$HOME/projects/pg/pgsql/bin/postgres" \
--dbname test-db \
--host 127.0.0.1 \
--port 5432 \
--user test-user \
--password secret \
--cmd id
익스플로잇은 7단계로 진행됩니다.
힙 포인터 유출 - 조작된 PGP 메시지가 mdst 버퍼의 malloc 청크 헤더를 손상시킵니다. PostgreSQL이 손상된 청크에서 pfree()를 호출하면,
할당자가 포인터 주소가 포함된 오류를 출력하여 mdst->data의 힙 위치를 누출합니다.
임의 읽기 - 두 번째 오버플로우가 mdst->data를 (leaked_ptr - 0x10000)을 가리키도록 덮어씁니다. 복호화 후, mbuf_steal_data()는
해당 주소의 내용을 복호화된 출력으로 반환하며, 오래된 코드 포인터가 포함될 수 있는 힙 메모리를 덤프합니다.
포인터 스캔 - 16진수 덤프를 스캔하여 코드 주소처럼 보이고(>= 0x500000000000) 힙 영역에 없는 8바이트 리틀엔디언 값을 찾습니다.
이는 PIE(Position Independent Executable) 포인터 후보입니다.
PIE 베이스 투표 - 각 후보 주소는 postgres 바이너리의 ELF 심볼 오프셋과 대조됩니다. 페이지 오프셋이 일치하는 각 (addr - sym_offset) 쌍에 대해 투표가 행해집니다.
10표 이상 받은 후보만 유지되며, 투표 수로 정렬했을 때 가장 작은 베이스(PIE는 가장 낮은 주소에 매핑된 ELF 세그먼트)가 최상위 후보입니다.
PIE 베이스 검증 - 임의 읽기 프리미티브를 사용하여 익스플로잇은 (candidate_base + current_user_offset)에서 CurrentUserId를 읽고
세션의 알려진 OID와 비교합니다. 일치하면 PIE 베이스가 확인됩니다.
임의 쓰기 - 오버플로우가 와 MBuf 헤더를 모두 손상시킵니다. 위조된 /는 암호화된 슈퍼유저 OID(10)를 포함하는 내장 sym-encrypted 패킷을 가리킵니다. 위조된 는 를 가리킵니다(는 의 가 출력 길이를 처음 4바이트에 쓰는 과정을 반영합니다).
pip install -r requirements.txt)pgcrypto가 활성화된 취약한 커밋(4b324845)에서 컴파일된 PostgreSQL이 PoC(Proof of Concept)는 교육 및 방어 연구 목적으로만 제공됩니다. 소유한 시스템 또는 명시적인 테스트 승인을 받은 시스템에서만 사용하세요.
| Argument | Default | Description |
|---|
--binary | (postgres 바이너리) | 심볼 추출을 위한 postgres 바이너리 경로 |
--dbname | postgres | 대상 데이터베이스 이름 |
--host | localhost | PostgreSQL 호스트 |
--port | 5432 | PostgreSQL 포트 |
--user | postgres | 데이터베이스 사용자 |
--password | (비어 있음) | 데이터베이스 비밀번호 |
--cmd | whoami | 권한 상승 후 실행할 OS 명령 |
--gdb | (플래그) | 오버플로우 지점에서 tmux를 통해 GDB 연결 |
msrcmdstmsrc->dataread_posmdst->dataCurrentUserId - 4-4pgp-pgsql.c:533SET_VARSIZE권한 상승 - CurrentUserId가 10(부트스트랩 슈퍼유저)으로 덮어써지면, COPY FROM PROGRAM은 지정된 OS 명령을 postgres 시스템 사용자로 실행합니다.