22년 된 PostgreSQL 타입 혼동 프리미티브, CVE-2026-6460으로 RCE까지 연결
- Mehmet Ince가 복합 타입 안에 값을 넣고 필드 타입을 바꾼 뒤 다시 읽게 하는 방식으로 타입 혼동을 일으켜, int4/int8 레이아웃이 어긋나 앞 8바이트가 포인터로 해석되는 프리미티브를 CVE-2026-6460으로 RCE까지 끌어올림
- 출발점은 PostgreSQL 코어가 아니라 pg_clickhouse 익스플로잇이었고, ClickHouse 배열을 PostgreSQL Datum으로 변환하는 과정의 실수로 코드 실행에 성공한 뒤 벤더에 보고해 6월 23일 수정됨
- SELECT 1337의 파스 트리에서 consttype 23이 int4, constlen 4, constbyval true이고 constvalue 바이트 57 5 0 0이 리틀엔디언으로 0x539, 즉 1337임을 확인하는 데서 내부 구조 학습을 시작함
- Opus 5로 만든 pg_expert 에이전트에게 PostgreSQL 타입 internals를 한 단계씩 질문하며 익혔고, 확장 코드에서 코어로 시야를 옮긴 7월 말에 프리미티브를 발견함
- 글은 'Systemic Risks in the Managed PostgreSQL Industry' 시리즈 3/6편으로, 2026년 4월 관리형 PostgreSQL을 써도 되냐는 질문에서 시작한 조사가 22년 묵은 제로데이에서 끝났다고 밝힘
Hacker News 의견들
제로데이까지 어떻게 도달했는지 경로를 그대로 공개해줘서 고맙네. 맥락이랑 이야기가 다 있어서 읽기 좋았음
이거 실제로 익스플로잇 되는 거야? 그러면 상당히 심각한데, 패치 안 된 상태로 공개된 거면 전 세계 수백만 기업이 영향받는 거 아님?
응, 프라이머리에 로그인만 하면 됨
그건 '수백만 기업'이 PG 포트를 인터넷에 0/0으로 열어놨을 때 이야기 아님? Shodan 보면 postgresql 노출이 516,000개인데 적진 않지만 수백만은 한참 아니고, 훑어보면 기업도 별로 없음
제대로 만든 곳이면 DB는 그걸 쓰는 앱에서만 접근되게 해놓지
난 이건 RCE보다 권한 상승이라고 봄
난 ACE라고 부르겠음. 정해진 실행 환경(rdbms) 밖에서 코드가 도는데 원격은 아니라서, 이미 인증된 DB 접근이 필요하니까 굳이 따지면 Arbitrary Code Execution임
이거 다 SQL 익스플로잇 아니야? 그러면 이미 인증된 원격 접근이 필요한 거 아님? 보안 문제인 건 맞는데 RCE라고 부르면 실제보다 위험해 보임. DB 계정으로 서버 전체 권한을 얻는 거니까 멀티테넌트 DB에서나 문제지
인증이 필요해도 RCE는 RCE임
오픈된 Postgres 인스턴스도 있음. postpass.geofabrik.de는 OpenStreetMap 데이터를 그냥 HTTP API로 Postgres에 질의하게 해줌
SQL 안에서 인증과 권한을 다 처리할 수도 있음. CREATE ROLE로 로그인 역할 만들고 SQL로 자격 증명 검증하고 권한 확인한 뒤 SET LOCAL ROLE 하는 식임. 흔하진 않은데 앱 레이어 일을 줄이고 DB로 몰아넣는 걸 좋아하는 사람도 있음
원격이라는 건 인증이 필요 없다는 뜻이 아니라 로컬이 아니라는 뜻임. 그러니까 이건 원격 코드 실행 맞음
이건 코드 스멜이 아니라 코드 악취 수준임. Datum이 포인터일 수도 아닐 수도 있고, 그 판단에 쓰는 타입 id는 시스템 테이블에서 조회한다고? 안전한 언어로는 표현 자체가 안 되는 설계임
타입 id를 값마다 저장하면 작은 필드는 두 배, 불리언은 네 배로 커짐. 고성능 저수준 최적화 세계에 온 걸 환영함. 저장 데이터는 컬럼을 아니까 필요도 없고
나이 많은 게 놀라운 게 아니라 특정 권한이나 확장이 있어야 닿는 코드 경로에 있었다는 게 핵심임. 퍼징 하네스는 파서랑 와이어 프로토콜만 때리니까 그런 중간층은 건너뜀
이 버그는 슈퍼유저가 아니라 최소 권한 역할에서도 도달 가능함
한 달 사이에 LAMP 스택 전 층에서 RCE가 나오는 것 같음. 여기서 M은 Postgres 아니지만 MySQL/MariaDB도 곧 나오겠지. L, A, M, P 전부에 공통인 글자는 C이고 청구서가 날아오는 중임
길고 두서없는 글에 사람/AI 글이 섞인 느낌인데, 익스플로잇 자체는 참신함. 테이블에 prepared statement 만들고 테이블 바꾸고 그 statement를 실행하면 갱신됐어야 할 게 안 갱신됨