CVE-2025-39936CVE-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),使函数能够正确处理错误信息的输出。