피드로 돌아가기
Hacker NewsDatabase
원문 읽기
PostgreSQL의 psql CLI가 Ctrl-C로 쿼리 취소 시 평문으로 CancelRequest를 전송하여 DoS 공격에 노출되는 보안 결함
The way CTRL-C in Postgres CLI cancels queries is incredibly hack-y
AI 요약
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 암호화를 자동으로 적용받을 수 있다.