CVE-2022-50499CVE-2022-50499是Linux内核媒体子系统中DVB(Digital Video Broadcasting,数字视频广播)核心驱动的一个高危安全漏洞。该漏洞位于dvb_register_device()函数中,当通过dvb_register_media_device() -> dvb_create_media_entity()调用链进行媒体实体初始化时,由于错误处理逻辑存在缺陷,会导致双重释放(Double Free)问题。具体而言,在dvb_create_media_entity()函数中,dvb->entity被分配并初始化,如果初始化过程中dvbdev->pad分配失败,函数会释放dvb->entity并返回错误码。然而,由于释放后未将dvb->entity指针置为NULL,调用方在处理错误时会再次调用dvb_media_device_free(),该函数会检查指针是否非NULL,若非NULL则再次释放,从而造成双重释放。此漏洞还可能导致释放后使用(Use-After-Free)问题,在media_device_unregister_entity()中被触发。攻击者利用此漏洞可实现权限提升、内核崩溃(拒绝服务)或任意代码执行。该漏洞CVSS评分为7.8,属于高危级别,攻击者只需本地低权限访问即可利用,无需用户交互,对系统的机密性、完整性和可用性均产生高影响。
该漏洞的技术原理涉及Linux内核DVB子系统中dvb_register_device()函数的错误处理路径。当系统注册DVB设备时,会依次调用dvb_register_device() -> dvb_register_media_device() -> dvb_create_media_entity()。在dvb_create_media_entity()中执行以下关键操作:
1. 首先分配dvb->entity内存并初始化;
2. 接着尝试分配dvbdev->pad(媒体实体pad);
3. 如果pad分配失败,函数释放dvb->entity并返回错误码;
4. **关键缺陷**:释放dvb->entity后未将其置为NULL。
调用方dvb_register_device()接收到错误码后,会调用dvb_media_device_free()进行清理。该函数检查dvb->entity是否为NULL,若非NULL则调用media_device_unregister_entity()并释放内存。由于dvb->entity未被置NULL,导致同一块内存被释放两次。
利用方式:
- 攻击者需要本地低权限访问系统;
- 通过编写特定的DVB设备操作代码或利用内核模块加载机制,触发dvb_register_device()的失败路径;
- 通过控制内存分配失败条件(如耗尽内存),使dvbdev->pad分配失败;
- 双重释放可被利用来破坏内核堆管理器(SLUB/SLAB分配器);
- 结合堆喷射技术,攻击者可实现权限提升至root或执行任意内核代码。
修复方法:在dvb_create_media_entity()释放dvb->entity后,立即将其置为NULL,防止后续清理路径中的重复释放。