CVE-2023-53660CVE-2023-53660是Linux内核BPF cpumap子系统中的一个内存管理漏洞。当使用xdp_redirect_cpu工具同时启用skb模式和stress模式时,__cpu_map_entry_free函数在清理ptr_ring的过程中未能正确处理skb(socket buffer)类型的内存,而是将其当作XDP帧来处理,导致触发内核警告'Incorrect XDP memory type usage'。该漏洞的根本原因有两个方面:一是cpu_map_kthread_run()内核线程被过早停止,导致ptr_ring中残留有skb数据;二是__cpu_map_ring_cleanup()函数没有处理skb模式,将ptr_ring中的skb当作XDP帧进行释放。该漏洞会导致系统稳定性下降,可能引发内核panic或不可用状态,对系统可用性造成高影响。虽然该漏洞需要本地低权限即可触发,但由于其影响仅限于可用性,且需要特定的内核配置和操作场景,因此整体严重等级评定为中危(CVSS 5.5)。该漏洞已在Linux内核主线及多个稳定版本中通过补丁修复,主要通过确保ptr_ring在清理时为空以及正确处理skb类型内存来解决。
该漏洞位于Linux内核的net/core/xdp.c和kernel/bpf/cpumap.c文件中。具体技术原理如下:
1. BPF cpumap是XDP(eXpress Data Path)框架的一部分,用于将网络数据包从一个CPU核重定向到另一个CPU核进行处理。cpumap使用ptr_ring数据结构来在CPU之间传递数据包帧。
2. 在cpumap中,数据可以以两种模式传递:XDP原生帧模式(xdp_frame)和skb模式。当以skb模式运行时,ptr_ring中存储的是skb指针而非xdp_frame指针。
3. 漏洞触发流程:
- 当cpumap条目被释放时(__cpu_map_entry_free),会调用__cpu_map_ring_cleanup()来清理ptr_ring中残留的数据帧。
- 该函数假设ptr_ring中所有数据都是xdp_frame类型,调用xdp_return_frame()进行释放。
- 如果ptr_ring中实际包含skb指针(skb模式),xdp_return_frame()会将其当作xdp_frame处理,导致类型不匹配。
- xdp_return_frame()内部调用__xdp_return(),该函数检查内存类型标识符,发现类型不正确(-2128176192),触发内核警告。
4. 触发条件:需要运行xdp_redirect_cpu测试工具,同时启用skb-mode和stress-mode选项,在CPU核热插拔或cpumap条目释放时触发。
5. 利用方式:本地攻击者通过加载特定的BPF程序并触发cpumap的创建和销毁,可以导致内核警告、系统不稳定,严重时可能导致内核panic,影响系统可用性。