Linux内核SCTP和谈缝隙分析与复现
颁布功夫 2019-05-30Linux内核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)职能提供这些收益的,,,,,,,,这两种职能均可提高可用性。。。。。。
缝隙道理
缝隙补丁代码如下,,,,,,,,补丁代码将list_for_each_entry换成了list_for_each_entry_safe。。。。。。
宏界说list_for_each_entry_safe中增长了一个n,,,,,,,,该n用来存放pos指向的节点的下一个节点地位。。。。。。使用该宏能够对链表进行删除操作。。。。。。
行2038,,,,,,,,从msg中解析出sinfo;;;;;;;;行2043,,,,,,,,获取到sflags。。。。。。
行2055,,,,,,,,判断sflags是否为SCTP_SENDALL。。。。。。若是存在,,,,,,,,进入list_for_each_entry循环中,,,,,,,,顺次遍历ep->asocs链表。。。。。。这里的asocs就是存放多个association衔接的链表。。。。。。SCTP_SENDALL标志代表向asocs链表中的所有association衔接发送数据包。。。。。。所以asocs链表中至少要存在一个association节点。。。。。。进入sctp_sendmsg_check_sflags函数后,,,,,,,,该函数实现如下:
首先,,,,,,,,查抄asoc是否处于CLOSED状态,,,,,,,,查抄asoc是否处于监听状态,,,,,,,,查抄asoc是否shutdown。。。。。。
接下来,,,,,,,,查抄sflags是否为SCTP_ABORT,,,,,,,,凭据rfc文档可知ABORT的用法以及ABORT指令的数据包体式。。。。。。SCTP_ABORT标志代表遏制一个association衔接,,,,,,,,这个也是导致缝隙的关键。。。。。。
行1863,,,,,,,,sctp_make_abort_user机关ABORT指令的chunk;;;;;;;;行1868,,,,,,,,挪用sctp_primitive_ABORT发送遏制一个association的chunk。。。。。。
通过调试可知挪用sctp_sf_do_9_1_prm_abort函数进行ABORT操作,,,,,,,,该函数将会进行如下操作:
增长一条删除asoc的commands,,,,,,,,而后返回SCTP_DISPOSITION_ABORT。。。。。。正常返回,,,,,,,,持续分析,,,,,,,,返回到sctp_do_sm函数钟祝。。。。。
行1188正常返回后,,,,,,,,行1191挪用sctp_side_effects函数凭据状态机对应的状态进行操作。。。。。。
行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 Kernel 4.19.x和4.20.x,,,,,,,,建议更新到version 4.20.8 或4.19.21。。。。。。补丁链接如下:https://git.kernel.org/linus/ba59fb0273076637f0add4311faa990a5eec27c0


京公网安备11010802024551号