作者:启明星辰ADLab
2018年7月15日,国外安全研究人员Juha-Matti Tilli发现并报告了Linux内核的TCP安全漏洞(CVE-2018-5390),该漏洞可允许远程攻击者无需任何权限在受影响的Linux设备上导致远程拒绝服务。
内核4.9及以上的Linux版本均受该漏洞影响,受影响的设备包括安装了上述内核的计算机平台及Linux嵌入式设备。
为保障企业及机构业务的安全,消除安全隐患,应对可能发生的攻击事件,启明星辰ADLab实验室提醒大家尽快进行系统升级。
2018年7月23日,Linux社区修复了CVE-2018-5390漏洞;2018年8月6号,针对该漏洞的内核补丁发布,漏洞得以公开。启明星辰ADLab第一时间对该漏洞进行了跟踪分析。
由于网络原因,在进行TCP通信时会出现TCP包乱序的情况。Linux内核在处理TCP乱序包时会进入快速响应模式,将乱序的包文按序列号大小顺序进行重新排序;为此,Linux内核设置了2个队列:乱序队列及按序队列,乱序队列存放乱序的报文,按序队列存放顺序的报文。
若乱序队列中有报文暂存,Linux内核每收到一个报文都将调用tcp_prune_queue
函数,tcp_prune_queue
函数会调用tcp_collapse_ofo_queue
、tcp_prune_ofo_queue
函数进行乱序包队列调整及排序操作,以便将乱序的报文顺序化。
tcp_prune_queue
函数主要流程如下:
tcp_clollapse_ofo_queue
函数主要流程如下:
tcp_prune_ofo_queue
函数主要流程如下:
当乱序包队列的包数量比较大时(默认的队列内存大小为6M,假设每个TCP包大小为576字节,则队列中有10000多个包),Linux内核会对乱序队列进行全队列的红黑树查找排序及内存调整。该调整及排序方法的复杂指数很高且十分耗时,这种立即处理且耗时的运算容易消耗大量CPU资源。
针对该情况,攻击者可以通过发送大量的恶意数据包使得接收方主机频繁进行排序及队列调整操作,造成接收方主机的CPU占比达到极高,从而导致主机拒绝服务。
攻击者攻击时需要满足以下条件:
该漏洞首次出现在2016年12月发布的Linux内核4.9版本中,4.9版本的Linux内核在处理TCP堵塞机制时引进了谷歌推荐的BBR算法,对TCP机制进行了较大的调整,这种调整使得Linux内核更容易受到DDOS攻击。
为了应对这种恶意的TCP包攻击,Linux内核增加了对恶意包的判断:如果乱序队列中恶意包的数量过多,则不进行排序,以减少CPU开销。主要的修改点包括:
在tcp_prune_queue
函数增加了sk->sk_rmem_alloc
的判断:当sk->sk_rmem_alloc
小于sk->sk_rcvbuf
时,直接返回;减少调用tcp_collapse_ofo_queue
、tcp_collapse
、tcp_prune_ofo_queue
函数的次数。
在tcp_prune_ofo_queue
函数中,删除了每次循环操作都要进行内存申请的代码,只有在队列缓冲大小已经处理至少12.5%后,才进行内存申请。
在tcp_collapse_ofo_queue
函数中,增加了检测恶意包的代码,当认为有恶意攻击时,函数就直接返回。
该漏洞影响Linux内核4.9及以上的各版本系统,影响的设备包括安装了上述内核的计算机平台及Linux嵌入式设备,几乎涉及所有厂家:比如亚马逊、苹果、Ubuntu和ZvXEL。
目前已知的受影响系统包括但不限于:
为保障业务的安全,消除安全隐患,应对可能发生的攻击事件,我们对后续工作建议如下:
漏洞链接: - https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git/commit/?id=1a4f14bab1868b443f0dd3c55b689a478f82e72e - http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-5390
启明星辰积极防御实验室(ADLab)
ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员。截止目前,ADLab通过CVE发布Windows、Linux、Unix等操作系统安全或软件漏洞近400个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖操作系统与应用系统安全研究、移动智能终端安全研究、物联网智能设备安全研究、Web安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。