Linux内核mctp协议mctp_sk_unhash释放重引用漏洞(CVE-2022-3977)分析

admin 2022-12-13 02:00:28 CNNVD预警 来源:ZONE.CI 全球网 0 阅读模式

一、 漏洞背景

近期,开源安全社区oss-security披露一个Linux内核mctp协议(管理组件传输协议)mctp_sk_unhash条件竞争UAF漏洞,漏洞编号为CVE-2022-3977,该漏洞由启明星辰ADlab研究员发现,并第一时间通报给内核社区并修复。当用户同时调用DROPTAG ioctl并进行套接字关闭时会出现此问题,这可能会导致本地系统崩溃或权限提升,但该模块为非默认加载。漏洞细节概述如下:

漏洞编号

危害等级

CVSS v3

受影响版本

CVE-2022-3977

7.0

主线版本:5.18.0 ~ 6.0.0

已发布补丁

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3a732b46736cd8a29092e4b0b1a9ba83e672bf89

 

二、 漏洞原理

管理组件传输协议 (MCTP) 是一种系统内协议,用于在管理控制器及其受管设备(外围设备、主机处理器等)之间进行通信。该协议由 DMTF 规范 DSP0236 定义。内核社区开发人员提交的commit63ed1aab3d40aa61aaa66819bdce9377ac7f40fa补丁中,为mctp套接字添加了几个新的ioctlSIOCMCTPALLOCTAGSIOCMCTPDROPTAG。这些ioctl提供了显示分配和释放标签的功能,覆盖了allocate-on-sendrelease-on-reply和超时行为。这允许用户空间更好地控制可能不适合简单请求及响应模型的消息。Mctp套接字ioctl函数mctp_ioctl()函数实现代码如下所示:

 

SIOCMCTPALLOCTAGSIOCMCTPDROPTAG分别对应了mctp_ioctl_alloctag()函数和mctp_ioctl_droptag()函数。具体看mctp_ioctl_alloctag()函数实现,如下代码所示:

 

首先获取用户层传入的数据放到ctl中,行369,调用matp_alloc_local_tag()函数分配key。该函数为 (saddr, daddr) 分配一个本地拥有的标记值,并将其保留给套接字msk,该实现如下:

 

609,调用mctp_key_alloc()函数进行分配,该函数实现如下:

 

分配一个key后,然后进行初始化,并引用计数置一。返回后。开始遍历现有的键,寻找潜在的冲突标签,如果存在冲突标签,便将tagbits清除。

 

当遍历到冲突标签后,tagbits会被清零,行649,调用mctp_reserve_tag()函数将新的key保留在msk中。

 

该函数实现如下:

 

586到行587,分别将key放到mns->keysmsk->keys链表中,行588,并对key进行引用计数加一,此时key的引用计数为2。正常返回到mctp_ioctl_alloctag()函数中,具体实现如下代码所示:

 

375,调用copy_to_user()函数将ctl值拷贝到用户层,如果拷贝失败,行377,调用__mctp_key_remove()函数移除key,该函数实现如下:

 

298到行299,调用hlist_del()函数将key从自身链表中移除,行302,进行引用计数减一。函该函数返回后,行378,再次调用mctp_key_unref()函数进行引用计数减一,此时引用计数为1,达到释放条件并释放key。而当调用close函数关闭套接字时,会调用到mctp_sk_unhash()函数移除msk中的key。该函数实现如下:

 

539,首先对mctp.keys_lock进行上锁。行570,然后遍历msk->keys链表,拿出key。如果存在条件竞争的话,这里的key其实已经被释放了,便发生了释放重引用。mctp_sk_unhash()函数本身是安全的,分别对mctp.keys_lockkey对象本身加锁,行571,次对key->lock进行上锁,行572,然后才调用__mctp_key_remove()函数进行移除。该漏洞补丁如下代码所示:

 

mctp_ioctl_alloctag()函数中,当copy失败后,需要进行两次加锁,一次是对mctp.keys_lock进行加锁,一次是对key对象本身进行加锁,然后再进行移除操作。

 

三、 漏洞验证

在内核版本Linux-5.19.10下,开启CONFIG_KASAN=yCONFIG_MCTP=y,成功低权限触发漏洞。

 

 

四、 参考链接

1、 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3a732b46736cd8a29092e4b0b1a9ba83e672bf89

2、 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=63ed1aab3d40aa61aaa66819bdce9377ac7f40fa

3、 https://seclists.org/oss-sec/2022/q4/36

 

weinxin
特别声明
本站(ZONE.CI)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
评论:0   参与:  0