linux 内核支持sctp,Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

一、 漏洞背景

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)”的概念,它也是存在于两台主机之间,但可以使用每台主机上的多个接口进行协作。

9293d1c492ac10d9bd778178280edfe9.png

三、 漏洞原理

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

f9652021ce2c1d14deab7f7b247391c0.png

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

72da18b61512f09726446b16a96d99d9.png

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

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

d13a9f50fb13abffa332b2172fc9965d.png

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

a25dec875110efc85f0b2faa80cb2fd9.png

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

787c82eab106225e34c46c2d5f2d1408.png

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

0612a89c2d0c4db185c3958ed349f079.png

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

2f05c2536fa4c358563f0c20d9ad8c2c.png

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

82420476ba1702e439306f0503cc025c.png

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

c9433352729b739f63810c8a007e8a72.png

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

29d1993ab99b6aed9bb9a103e2c1faf4.png

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

16757b23c49b427933debeae199110a3.png

行 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,即是零地址解引用,无法进一步利用。

8003ea8f4630dd952c218be6d83b65a0.png

五、 漏洞修复建议

该漏洞影响 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安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。

本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/938/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中的SCTP(Stream Control Transmission Protocol)是一种可靠传输协议,它提供了面向消息的传输机制,适用于多播和多路径通信。在Linux中,你可以使用setsockopt函数来设置SCTP套接字选项。 在SCTP中,可以使用setsockopt函数来设置以下选项: 1. SCTP_INITMSG:用于设置SCTP套接字的初始化参数。主要包括最大传输单元(MTU)大小、初始传输窗口大小等。 2. SCTP_EVENTS:用于设置SCTP套接字的事件通知选项。可以设置关于数据到达、连接状态改变、错误发生等事件的通知方式。 3. SCTP_SOCKOPT_PEER_ADDR_PARAMS:用于设置SCTP套接字的对端地址参数。可以设置对端地址的最大重传次数、传输超时时间等。 4. SCTP_SOCKOPT_PEER_ADDR_THLDS:用于设置SCTP套接字的对端地址阈值参数。可以设置对端地址的最大重传次数和最小重传时间等。 5. SCTP_DELAYED_ACK_TIME:用于设置SCTP套接字的延迟应答时间。可以设置发送方等待接收方应答的时间间隔。 6. SCTP_MAXSEG:用于设置SCTP套接字的最大分段大小。可以设置发送或接收数据包的最大大小。 7. SCTP_ASSOCINFO:用于设置SCTP关联信息。可以设置关联的最大传输单元大小、心跳间隔等。 8. SCTP_RTOINFO:用于设置SCTP的重传超时信息。可以设置重传超时的初始值、最小值和最大值等。 以上仅是一些常见的SCTP套接字选项,根据具体需求,还可以设置其他选项。你可以参考Linux的相关文档或手册来详细了解每个选项的具体含义和使用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值