IPBUF安全漏洞报告
English
CVE-2025-39956 CVSS 5.5 中危

CVE-2025-39956 Linux内核igc驱动LED初始化失败导致内核崩溃

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

漏洞信息

漏洞编号
CVE-2025-39956
漏洞类型
拒绝服务(内核崩溃)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核 igc(Intel Gigabit Ethernet)网卡驱动

相关标签

Linux内核igc驱动拒绝服务内核崩溃Intel网卡fault-injectionfailslab本地提权可用性影响CVE-2025-39956

漏洞概述

CVE-2025-39956是Linux内核中igc(Intel Gigabit Ethernet)网卡驱动的一个高可用性影响漏洞。当igc_probe()函数在LED初始化阶段(igc_led_setup())失败时,整个探测过程会被中止并触发内核崩溃(kernel panic),具体表现为free_netdev()中触发了kernel BUG。问题根源在于,当LED设置失败时,igc_probe()直接返回错误码,但此时unregister_netdev()尚未被调用,导致在释放网络设备时出现不合法操作。该漏洞可通过内核fault-injection框架中的failslab特性进行复现。由于LED支持并非网卡的核心功能,属于可选特性,因此该失败不应被视为致命错误。修复方案是将LED初始化失败视为非致命错误,仅输出警告信息后继续执行探测流程,从而避免内核崩溃。此漏洞的CVSS评分为5.5,属于中危级别,需要本地低权限访问即可触发,主要影响系统可用性,不涉及机密性泄露或完整性破坏。

技术细节

该漏洞位于Linux内核的igc网卡驱动中,具体在igc_probe()函数的LED初始化流程中。技术原理如下:

1. **触发条件**:当igc_led_setup()函数执行失败(例如内存分配失败),igc_probe()会直接返回错误码。

2. **崩溃路径**:由于probe失败时网络设备已经通过alloc_netdev()分配但尚未通过register_netdev()注册,错误处理路径中缺少对unregister_netdev()的调用。当probe返回错误后,内核调用free_netdev()释放网络设备,在net/core/dev.c的12047行触发kernel BUG(invalid opcode),因为释放了一个已分配但状态不一致的网络设备。

3. **利用方式**:攻击者可通过内核fault-injection框架的failslab特性,对igc_led_setup()函数的内存分配进行注入失败。具体方法是通过/proc/kallsyms获取igc_led_setup的地址范围,设置failslab的require-start和require-end参数覆盖该地址范围,然后通过/sys/bus/pci/drivers/igc/bind触发设备绑定,强制LED初始化阶段内存分配失败。

4. **影响范围**:该漏洞需要本地低权限访问(PR:L),无需用户交互(UI:N),攻击复杂度低(AC:L),主要造成系统可用性丧失(系统崩溃/重启)。

攻击链分析

STEP 1
步骤1:获取内核符号地址
攻击者通过读取/proc/kallsyms获取igc_led_setup函数的内存地址范围。
STEP 2
步骤2:配置failslab故障注入
通过/sys/kernel/debug/failslab/接口设置故障注入参数,将require-start和require-end设置为igc_led_setup的地址范围,设置probability为100,times为1,确保下一次内存分配必定失败。
STEP 3
步骤3:触发网卡探测
通过echo设备PCI地址到/sys/bus/pci/drivers/igc/bind触发igc驱动的probe流程。
STEP 4
步骤4:LED初始化失败
在probe过程中,igc_led_setup()函数因failslab注入而内存分配失败,返回错误码。
STEP 5
步骤5:内核崩溃
由于错误处理路径不正确,free_netdev()被调用时触发kernel BUG(net/core/dev.c:12047),导致系统panic。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/bin/bash -ex # CVE-2025-39956 Proof of Concept # Trigger kernel panic via failslab injection on igc_led_setup() FAILSLAB_PATH=/sys/kernel/debug/failslab/ DEVICE=0000:00:05.0 # Get the start address of igc_led_setup from kernel symbols START_ADDR=$(grep " igc_led_setup" /proc/kallsyms \ | awk '{printf("0x%s", $1)}') END_ADDR=$(printf "0x%x" $((START_ADDR + 0x100))) # Configure failslab to inject failure in igc_led_setup range echo $START_ADDR > $FAILSLAB_PATH/require-start echo $END_ADDR > $FAILSLAB_PATH/require-end echo 1 > $FAILSLAB_PATH/times echo 100 > $FAILSLAB_PATH/probability echo N > $FAILSLAB_PATH/ignore-gfp-wait # Bind the igc device to trigger probe() -> igc_led_setup() failure echo $DEVICE > /sys/bus/pci/drivers/igc/bind

影响范围

Linux kernel < 6.17-rc5(包含6.17.0-rc4及之前版本)
Linux内核主线受影响至提交528eb4e19ec0之前的版本

防御指南

临时缓解措施
在无法立即升级内核的情况下,可通过以下方式临时缓解:1)禁用故障注入功能(确保/sys/kernel/debug/failslab/不可访问);2)限制非特权用户对/sys/kernel/debug/的访问权限;3)如不需要igc网卡,可临时卸载igc驱动模块(rmmod igc)以避免触发该路径;4)在生产环境中禁用failslab等调试功能。

参考链接

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