CVE-2022-50542CVE-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,确保回调不会在对象释放后被调用。