Look up another CVE · open CVE-2026-74481 in the interactive tracker
CVE-2026-74481
mm/page_reporting: use system_freezable_wq to fix UAF during suspend
Published 2026-08-15 (2 months ago) by the Linux kernel CNA. Subsystem mm. Debian urgency: not yet assigned.
What to do, per Debian release
Debian's own status for CVE-2026-74481 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source
| Release | Status | Version | What this means |
|---|---|---|---|
| Debian 12bookworm | fixedDLA-4777-1 · 2026-09-08 · text | 6.1.187-1 | Update the kernel and reboot. DLA-4777-1 shipped the fix on 2026-09-08, in 6.1.187-1. A running kernel keeps the old code until the machine restarts. |
| Debian 13trixie | fixedDSA-6466-1 · 2026-08-25 · text | 6.12.105-1 | Update the kernel and reboot. DSA-6466-1 shipped the fix on 2026-08-25, in 6.12.105-1. A running kernel keeps the old code until the machine restarts. |
| Debian 14forky | fixed | 7.1.8-1 | Update the kernel and reboot. Fixed in 7.1.8-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 7.1.8-1 | Update the kernel and reboot. Fixed in 7.1.8-1. A running kernel keeps the old code until the machine restarts. |
| Debian 12bookworm · linux-6.12 | fixedDLA-4788-1 · 2026-09-19 · text | 6.12.107-1~deb12u1 | Update the kernel and reboot. DLA-4788-1 shipped the fix on 2026-09-19, in 6.12.107-1~deb12u1. A running kernel keeps the old code until the machine restarts. |
The vulnerability
What the bug is
During PM freeze (e.g. S3 suspend or S4 hibernation), device drivers like virtio_balloon reset their underlying virtio devices and delete their virtqueues via vdev->config->del_vqs(). However, page reporting work (page_reporting_process) was scheduled on the global system_wq. Because system_wq lacks the WQ_FREEZABLE flag, the PM freezer skips it, leaving page_reporting_process active during suspend. If pages are freed into the buddy allocator while suspending (for example, when core MM invokes the balloon shrinker during S4 hibernation image saving), page reporting triggers virtballoon_free_page_report() on deleted virtqueues, resulting in a Use-After-Free / General Protection Fault: [ 196.795226] general protection fault, probably for non-canonical address 0xaa1436fe70dae6df: 0000 [#1] SMP NOPTI [ 196.825967] Workqueue: events page_reporting_process [ 196.831038] RIP: 0010:virtqueue_add_split+0x233/0x4c0 [virtio_ring] [ 196.927073] virtballoon_free_page_report+0x3a/0xe0 [virtio_balloon] [ 196.946943] page_reporting_process+0x370/0x4f0 Fix this by switching page reporting work to system_freezable_wq. This ensures that the PM freezer pauses page_reporting_process before device drivers destroy their reporting virtqueues. Because the reporting worker is frozen, memory reclamation/freeing (e.g. via shrinker execution) can safely return pages to MM during freeze without triggering unfrozen reporting work on deleted virtqueues. This aligns with the driver's existing design. The comment in virtballoon_freeze() states: /* * The workqueue is already frozen by the PM core before this * function is called. */ Testing: I have verified these fixes using Google’s virtualization infrastructure by running continuous suspend/resume iterations (40+ cycles) while churning memory using stress-ng (`stress-ng --vm 4 --vm-bytes 60% --timeout 1`) to constantly create free pages for the buddy allocator. We also set the `page_reporting_order` parameter to 0 to make the page reporting worker highly sensitive, forcing it to pick up any 4K free pages. This confirmed that the UAF crashes are no longer reproducible.
Where it lives
The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.
mm/page_reporting.c
- What this is
- MEMORY MANAGEMENT - PAGE ALLOCATORMAINTAINERS section matched on mm/page_reporting.c · linux-mm@kvack.org · Maintained
Check it on the machine
grep -w CONFIG_PAGE_REPORTING /boot/config-$(uname -r)Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.
Show whether Debian builds this, per release
Debian builds this code. Every release below compiles the affected file into the kernels it ships.
- bookworm, trixie, forky, sid, bookworm · linux-6.12y
- y
- built into the kernel image on every flavour - only a patch removes it
- Build switch
- CONFIG_PAGE_REPORTING
From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages
Signals
- Published
- 2026-08-15 (2 months ago)source
- CVSS
- 7.8 high
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hsource recompute it - Attack vector
- local (AV:L)source
- EPSS
- 0.13%, higher than 2.5% of all CVEssource
- CISA KEV
- not listedthe KEV catalogue
- Debian urgency
- not yet assignedsource
- Subsystem
- mm
Upstream fixes
The versions the CNA records as introducing and fixing this, and the commit for each. source
| Introduced | Fixed in | Commit |
|---|---|---|
| 5.7 | 5.10.265 | a4c600460527 |
| 5.7 | 5.15.216 | b2c094e98f8b |
| 5.7 | 6.1.183 | 992f270fd808 |
| 5.7 | 6.6.151 | f97804832657 |
| 5.7 | 6.12.103 | 450f35f4d5a6 |
| 5.7 | 6.18.44 | b11907c905fa |
| 5.7 | 7.1.8 | faf439b5fa7b |
| 5.7 | 7.2 | 0b45f6927a14 |
Debian advisories
| Advisory | Date | Shipped to | Debian |
|---|---|---|---|
| DLA-4788-1 | 2026-09-19 | bookworm 6.12.107-1~deb12u1 | tracker |
| DLA-4777-1 | 2026-09-08 | bookworm 6.1.187-1 | tracker |
| DSA-6466-1 | 2026-08-25 | trixie 6.12.105-1 | tracker |
Why the CNA scored it this way
Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source
- AV:LAttack vector, local
- The UAF is reached only through local PM suspend/hibernation and guest memory-free paths (__free_one_page -> page_reporting_notify_free -> page_reporting_process -> virtballoon_free_page_report); it is not reachable via network protocols or remote packet handling.
- AC:LAttack complexity, low
- An attacker with local access can reliably drive the race by churning memory (e.g. stress-ng) to flood page-reporting work while triggering or awaiting S3/S4 suspend, as demonstrated in the fix commit's reproduction on virtio-balloon VMs.
- PR:LPrivileges required, low
- No real-root capability is required to exercise the memory-free entry path (normal unprivileged mmap/malloc/free syscalls), and many desktop deployments allow session users to initiate suspend via logind/polkit without full init-namespace root.
- UI:NUser interaction, none
- Exploitation does not require a separate victim action beyond the attacker (or system policy) initiating suspend/hibernation; automated cloud/VM suspend-resume cycles and scripted PM transitions suffice without interactive victim cooperation.
- S:UScope, unchanged
- Impact is confined to guest kernel memory corruption and crash inside the virtio-balloon/page-reporting subsystem; it does not cross a VM/host, IOMMU, or sandbox security boundary to affect resources outside the kernel's own authority.
- C:HConfidentiality impact, high
- This is a kernel heap use-after-free on freed virtqueue metadata accessed through virtqueue_add_split; UAF of kernel objects can be leveraged for arbitrary kernel memory read/info disclosure beyond the observed GPF crash.
- I:HIntegrity impact, high
- UAF on virtqueue/vring kernel structures during virtqueue_add_split provides a memory-corruption primitive that can be developed into controlled kernel writes or code execution, not merely a benign crash.
- A:HAvailability impact, high
- The bug provably causes a kernel general protection fault/oops in page_reporting_process during suspend (Workqueue: events), crashing or destabilizing the system and denying availability on every affected suspend/hibernation cycle.