CVE-2022-0435:自4.8版本以来,Linux内核TIPC模块中的远程堆栈溢出

2022-02-14 11:20:01

日期:2022年2月10日星期四14:16:41+0000From:Samuel Page<;塞缪尔。[email protected]>;致";开放源码软件[email protected]" &书信电报;开放源码软件[email protected]>;主题:CVE-2022-0435:自4.8(net/TIPC)以来Linux内核TIPC模块中的远程堆栈溢出免疫安全警告CVE-2022-0435:Linux内核中的远程堆栈溢出内核=时间线=;透明进程间通信(TIPC)协议的Linuxkernel网络模块中存在本地可访问的堆栈溢出。虽然在大多数主要发行版中都可以找到该模块,但必须将其归类才能加以利用。此外,对于远程攻击,目标需要已经设置TIPC承载,即漏洞扩展到使用TIPC的系统。利用该漏洞的行为微不足道,可能会通过kernelpanic导致拒绝服务。如果没有或绕过stack Canaris/KASLR,该漏洞可能导致利用任意有效载荷劫持控制流。自内核版本4.8中引入TIPCmonitoring框架以来,该漏洞一直存在。-介绍:提交35c55c9877f8(";tipc:添加邻居监控框架";)-固定的:https://github.com/torvalds/linux/commit/9aa422ad326634b76309e8ff342c246800621216========================================================================Analysis========================================================================Transparent进程间通信(TIPC)是为集群内通信而设计的一种IPC机制。集群拓扑是围绕节点的概念以及这些节点之间的链接进行管理的。TIPC模块的众多功能之一是其监控框架。该框架于2016年6月引入内核(commit 35c55c9),允许节点监视网络拓扑并与同一域中的其他节点共享视图。通过'struct tipc_Peer':…/*StuttTiPCuPeL:对等节点的状态及其域*@ ADDR:对等体*@ Head映射的TIPC节点标识:显示哪些其他节点当前考虑对等体(39);向上';*@域:来自对等方的最新域记录*@hash:position in hash lookup list*@list:position in linked list,按'循环升序排列;地址';*@已应用:在该监视列表上应用的已报告域成员数*@is_up:从该节点上看,对等方已向上*@is_head:从该节点上看,对等方已分配域头*@is_local:对等方在本地域中,应持续监视*@down_cnt:-在丢失的*/struct tipc_peer上报告此情况的其他对等方数{u32 addr;struct tipc_mon_domain*domain;struct hlist_node hash;struct list_head list;u8 applicated;u8 down_cnt;bool is_up;bool is_head;bool is_local;}`struct tipc_mon_domain`引用域记录,用于定义tipc拓扑的对等视图:#定义MAX_MON_域64…/*struct tipc_mon_domain:在对等方之间传输的域记录*@len:域记录的实际大小*@gen:当前一代发送方';s domain*@ack_gen:最新一代的self';s domain acked by peer*@member\u cnt:此记录中描述的域成员节点数*@up\u map:位图,指示发送方认为哪些成员是up*@members:域成员的标识*/struct tipc\u mon\u domain{u16 len;u16 gen;u16 ack\u gen;u16 member\u cnt;u64 up\u map;u32 members[MAX\u mon\u domain]};。。。这些记录在对等点之间传输,每个节点在“tipc_peer-”中保存从每个对等点接收的最新域记录的副本;域名字段。记录由函数“tipc_mon_rcv”处理,该函数检查从对等方收到的“STATE_MSG”,以查看消息正文是否包含avalid`struct tipc_mon_domain`:…/*tipc_mon_rcv-进程监视器域事件消息**@data:STATE_MSG body*@dlen:STATE_MSG body size(取自tipc头)*/void tipc_mon_rcv(struct net*net,void*data,u16 dlen,u32 addr,struct tipc_mon_STATE*STATE,int bearer\u id){…struct tipc_mon_domain*arrv_dom=data;struct tipc_mon_domain dom_bef;../*是否检查收到的域记录*/[0]如果(dlen<;dom_rec_len(arrv_dom,0))[1]返回;如果(dlen!=dom_rec len(arrv_dom,new_member_cnt))[2]返回;如果(dlen<;new|||| arrv dlen!=new|dlen)[3]返回;../*删除复制,除非我们正在等待探测响应*/if(!more(new_gen,state->;peer_gen)&&![4]返回;../*缓存当前域记录以备将来使用*/dom_bef。成员_cnt=0;dom=对等->;领域if(dom)[5]memcpy(&;dom_bef,dom,dom->;len);[6] /*转换并存储收到的域记录*/if(!dom | |(dom->;len<;new | dlen)){kfree(dom);dom=kmalloc(new | dlen,GFP|ATOMIC);[7]peer->;domain=dom;if(!dom)goto exit;]。。。该函数会执行一些基本的健全性检查[0],以确保a)消息正文实际上包含域记录,b)它是否包含avalid`struct tipc_mon_domain`。其中'data'是消息体,'dlen'是从消息头获取的'data'的长度,函数检查:“'data'的长度足以至少保存一个空记录[1]-“data'的长度与给定的'member_cnt'字段的域记录的预期大小匹配[2]-“data'的长度与提供的'len'字段匹配[3]之后,我们获取发送对等点的'struct peer',以查看我们是否';我已经收到他们的域记录[5]。如果有,我们希望临时缓存旧记录的副本,以便稍后进行比较[6]。然后,满足它';这是一个新的有效记录,我们';将更新'struct peer->;带有新信息的域字段。如果是';这是第一个域名记录,我们';我会为这个[7]做一个新的'kmalloc',或者如果它';它比我们上次看到的大';我会重新分配的-----------------漏洞-----------漏洞在于,在初始的健康检查期间,函数不';t检查'member_cnt'是否低于定义'members'数组最大大小的最大MON_域。通过假装是对等节点并在本地或远程与目标建立链接,我们';我们能够首先提交包含任意负载的恶意域名记录;只要len/member_cnt字段与健全性检查匹配,这将是K分配的罚款。接下来,我们可以发送一个新的域记录,这将导致之前的恶意记录为memcpy';d转换为272字节的本地“struct tipc_mon_domain”&;dom_bef[6]触发堆栈溢出。这允许我们覆盖以下堆栈的内容&;dom_bef与我们的任意成员缓冲区一起从最先提交的恶意域名记录中删除;其大小受mediaMTU(以太网、UDP、Inifiband)的限制==========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================,我们将发布一个后续博客来赞扬这一建议。关于漏洞利用,在给出修补和调解的时间后,我们还将发布一篇讨论漏洞利用的帖子。更多信息将发布在https://twitter.com/immunityinc/========================================================================Remediation========================================================================This自2016年6月首次引入监控框架以来,该漏洞一直存在,影响到4.8版以后的版本。下面的补丁是在commit 9AA422AD326中引入的,因此更新系统以包含此补丁是缓解CVE-2022-0435的最佳方法,包括Eric Dumazet发现的额外u16溢出。必须加载TIPC模块才能使系统易受攻击,此外,为了实现远程目标,系统需要启用TipBear。如果你没有';如果您不需要使用TIPC或不确定是否需要,您可以采取以下步骤:“$lsmod | grep TIPC`将让您知道模块当前是否已加载,`modprobe-r TIPC`可能允许您在加载时卸载模块,但您可能需要重新启动系统-`echo";安装tipc/bin/true">>/etc/modprobe。d/禁用tipc。conf`将防止模块被加载,如果您需要使用TIPC和can',那么如果您没有理由使用它,这是一个好主意;不要立即修补您的系统,请查看是否有任何配置阻止或限制攻击者模拟集群中节点的能力。选项包括TIPCprotocol级别的加密、IPSec/MACSec、网络分离等;还值得注意的是,当前的'CONFIG_FORTIFY_SRC=y'是利用CVE-2022-0435进行控制流劫持的一种硬缓解措施,因为它会对违规memcpy的大小进行边界检查,并导致akernel恐慌========================================================================感谢====================================================================================================================================================================================================================================I';I’我要感谢TIPC模块的维护人员,以及[email protected][email protected]在整个披露过程中为他们的帮助和工作。我还想提及SentinelLabs之前对TIPC进行的漏洞研究,以及他们在CVE-2021-43267上的工作,以及其他安全研究人员发表的关于TIPC利用的发现。-https://www.sentinelone.com/labs/tipc-remote-linux-kernel-heap-overflow-allows-arbitrary-code-execution/- https://haxx.in/posts/pwning-tipc/========================================================================Disclosure时间线===================================================================================================================================-2022年1月27日:脆弱性与风险;修复建议报告-2022年2月5日:补丁定稿-2022年2月10日:协调发布日期(格林威治标准时间14:00)