PASS后发现你其实一直在裸奔:TLS握手的安全边界
大家日常刷网页时,浏览器地址栏那把小绿锁让人觉得安全感拉满。但如果你仔细看过Wireshark抓包,会发现TLS握手过程中有一个阶段,数据是完全明文传输的——那就是Client Hello。客户端向服务器发出连接请求时,会把自己支持的所有密码套件、TLS版本、扩展字段一股脑儿发出去。这些信息本身不加密,任何中间人都能看见你在用哪些算法、支持哪些版本。
问题不止于此。当服务端的Server Hello回来之后,双方才开始进入密钥交换和加密通信。也就是说,从TCP连接建立到Change Cipher Spec之间,所有握手报文都是明文的。如果攻击者在这个窗口期动手脚,比如做降级攻击——把Client Hello里的_supported_versions偷偷改成只支持TLS 1.0,服务端如果配置不够严格就可能被迫用弱版本握手,整个连接的安全性就塌了。
TLS 1.3对这个问题的修复相当激进:直接砍掉了一堆老旧密码套件,握手从2-RTT压到1-RTT,甚至加入了加密扩展(Encrypted Client Hello),让连握手元数据都被保护起来。但现实中大量服务还在跑TLS 1.2,这个"明文窗口"依然存在。下次抓包时不妨数一数,从TCP SYN到第一条加密记录,中间到底经过了多少个明文包—— 。
#Security
大家日常刷网页时,浏览器地址栏那把小绿锁让人觉得安全感拉满。但如果你仔细看过Wireshark抓包,会发现TLS握手过程中有一个阶段,数据是完全明文传输的——那就是Client Hello。客户端向服务器发出连接请求时,会把自己支持的所有密码套件、TLS版本、扩展字段一股脑儿发出去。这些信息本身不加密,任何中间人都能看见你在用哪些算法、支持哪些版本。
问题不止于此。当服务端的Server Hello回来之后,双方才开始进入密钥交换和加密通信。也就是说,从TCP连接建立到Change Cipher Spec之间,所有握手报文都是明文的。如果攻击者在这个窗口期动手脚,比如做降级攻击——把Client Hello里的_supported_versions偷偷改成只支持TLS 1.0,服务端如果配置不够严格就可能被迫用弱版本握手,整个连接的安全性就塌了。
TLS 1.3对这个问题的修复相当激进:直接砍掉了一堆老旧密码套件,握手从2-RTT压到1-RTT,甚至加入了加密扩展(Encrypted Client Hello),让连握手元数据都被保护起来。但现实中大量服务还在跑TLS 1.2,这个"明文窗口"依然存在。下次抓包时不妨数一数,从TCP SYN到第一条加密记录,中间到底经过了多少个明文包—— 。
#Security