CVE-2026-23253CVE-2026-23253是Linux内核中media/dvb-core组件的一个高危安全漏洞,CVSS评分7.8。该漏洞源于dvb_dvr_open()函数在重新打开DVR设备时错误地调用dvb_ringbuffer_init(),导致共享等待队列被重新初始化。当io_uring poll或epoll在等待队列中有现有条目时,dvb_ringbuffer_init()会调用init_waitqueue_head()将等待队列头重置为空,使这些现有条目成为孤儿条目,其prev/next指针变为陈旧状态。这可能引发内存损坏或竞争条件,攻击者可通过本地低权限访问触发此漏洞,最终实现权限提升。漏洞影响Linux内核的DVB数字视频广播子系统,攻击复杂度低,无需用户交互即可利用。
漏洞位于Linux内核drivers/media/dvb-core/dvb_dvr.c中的dvb_dvr_open()函数。当新读者打开DVR设备时,该函数调用dvb_ringbuffer_init()初始化环形缓冲区。问题在于dvb_ringbuffer_init()会调用init_waitqueue_head()重新初始化等待队列链表头为{self, self}。由于dmxdev->dvr_buffer.queue是共享等待队列(同一DVR设备的所有打开操作共享它),这会导致孤儿等待队列条目保留陈旧的prev/next指针。正确做法是在dvb_dmxdev_init()中初始化一次等待队列和自旋锁,dvb_dvr_open()只需重置缓冲区数据指针、大小和读写位置。修复方案是用直接赋值和dvb_ringbuffer_reset()替换dvb_ringbuffer_init()调用,dvb_ringbuffer_reset()能正确重置pread、pwrite和error,同时保持正确的内存顺序且不触碰等待队列或自旋锁。攻击者可通过同时打开多个DVR设备文件描述符,结合io_uring poll/epoll监控,在特定时序下触发竞争条件导致use-after-free或内存损坏。