psql Ctrl+C, 데이터베이스 보안을 위협하는 취약점?
psql의 Ctrl+C 쿼리 취소 기능은 보안 취약점(Security Vulnerability)을 내포하며, 평문(Plaintext)으로 전송되는 취소 요청(CancelRequest)이 문제로 지적됨.
취소 요청은 별도의 연결을 통해 전송되며, 4바이트 비밀 키(Secret Key)를 사용하여 대상 연결을 식별하나, 암호화되지 않아 DoS 공격에 취약함.
PostgreSQL 17부터 암호화된 취소 요청 기능이 libpq에 추가되었으나, psql은 여전히 해당 기능을 사용하지 않아 보안 패치(Security Patch)가 시급함.
Elephantshark와 같은 Postgres 트래픽 모니터링 도구(Traffic Monitoring Tool)를 통해 취소 요청의 문제점을 파악하고, 보안 설정을 강화할 필요가 있음.
psql의 취소 요청(CancelRequest) 보안 취약점
psql에서 Ctrl+C를 누르면 쿼리 취소를 위해 CancelRequest 메시지가 전송되는데, 이 과정에서 암호화(Encryption)가 적용되지 않아 보안 문제가 발생한다. 특히, 동일 네트워크 상에서 트래픽을 감시하는 공격자는 취소 요청을 가로채 재전송하여 서비스 거부 공격(Denial-of-Service Attack)을 시도할 수 있다. 이러한 취약점은 psql이 libpq의 암호화된 취소 기능을 사용하지 않기 때문에 발생하며, PostgreSQL 17 이후에도 해결되지 않고 있다.
취소 요청(CancelRequest)의 기술적 배경
PostgreSQL에서 쿼리 취소는 별도의 연결(Separate Connection)을 통해 이루어진다. 취소 요청은 대상 연결을 식별하기 위해 프로세스 ID(Process ID)와 비밀 키(Secret Key)를 사용한다. 하지만, psql은 이 정보를 평문(Plaintext)으로 전송하므로, 공격자가 키를 탈취하여 임의의 쿼리를 취소하거나, DoS 공격을 수행할 수 있다. 이러한 설계는 psql의 신호 안전성(Signal Safety) 문제와 관련되어 있으며, 향후 리팩터링을 통해 해결될 예정이다.
Elephantshark를 활용한 문제 해결
Elephantshark는 PostgreSQL 네트워크 트래픽을 모니터링하는 도구로, SNI(Server Name Indication)를 사용하여 대상 서버를 식별한다. 하지만, 암호화되지 않은 CancelRequest는 SNI 정보를 포함하지 않아, Elephantshark가 제대로 작동하지 않는 문제가 있었다. Elephantshark v0.3부터는 (프로세스 ID, 비밀 키)를 사용하여 대상 호스트를 매핑하는 기능을 추가하여, 취소 요청(CancelRequest) 모니터링 문제를 해결했다.
PostgreSQL 보안 강화를 위한 권장 사항
보안 강화를 위해, PostgreSQL 18 이상을 사용하고, `min_protocol_version=3.2`를 설정하여 256바이트 비밀 키(Secret Key)를 사용하는 것이 권장된다. 또한, VPN 사용(VPN Usage)을 통해 네트워크 트래픽을 보호하고, psql 대신 다른 클라이언트를 사용하는 것도 고려할 수 있다. 마지막으로, 사용 중인 다른 PostgreSQL 클라이언트 또는 드라이버가 암호화된 취소 요청을 지원하는지 확인해야 한다. Elephantshark는 이러한 확인을 돕는 데 유용하다.