安全响应 | CVE-2019-11477 Linux 内核中TCP SACK机制远程DoS预警分析

0x00 | 漏洞描述


2019年6月18日,RedHat官网发布报告:安全研究人员在Linux内核处理TCP 协议模块中发现了三个漏洞,CVE编号为CVE-2019-11477、CVE-2019-11478和CVE-2019-11479,其中CVE-2019-11477漏洞可能被远程攻击者用于拒绝服务攻击。

0x01 | 漏洞细节


SACK(Selective ACK)是TCP选项,它使得接收方能告诉发送方哪些报文段丢失,哪些报文段重传了,哪些报文段已经提前收到等信息。根据这些信息TCP就可以只重传哪些真正丢失的报文段。需要注意的是只有收到失序的分组时才会可能会发送SACK,TCP的ACK还是建立在累积确认的基础上的。

Linux SKB 最多可以容纳17个片段:

linux/include/linux/skbuff.hdefine MAX_SKB_FRAGS (65536/PAGE_SIZE + 1)  => 17

每个片段在x86(PowerPC上为64KB)的数据中最多可容纳32KB,当数据包将被发送时,它被放置在发送队列中,它的详细信息保存在控制缓冲区结构中:

   linux/include/linux/skbuff.hstruct tcp_skb_cb {    __u32       seq;                    /* Starting sequence number */    __u32       end_seq;    /* SEQ + FIN + SYN + datalen */    __u32       tcp_tw_isn;        struct {                u16 tcp_gso_segs;                u16 tcp_gso_size;        };    __u8        tcp_flags;  /2* TCP header flags. (tcp[13])  */}

tcp_gso_segs用于记录数据包个数,类型为u16,最多记录65535个。但是SACK机制允许TCP在重传中合并多个SKB队列,从而填充17个片段到最大容量, 17 * 32 * 1024 / 8 = 69632,造成tcp_gso_segs整数溢出,进而触发BUG_ON()调用,导致内核崩溃。

static bool tcp_shifted_skb (struct sock *sk, …, unsigned int pcount, ...){...tcp_skb_pcount_add(prev, pcount);BUG_ON(tcp_skb_pcount(skb) < pcount);   <= SACK panictcp_skb_pcount_add(skb, -pcount);}

攻击者可以通过发送一系列特定的SACK包,触发内核模块的整数溢出漏洞,理论上可以实施远程拒绝服务攻击。

0x02 | 影响版本


影响Linux 内核2.6.29及以上版本

以下Red Hat产品版本受到影响:

主要受影响的产品

  • 红帽企业Linux 8
  • 红帽企业Linux 7
  • 红帽企业Linux 6
  • 红帽企业Linux 5
  • 红帽原子主机
  • 红帽企业MRG 2
  • 红帽OpenShift容器平台4(RHEL CoreOS)
  • 红帽OpenShift在线
  • Red Hat OpenShift专用(和依赖服务)
  • Azure上的OpenShift(ARO)
  • 红帽OpenStack平台(图片发送内核)
  • 红帽虚拟化(RHV-H)

二次受影响的产品(底层平台必须更新)

  • 红帽虚拟化(RHV)
  • 红帽OpenStack平台
  • 红帽OpenShift容器平台3

0x03 | 漏洞修复

(1)及时更新补丁

https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001/PATCH_net_1_4.patch

Linux内核版本>=4.14需要打第二个补丁

https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001/PATCH_net_1a.patch

(2)禁用SACK处理

  •  
echo 0 > /proc/sys/net/ipv4/tcp_sack

(3)使用过滤器来阻止攻击

https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001/block-low-mss/README.md

此缓解需要禁用TCP探测时有效(即在/etc/sysctl.conf文件中将net.ipv4.tcp_mtu_probingsysctl设置为0)

(4)RedHat用户可以使用以下脚本来检查系统是否存在漏洞

https://access.redhat.com/sites/default/files/cve-2019-11477--2019-06-17-1629.sh

(上述资料节选自360安全响应)

作者的话


网络安全固然重要,请保护好自己的手和服务器的安全,不要做坏事,本次复现由于相关法律所以并没有多大展示细节,望告知...

长按二维码关注我们

发布了16 篇原创文章 · 获赞 9 · 访问量 6576

猜你喜欢

转载自blog.csdn.net/weixin_42608762/article/details/95936711
今日推荐