文章目录
前言
在上一章中,了解了一些名词,并初步认识了QUIC,如果QUIC了解不多,建议阅读上一章后再来看本文。
本章介绍QUIC巧妙的握手设计。
一、QUIC和TCP的TLS差异
1.TLS不是可选项
在TCP中,TLS是个可选项;
在QUIC中,TLS属于QUIC的一部分,不可分割。
如下图所示:
2.TLS版本固定
在TCP中,可以选择不同TLS版本;
在QUIC中,固定TLS1.3
3.TLS实现不同
由于UDP不可靠传输,TLS协议不支持UDP,DTLS协议才支持UDP。
在QUIC中,实现了QUIC版的TLS1.3,主要区别是TLS的记录层被QUIC接管,参见RFC9001。
如下图所示:
二、QUIC和TCP的握手RTT差异
QUIC(特指iQUIC)实现了TLS1.3协议,首次握手1RTT,PSK过期前再握手0RTT。
如下图所示:
CHLO代表client的“hello”,同理,SHLO代表server的“hello”
三、安全握手
1. 重放攻击
1.1 0-RTT引起的重放攻击
TLS1.3的0-RTT握手,使得客户端发送的第一个包就可以包含应用数据,
但是带来了安全隐患-重放攻击(Relay Attack),
攻击者可以通过重发第一个包完成攻击,参见RFC8446。
1.1 QUIC的应对
1.1.1 幂等
QUIC对帧的处理是幂等的,无论是重放、重排序、包丢失,都不会导致无效的连接状态,生命周期外的连接不会产生影响。
1.1.2 校验
0-RTT握手时,QUIC要求客户端传输TLS会话ticket和地址验证token,使得连接状态高效地检查和恢复。
1.1.3 关闭0-RTT
关闭0-RTT是对抗重放攻击最有效的手段。如果要使用0-RTT,QUIC要求应用程序做进一步的安全校验。
2. 拒绝服务攻击
1.1 TCP的SYN攻击
SYN攻击是著名的拒绝服务攻击。
TCP有3次握手,第一次握手的请求称为半连接请求。
攻击者通过发送大量的半连接请求,耗费服务器资源,造成服务器拒绝服务。
SYN攻击成立的关键原因是,
TCP对半连接请求分配了资源,且一定时间内不释放资源。
1.2 QUIC的包反射攻击
QUIC没有半连接的问题,但在握手时,容易遭受包反射攻击(Packet Reflection Attack)。
由于 QUIC 将 UDP 传输协议与 TLS 加密相结合,因此服务器在对客户端的第一次答复中附带了其 TLS 证书。
这意味着服务器的第一条消息要比客户端的第一条消息大得多。
攻击者向服务器发送“hello”进行握手,使得服务器返回大量数据消耗流量。
如果攻击者伪造成他人的IP,则服务器会把消息返回给他人,他人成为受害者。
1.3 QUIC的应对
1.3.1 限制hello包最小字节数
客户端的hello包必须达到1200字节,使得攻击者消耗更多的流量。
1.3.2 限制服务器流量
在对客户端地址完成验证前,服务器禁止返回大于已接收客户端字节数的3倍的数据量。
服务器对客户端的地址完成验证,是发生在,收到客户端发送的加密的应用数据时。
1.3.3 ACK验证
握手期间,客户端利用客户端hello包中生成的随机连接ID、以及服务端生成的熵,对服务器返回的的ACK消息进行验证,攻击者无法伪造ACK。
总结
本章介绍了QUIC的握手设计。