linux 2019漏洞tcp,CVE-2019-11477:Linux 内核中TCP SACK机制远程DoS预警分析

d32e2067a09d95ba522d759c86d0c95a.png

报告编号:B6-2019-061801

报告来源:360-CERT

报告作者:360-CERT

更新日期:2019-06-18

0x00 漏洞描述

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

漏洞细节

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

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

linux/include/linux/skbuff.h

define MAX_SKB_FRAGS (65536/PAGE_SIZE + 1) => 17

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

linux/include/linux/skbuff.h

struct 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 panic

tcp_skb_pcount_add(skb, -pcount);

}

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

0x01 影响版本

影响Linux 内核2.6.29及以上版本

0x02 修复方案

(1)及时更新补丁

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

(2)禁用SACK处理

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

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

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

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

0x03 时间线

2019-06-17 linux内核补丁公布

2019-06-18 RedHat公布漏洞信息

2019-06-18 360CERT发布漏洞预警

0x04 参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值