CVE-2025-21977: fbdev: hyperv_fb: Fix hang in kdump kernel when on Hyper-V Gen 2 VMs
In the Linux kernel, the following vulnerability has been resolved:
fbdev: hypervfb: Fix hang in kdump kernel when on Hyper-V Gen 2 VMs
Gen 2 Hyper-V VMs boot via EFI and have a standard EFI framebuffer device. When the kdump kernel runs in such a VM, loading the efifb driver may hang because of accessing the framebuffer at the wrong memory address.
The scenario occurs when the hypervfb driver in the original kernel moves the framebuffer to a different MMIO address because of conflicts with an already-running efifb or simplefb driver. The hypervfb driver then informs Hyper-V of the change, which is allowed by the Hyper-V FB VMBus device protocol. However, when the kexec command loads the kdump kernel into crash memory via the kexecfileload() system call, the system call doesn't know the framebuffer has moved, and it sets up the kdump screeninfo using the original framebuffer address. The transition to the kdump kernel does not go through the Hyper-V host, so Hyper-V does not reset the framebuffer address like it would do on a reboot. When efifb tries to run, it accesses a non-existent framebuffer address, which traps to the Hyper-V host. After many such accesses, the Hyper-V host thinks the guest is being malicious, and throttles the guest to the point that it runs very slowly or appears to have hung.
When the kdump kernel is loaded into crash memory via the kexecload() system call, the problem does not occur. In this case, the kexec command builds the screeninfo table itself in user space from data returned by the FBIOGETFSCREENINFO ioctl against /dev/fb0, which gives it the new framebuffer location.
This problem was originally reported in 2020 [1], resulting in commit 3cb73bc3fa2a ("hypervfb: Update screeninfo after removing old framebuffer"). This commit solved the problem by setting origvideoisVGA to 0, so the kdump kernel was unaware of the EFI framebuffer. The efifb driver did not try to load, and no hang occurred. But in 2024, commit c25a19afb81c ("fbdev/hypervfb: Do not clear global screeninfo") effectively reverted 3cb73bc3fa2a. Commit c25a19afb81c has no reference to 3cb73bc3fa2a, so perhaps it was done without knowing the implications that were reported with 3cb73bc3fa2a. In any case, as of commit c25a19afb81c, the original problem came back again.
Interestingly, the hypervdrm driver does not have this problem because it never moves the framebuffer. The difference is that the hypervdrm driver removes any conflicting framebuffers before allocating an MMIO address, while the hypervfb drivers removes conflicting framebuffers after allocating an MMIO address. With the "after" ordering, hypervfb may encounter a conflict and move the framebuffer to a different MMIO address. But the conflict is essentially bogus because it is removed a few lines of code later.
Rather than fix the problem with the approach from 2020 in commit 3cb73bc3fa2a, instead slightly reorder the steps in hypervfb so conflicting framebuffers are removed before allocating an MMIO address. Then the default framebuffer MMIO address should always be available, and there's never any confusion about which framebuffer address the kdump kernel should use -- it's always the original address provided by the Hyper-V host. This approach is already used by the hypervdrm driver, and is consistent with the usage guidelines at the head of the module with the function apertureremoveconflictingdevices().
This approach also solves a related minor problem when kexecload() is used to load the kdump kernel. With current code, unbinding and rebinding the hypervfb driver could result in the framebuffer moving back to the default framebuffer address, because on the rebind there are no conflicts. If such a move is done after the kdump kernel is loaded with the new framebuffer address, at kdump time it could again have the wrong address.
This problem and fix are described in terms of the kdump kernel, but it can also occur ---truncated---
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Compensating control
Use the kexec_file_load() system call instead of kexec_load() when loading the kdump kernel; the described framebuffer-address conflict does not occur with kexec_file_load().
Event History
Frequently Asked Questions
What is the severity of CVE-2025-21977?
CVE-2025-21977 has been rated as a moderate severity vulnerability due to its potential impact on kdump operations in Hyper-V Gen 2 VMs.
How can I fix CVE-2025-21977?
To fix CVE-2025-21977, update your Linux kernel to a version that includes the patch addressing this specific vulnerability.
What systems are affected by CVE-2025-21977?
CVE-2025-21977 affects the Linux kernel running on Hyper-V Generation 2 virtual machines.
What issue does CVE-2025-21977 address?
CVE-2025-21977 addresses a hang issue that occurs during the execution of the kdump kernel when utilizing the efifb driver.
When was CVE-2025-21977 published?
CVE-2025-21977 was published to disclose the vulnerability and the related fix in the Linux kernel.