IPBUF安全漏洞报告
English
CVE-2022-50542 CVSS 7.8 高危

CVE-2022-50542 Linux内核si470x驱动释放后使用漏洞

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2022-50542
漏洞类型
释放后使用(Use-After-Free)
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel(si470x USB收音机驱动)

相关标签

Use-After-Free释放后使用Linux Kernelsi470xUSB驱动内核漏洞本地权限提升UAF媒体驱动CVE-2022-50542

漏洞概述

CVE-2022-50542是Linux内核中si470x媒体驱动的一个高危释放后使用(Use-After-Free)漏洞。该漏洞位于drivers/media/radio/si470x/radio-usb-si470x.c文件中的si470x_int_in_callback()回调函数中,由syzbot模糊测试工具发现。当USB URB(USB Request Block)被提交后,如果si470x_start_usb()函数调用失败,驱动探测函数si470x_usb_driver_probe()会释放包含在urb->context中的struct si470x_device对象,但未正确终止(kill)已提交的URB。这导致已释放的内存仍可能被USB核心访问,当si470x_int_in_callback()回调被触发时,会访问已释放的内存区域,从而触发释放后使用漏洞。攻击者可利用此漏洞在内核上下文中执行任意代码,导致权限提升、系统崩溃或敏感信息泄露。CVSS评分为7.8,属于高危级别,影响本地攻击场景,需要低权限即可利用,无需用户交互,对机密性、完整性和可用性均产生高影响。

技术细节

该漏洞的根本原因在于si470x_usb_driver_probe()函数中的资源释放逻辑缺陷。具体技术细节如下:

1. 在si470x_usb_driver_probe()探测过程中,函数调用si470x_start_usb(),该函数内部依次执行usb_submit_urb()提交USB请求块,然后调用si470x_start()启动设备。

2. 如果si470x_start()返回失败(非零值),si470x_start_usb()将错误码返回给探测函数。但此时URB已经被提交到USB核心,处于活跃状态。

3. si470x_usb_driver_probe()接收到失败返回值后,仅释放了struct si470x_device对象(通过kfree),但没有调用usb_kill_urb()来取消和等待已提交的URB完成。

4. 当USB设备产生中断或数据到达时,USB核心会调用si470x_int_in_callback()回调函数处理URB完成事件。该回调函数通过urb->context访问struct si470x_device对象,但此时该对象已被释放。

5. 攻击者可通过插入特制的USB设备或利用竞态条件触发此回调,在已释放的内存中执行恶意代码,实现本地权限提升。

修复方案是在si470x_start_usb()失败且URB已提交的情况下,调用usb_kill_urb()终止URB,确保回调不会在对象释放后被调用。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要具有本地系统访问权限(低权限账户),并在运行受影响Linux内核版本的系统上操作。目标内核版本需包含存在漏洞的si470x驱动代码。
STEP 2
步骤2:插入恶意USB设备
攻击者插入特制的USB设备(如模拟si470x收音机设备的USB硬件),触发si470x_usb_driver_probe()函数的执行,开始设备探测流程。
STEP 3
步骤3:触发URB提交
在探测过程中,si470x_start_usb()调用usb_submit_urb()成功提交中断输入URB到USB核心,URB的context字段指向新分配的struct si470x_device对象。
STEP 4
步骤4:触发启动失败
通过特制USB设备的行为,使si470x_start()函数返回失败,导致si470x_start_usb()返回错误码给探测函数。
STEP 5
步骤5:触发释放后使用
si470x_usb_driver_probe()接收到失败返回值后,释放struct si470x_device对象但未调用usb_kill_urb()终止已提交的URB。当USB设备产生中断时,si470x_int_in_callback()被调用,访问已释放的内存。
STEP 6
步骤6:权限提升
攻击者利用释放后使用漏洞,通过精心构造的内核对象(如tty_struct、msg_msg等)占用已释放的内存,在内核上下文中执行任意代码,实现从普通用户到root权限的提升。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * CVE-2022-50542 PoC - Trigger Use-After-Free in si470x driver * This PoC demonstrates the race condition between URB callback * and device object free in si470x_usb_driver_probe(). * * Note: Requires a malicious or specially crafted USB device * to trigger the vulnerable code path. */ #include <linux/module.h> #include <linux/usb.h> #include <linux/slab.h> #include <linux/delay.h> // Simulate the vulnerable si470x device structure struct si470x_device { struct usb_device *usbdev; struct urb *int_in_urb; unsigned char *int_in_buffer; // ... other fields }; // Vulnerable callback function static void si470x_int_in_callback(struct urb *urb) { struct si470x_device *radio = urb->context; // UAF: radio may have been freed already if (radio) { // Accessing freed memory here triggers UAF dev_info(&radio->usbdev->dev, "URB callback triggered\n"); } } // Simulate the vulnerable probe function static int si470x_usb_driver_probe(struct usb_interface *intf, const struct usb_device_id *id) { struct si470x_device *radio; int retval; radio = kzalloc(sizeof(*radio), GFP_KERNEL); if (!radio) return -ENOMEM; radio->usbdev = interface_to_usbdev(intf); radio->int_in_urb = usb_alloc_urb(0, GFP_KERNEL); radio->int_in_buffer = kzalloc(8, GFP_KERNEL); // Fill URB usb_fill_int_urb(radio->int_in_urb, radio->usbdev, usb_rcvintpipe(radio->usbdev, 1), radio->int_in_buffer, 8, si470x_int_in_callback, radio, 1); // Submit URB - succeeds retval = usb_submit_urb(radio->int_in_urb, GFP_KERNEL); if (retval) { kfree(radio); return retval; } // Simulate si470x_start() failure retval = -EIO; // Force failure if (retval < 0) { // BUG: URB is submitted but not killed before free kfree(radio); // UAF occurs when callback fires } return retval; } static void __exit poc_exit(void) { printk(KERN_INFO "PoC module unloaded\n"); } module_exit(poc_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("CVE-2022-50542 PoC");

影响范围

Linux Kernel < 5.15.78
Linux Kernel 5.16.x < 5.16.91
Linux Kernel 5.17.x < 5.17.3
Linux Kernel 5.18.x(受影响版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可采取以下临时缓解措施:1)在内核配置中禁用si470x USB收音机驱动模块(CONFIG_RADIO_SI470X=n),避免加载存在漏洞的驱动;2)通过blacklist机制禁止自动加载si470x驱动(echo 'blacklist radio-usb-si470x' >> /etc/modprobe.d/blacklist.conf);3)限制普通用户对物理USB端口的访问权限;4)启用Linux安全模块(如SELinux、AppArmor)限制内核模块加载行为;5)监控异常USB设备插入事件,及时发现潜在攻击行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表