CVE-2025-39949CVE-2025-39949是Linux内核qed驱动程序中的一个高危本地漏洞,CVSS评分为5.5分,属于中危级别。该漏洞存在于保护覆盖(Protection Override)GRC转储路径中,当固件返回的GRC元素数量超过预期时,内核会尝试将数据写入先前通过kmalloc分配的转储缓冲区边界之外,从而触发内核页面错误并导致系统崩溃。
该漏洞影响使用qed驱动的多个子系统,包括qede以太网驱动和qedf(FCoE)存储驱动。当设备报告致命错误时,devlink健康报告机制会调用qed_dbg_protection_override_dump函数来收集调试数据。如果固件返回的元素数量异常,代码将越过分配的缓冲区边界进行写入,导致内核panic,错误信息为"BUG: unable to handle kernel paging request",崩溃地址恰好位于保护覆盖转储缓冲区结束位置之后。
此漏洞的攻击向量为本地(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性影响低(C:L),无完整性影响(I:N),但对可用性影响高(A:H)。攻击者可利用此漏洞触发系统拒绝服务(DoS),导致Linux系统崩溃。该漏洞已在Linux内核的多个稳定版本中得到修复,通过限制固件返回值到合法元素的最大数量来解决此问题。
该漏洞的根本原因在于qed驱动程序中保护覆盖GRC转储路径缺少对固件返回元素数量的边界检查。具体技术细节如下:
1. **缓冲区分配机制**:当qed驱动初始化调试功能时,会为DBG_FEATURE_PROTECTION_OVERRIDE功能预先通过kmalloc分配一个固定大小的转储缓冲区(dump_buf),其大小由buf_size指定。
2. **漏洞触发路径**:当固件检测到致命错误并触发devlink健康报告机制时,系统会调用qed_dbg_protection_override_dump函数。在此过程中,固件会返回GRC元素的数量和内容。
3. **越界写入**:在qed_grc_dump_addr_range函数中,代码直接使用固件返回的元素数量进行循环写入操作,没有验证该数量是否在分配的缓冲区容量范围内。当固件返回的元素数量超过buf_size所能容纳的最大数量时,写入操作将越过缓冲区边界。
4. **崩溃触发**:可通过两条路径触发漏洞:
- qede以太网驱动路径:通过qede_sp_task → qed_report_fatal_error → devlink_health_report触发
- qedf存储驱动路径:通过qedf_rport_event_handler → qedf_cleanup_fcport → qed_fcoe_destroy_conn → qed_hw_err_notify触发
5. **修复方案**:通过在固件返回值上添加clamp操作,将其限制为固件应返回的最大合法元素数量,防止越界写入。