CVE-2019-8460:OpenBSD TCP SACK安全漏洞分析
2019-10-25 11:03:27 Author: www.4hou.com(查看原文) 阅读量:123 收藏

背景

OpenBSD是一个基于BSD的免费、开源的操作系统,该系统非常关注安全。与Linux系统类似,这是一个类Unix的系统。Linux是由Linux Torvalds开发的Unix系统的克隆版本,而BSD是源于AT&T Bell实验室开发的原始的Unix操作系统。

SACK

SACK表示有选择的应答(Selective Acknowledgment),这是20年前引入的一个新特征,用来在传输包时增强TCP性能。根据RFC2018- TCP Selective Acknowledgment选项:

当多个包在数据的窗口丢包时,TCP性能可能会很差。无法从累计的ack中获取有限的信息,TCP发送者智能了解每个trip时间内的单个丢失包。有的发送者会选择早点重传包,但这些重传的包可能已经成功接收了。

SACK结合选择重传策略后可以帮助解决这些限制。接收到的TCP会发送SACK包给发送者以通知发送者数据已经收到。然后发送者只重传丢失的数据部分。

SACK选项含有start sequence和end sequenc,分别表示主机没有收到的数据范围(hole) 

OpenBSD中的SACK实现

接收的SACK范围保存在TCP状态中的一个有序列表。在入数据包中,TCP Selective ACK选项是由函数tcp_sack_option()处理的。函数会用现有的TCP状态来验证接收到的SACK范围,遍历SACK范围列表来为新的状态找出正确的位置,在保证列表有序的情况下加入记录。

列表的记录是由一个最大32K记录的池分配的。

如果出现以下情况,记录就会从列表中移除:

· 连接关闭;

· 接收到的ACK序号变大;

· 来自2msl计时器,该计时器只有在TCPS_FIN_WAIT_1状态下设置

· 来自TCP重传计时器,间隔最大为64秒

函数tcp_sack_option(),可以添加新元素到有序SACK范围的中间。

漏洞

根据OpenBSD中的SACK实现,SACK hole有序列表是通过pool的大小(32k记录)和TCP重传计数器(最大间隔64秒)融合在TCP建立的连接状态中的。也就是说攻击者可以修改连接的窗口范围和RTT,使受害者发送大量的没有接收到ACK的数据,以增加重传的timeout。这样攻击者就可以发送大量的SACK。随着SACK hole有序列表变得越来越多,在其他插入额外的元素的代价就会变大,导致CPU使用量变大,最终可能导致DoS。

解决方案

研究人员建议限制SACK hole列表中元素的数量。OpenBSD所有者已经发布补丁,补丁将SACK hole的数量限制为128。

参考

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-8460
https://github.com/openbsd/src/commit/ed8fdce754a5d8d14c09e989d8877707bd43906f
https://ftp.openbsd.org/pub/OpenBSD/patches/6.5/common/006_tcpsack.patch.sig


文章来源: https://www.4hou.com/vulnerable/21118.html
如有侵权请联系:admin#unsafe.sh