Ctrl-C in psql gives me the heebie-jeebies

⭐⭐⭐⭐ 4星 · Lobsters · 2026-03-24

https://neon.com/blog/ctrl-c-in-psql-gives-me-the-heebie-jeebies

摘要

深入分析Postgres查询取消机制的安全隐患,揭示了Ctrl+C发送的CancelRequest始终未加密的问题。

⚠️ 安全警告:本文揭示了一个真实的安全漏洞!

核心发现

  • CancelRequest机制:Ctrl+C时psql会建立新连接发送CancelRequest,使用特殊protocol version (v1234.5678)
  • 未加密问题:即使主连接使用sslmode=verify-full,CancelRequest始终以明文发送
  • 历史原因:Postgres 17之前libpq完全不支持加密CancelRequest
  • psql仍未使用:即使Postgres 17添加了加密功能,psql仍未调用这些函数(需要signal-safe重构)

安全风险

  1. DoS攻击:同一WiFi网络的人可以拦截并重放CancelRequest,持续取消你的查询
  2. 竞态条件:CancelRequest按连接而非按查询取消,可能取消错误的查询
  3. 暴力破解:4字节secret key曾可被暴力破解,Postgres 18扩展到256字节

缓解措施

  • 使用Postgres 18 + min_protocol_version=3.2
  • 使用VPN
  • 避免在公共WiFi下使用Ctrl+C in psql
  • 检查其他Postgres客户端是否加密CancelRequest

技术细节

  • BackendKeyData:连接握手时服务器提供process ID和secret key
  • Elephantshark:作者开发的Postgres流量监控工具,发现了CancelRequest无SNI导致的问题
  • 解决方案是在接收普通连接时记录(process ID, secret key)到目标host的映射

标签

Postgres 安全 网络协议 数据库 DoS