피드로 돌아가기
Hacker NewsHacker News
Database

The way CTRL-C in Postgres CLI cancels queries is incredibly hack-y

PostgreSQL의 psql CLI가 Ctrl-C로 쿼리 취소 시 평문으로 CancelRequest를 전송하여 DoS 공격에 노출되는 보안 결함

2026년 3월 20일9advanced

Context

PostgreSQL 쿼리 취소 메커니즘은 별도 연결에서 매직 프로토콜 버전(0x04d2162e)으로 CancelRequest를 전송하는데, psql이 TLS 보호 없이 평문으로 이를 전송한다. 네트워크 트래픽을 감시하는 공격자는 4바이트 secret key와 backend process ID(4바이트)를 탈취한 후 동일 연결의 모든 future 쿼리를 반복적으로 취소할 수 있다.

Technical Solution

  • Protocol v3.2 도입(2년 전): secret key를 256바이트까지 확대하여 브루트포스 공격 난이도 상향, 단 min_protocol_version=3.2 명시 필요
  • libpq의 TLS 지원 추가(Postgres 17): CancelRequest를 TLS로 암호화 전송하는 함수 제공, ruby-pg 등 드라이버에서 이미 활용 중
  • psql의 미해결 문제: signal-safe 함수 호출 불가 제약으로 인해 refactoring 필요, 향후 릴리스에서 패치 계획
  • Elephantshark 구현: Postgres 네트워크 트래픽 모니터 개발 시 CancelRequest 분석으로 설계 제약 발견

Impact

아티클에서 정량적 수치 미제시. 보안 위험도 자체 평가만 제시(DoS 공격 위협 수준 6/10).

Key Takeaway

레거시 시스템의 보안 결함은 프로토콜 개선(v3.2)보다 클라이언트 구현(psql) 미지원으로 인해 실제 완화되지 않을 수 있으며, 신호 안전성(signal-safety) 같은 아키텍처 제약이 보안 패치를 지연시킬 수 있다.


TLS 설정이 엄격한(sslmode=verify-full) PostgreSQL 환경에서도 psql의 쿼리 취소 메커니즘이 평문으로 전송되므로, 신뢰할 수 없는 네트워크(공개 WiFi)에서는 min_protocol_version=3.2를 명시해도 DoS 위험이 남아 있다. Postgres 17 이상에서 libpq 기반 드라이버(ruby-pg 등)를 사용하면 TLS 암호화를 자동으로 적용받을 수 있다.

원문 읽기