Ctrl-C in psql gives me the heebie-jeebies
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重构)
安全风险
- DoS攻击:同一WiFi网络的人可以拦截并重放CancelRequest,持续取消你的查询
- 竞态条件:CancelRequest按连接而非按查询取消,可能取消错误的查询
- 暴力破解: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