Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

栏目: 编程工具 · 发布时间: 5年前

内容简介:作者:启明星辰ADLab公众号:Linux 内核 SCTP 协议实现中存在一个安全漏洞 CVE-2019-8956(CNVD-2019-06182、CNNVD-201902-823 ),可以导致拒绝服务。该漏洞存在于

作者:启明星辰ADLab

公众号: https://mp.weixin.qq.com/s/enoWQh1yo0Qjzck3ZzwidA

一、 漏洞背景

Linux 内核 SCTP 协议实现中存在一个安全漏洞 CVE-2019-8956(CNVD-2019-06182、CNNVD-201902-823 ),可以导致拒绝服务。该漏洞存在于 net/sctp/socket.c 中的 sctp_sendmsg() 函数,该函数在处理 SENDALL 标志操作过程时存在 use-after-free 漏洞。

二、 SCTP协议简介

流控制传输协议(Stream Control Transmission Protocol,SCTP)是一种可靠的传输协议,它在两个端点之间提供稳定、有序的数据传递服务(非常类似于 TCP),并且可以保护数据消息边界(例如 UDP)。与 TCP 和 UDP 不同,SCTP 是通过多宿主(Multi-homing)和多流(Multi-streaming)功能提供这些收益的,这两种功能均可提高可用性。

多宿主(Multi-homing)为应用程序提供了比 TCP 更高的可用性。多宿主主机就是一台具有多个网络接口的主机,因此可以通过多个 IP 地址来访问这台主机。在 TCP 中,连接(connection) 是指两个端点之间的一个通道(在这种情况下,就是两台主机的网络接口之间的一个套接字)。SCTP 引入了“联合(association)”的概念,它也是存在于两台主机之间,但可以使用每台主机上的多个接口进行协作。

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

三、 漏洞原理

漏洞补丁代码如下,补丁代码将 list_for_each_entry 换成了 list_for_each_entry_safe

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

宏定义 list_for_each_entry 功能是遍历 ep->asocs 链表中的 asoc 节点。宏定义 list_for_each_entrylist_for_each_entry_safe 如下所示:

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

宏定义 list_for_each_entry_safe 中添加了一个 n,该 n 用来存放 pos 指向的节点的下一个节点位置。使用该宏可以对链表进行删除操作。

下面对 sctp_sendmsg 函数调用链进行分析。 sctp_sendmsg 是基于 SCTP 协议的 sendmsg 类型函数,用于发送 SCTP 数据包。关键实现如下:

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

行 2038,从 msg 中解析出 sinfo ;行 2043,获取到 sflags

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

行 2055,判断 sflags 是否为 SCTP_SENDALL 。如果存在,进入 list_for_each_entry 循环中,依次遍历 ep->asocs 链表。这里的 asocs 就是存放多个 association 连接的链表。 SCTP_SENDALL 标志代表向 asocs 链表中的所有 association 连接发送数据包。所以 asocs 链表中至少要存在一个 association 节点。进入 sctp_sendmsg_check_sflags 函数后,该函数实现如下:

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

首先,检查 asoc 是否处于 CLOSED 状态,检查 asoc 是否处于监听状态,检查 asoc 是否 shutdown。

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

接下来,检查 sflags 是否为 SCTP_ABORT ,根据 rfc 文档可知 ABORT 的用法以及 ABORT 指令的数据包格式。 SCTP_ABORT 标志代表中止一个 association 连接,这个也是导致漏洞的关键。

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

行 1863, sctp_make_abort_user 构造 ABORT 指令的 chunk;行 1868,调用 sctp_primitive_ABORT 发送中止一个 association 的 chunk。

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

通过调试可知调用 sctp_sf_do_9_1_prm_abort 函数进行 ABORT 操作,该函数将会进行如下操作:

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

添加一条删除 asoc 的 commands,然后返回 SCTP_DISPOSITION_ABORT 。正常返回,继续分析,返回到 sctp_do_sm 函数中。

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

行 1188 正常返回后,行 1191 调用 sctp_side_effects 函数根据状态机对应的状态进行操作。

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

行 1246,将 asoc 置空,ABORT 标志代表中止一个 association 操作结束。从 sctp_sendmsg_check_sflags 函数返回到 sctp_sendmsg 函数中,宏 list_for_each_entry 循环中遍历获取第一个 asoc 节点时,进入 sctp_sendmsg_check_sflags 函数将第一个 asoc 置空,然后再进行遍历后面节点时,就发生了零地址引用导致漏洞发生。

四、漏洞复现

sflags 设置成 SENDALL | ABORT,保证进入 list_for_each_entry 循环和 sctp_sendmsg_check_sflags() 函数即可。在 4.20 内核下验证如下。由于该漏洞是 NULL-PTR deref ,即是零地址解引用,无法进一步利用。

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

五、 漏洞修复建议

该漏洞影响 Linux Kernel 4.19.x 和 4.20.x,建议更新到 version 4.20.8 或4.19.21。

补丁链接如下: https://git.kernel.org/linus/ba59fb0273076637f0add4311faa990a5eec27c0

启明星辰积极防御实验室(ADLab)

ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员,“黑雀攻击”概念首推者。截止目前,ADLab已通过CVE累计发布安全漏洞近1000个,通过 CNVD/CNNVD累计发布安全漏洞近500个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖操作系统与应用系统安全研究、移动智能终端安全研究、物联网智能设备安全研究、Web安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。

Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Data Structures and Algorithms with JavaScript

Data Structures and Algorithms with JavaScript

Michael McMillan / O'Reilly Media / 2014-2-22 / USD 28.51

If you’re using JavaScript on the server-side, you need to implement classic data structures that conventional object-oriented programs (such as C# and Java) provide. This practical book shows you how......一起来看看 《Data Structures and Algorithms with JavaScript》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具