CVE-2022-50472CVE-2022-50472是Linux内核IB(InfiniBand)子系统中mad模块存在的一个原子上下文违规漏洞。该漏洞源于在tracepoint(跟踪点)回调函数中调用了可能导致睡眠的函数ib_query_pkey()。在Linux内核中,tracepoint回调运行于原子上下文(atomic context),不允许调用任何可能引起睡眠的函数,否则将触发内核警告并可能导致系统不稳定甚至崩溃。该漏洞的CVSS评分为5.5,属于中危级别,攻击向量为本地攻击,需要低权限即可触发,无需用户交互。漏洞的影响主要体现在可用性方面——当触发该漏洞时,内核会输出警告信息(splat),并在严重情况下导致系统挂起或崩溃。漏洞存在于InfiniBand MAD(Management Datagram)接收完成处理路径中,具体在ib_mad_recv_done函数调用trace_event_raw_event_ib_mad_recv_done_handler时触发。该问题在多个稳定版本的Linux内核中得到了修复,包括4.9、4.14、4.19、5.10、5.15、5.16等系列。
从技术层面分析,该漏洞的根本原因是Linux内核tracepoint机制与InfiniBand MAD处理路径之间的上下文冲突。
在Linux内核中,tracepoint是一种静态插桩机制,用于在内核关键路径上收集调试和跟踪信息。tracepoint回调函数运行在原子上下文中,不能调用任何可能导致睡眠的函数(如GFP_KERNEL内存分配、互斥锁操作等)。
漏洞触发路径如下:
1. InfiniBand硬件接收到MAD报文后触发完成队列(CQ)事件
2. 内核工作队列处理CQ事件,调用ib_cq_poll_work
3. ib_cq_poll_work调用__ib_process_cq处理CQ
4. __ib_process_cq调用ib_mad_recv_done处理接收到的MAD
5. ib_mad_recv_done调用trace_event_raw_event_ib_mad_recv_done_handler(tracepoint回调)
6. 在tracepoint回调中调用了ib_query_pkey()函数
7. ib_query_pkey()内部可能执行可能导致睡眠的操作
8. 在原子上下文中调用睡眠函数触发内核警告(rb_commit处的WARNING)
内核警告的调用栈显示问题出现在ring_buffer.c:2492的rb_commit函数中,这是tracepoint的环形缓冲区提交操作。警告信息为"CPU: 0 PID: 1888000 at kernel/trace/ring_buffer.c:2492 rb_commit+0xc1/0x220"。
利用方式:本地攻击者只需拥有InfiniBand硬件设备(如HCA网卡)或能够触发InfiniBand MAD报文接收,即可利用此漏洞。通过持续发送MAD报文,强制内核频繁进入有问题的代码路径,可能导致系统性能下降或内核panic。