data built 2026-10-19T13:16:53Z

Look up another CVE · open CVE-2026-90325 in the interactive tracker

CVE-2026-90325

blk-cgroup: skip dying blkg in blkcg_activate_policy()

7.8 EPSS 0.2% AV:L

Published 2026-09-17 (31 days ago) by the Linux kernel CNA. Subsystem block. Debian urgency: not yet assigned.

What to do, per Debian release

Debian's own status for CVE-2026-90325 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

ReleaseStatus VersionWhat this means
Debian 12bookwormvulnerable6.1.190-1No fix published anywhere yet, neither in Debian nor upstream for the series bookworm tracks. Watch the Debian tracker page for this CVE. Advisories for bookworm have historically landed a median of 23 days after publication.
Debian 13trixiefixedDSA-6528-1 · 2026-09-29 · text6.12.111-1Update the kernel and reboot. DSA-6528-1 shipped the fix on 2026-09-29, in 6.12.111-1. A running kernel keeps the old code until the machine restarts.
Debian 14forkyfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.
Debian unstablesidfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.
Debian 12bookworm · linux-6.12fixedDLA-4817-1 · 2026-10-04 · text6.12.111-1~deb12u1Update the kernel and reboot. DLA-4817-1 shipped the fix on 2026-10-04, in 6.12.111-1~deb12u1. A running kernel keeps the old code until the machine restarts.

The vulnerability

What the bug is

When switching IO schedulers on a block device, blkcg_activate_policy() can race with concurrent blkcg deletion, leading to a use-after-free in rcu_accelerate_cbs. T1: T2: blkg_destroy kill(&blkg->refcnt) // blkg->refcnt=1->0 blkg_release // call_rcu(__blkg_release) ... blkg_free_workfn ->pd_free_fn(pd) elv_iosched_store elevator_switch ... iterate blkg list blkg_get(blkg) // blkg->refcnt=0->1 list_del_init(&blkg->q_node) blkg_put(pinned_blkg) // blkg->refcnt=1->0 blkg_release // call_rcu again rcu_accelerate_cbs // uaf Fix this by checking hlist_unhashed(&blkg->blkcg_node) before getting a reference to the blkg. This is the same check used in blkg_destroy() to detect if a blkg has already been destroyed. If the blkg is already unhashed, skip processing it since it's being destroyed.

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.

block/blk-cgroup.c

What this is
CONTROL GROUP - BLOCK IO CONTROLLER (BLKIO)MAINTAINERS section matched on block/blk-cgroup.c · cgroups@vger.kernel.org

Check it on the machine

grep -w CONFIG_BLK_CGROUP /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_BLK_CGROUP

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-09-17 (31 days 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.16%, higher than 4.7% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
not yet assignedsource
Subsystem
block

Upstream fixes

The versions the CNA records as introducing and fixing this, and the commit for each. source

IntroducedFixed inCommit
6.1.166.1.17b5dae1cd0d83
6.2.36.2.4083b58373463
6.36.6.1571a267295b1ea
6.36.12.1107337d012ca3f
6.36.18.523d8c3da95c75
6.37.2.6d8c872901e64
6.37.35e9220389920

Debian advisories

AdvisoryDateShipped toDebian
DLA-4817-12026-10-04bookworm 6.12.111-1~deb12u1tracker
DSA-6528-12026-09-29trixie 6.12.111-1tracker

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 by writing the local sysfs file /sys/block/<dev>/queue/scheduler (elv_iosched_store → elevator_switch → bfq_create_group_hierarchy → blkcg_activate_policy) or by writing the local cgroup files io.max (tg_set_limit → blk_throtl_init) or io.latency (iolatency_set_limit → blk_iolatency_init). No remote protocol carries the triggering state.
AC:LAttack complexity, low
The attacker drives both sides: one thread writes io.max/io.latency or queue/scheduler so blkcg_activate_policy() takes the GFP_NOWAIT-fail retry and calls blkg_get() on a q->blkg_list entry, while another rmdirs a sibling io cgroup so blkcg_css_offline() → blkg_destroy() kills that blkg's percpu_ref. The mkdir/write/rmdir cycle can be repeated until the window hits.
PR:LPrivileges required, low
cgroup_add_file() creates io.max and io.latency with mode 0644 and current_fsuid(), so an unprivileged user who mkdir's in a delegated cgroup v2 subtree (systemd user@.service, rootless containers) can write those files and rmdir the cgroup. tg_set_limit()/iolatency_set_limit() have no capability check, and blkg_conf_open_bdev() looks up the disk by MAJ:MIN via blkdev_get_no_open() without opening it.
UI:NUser interaction, none
The attacker performs the mkdir, the io.max/io.latency or scheduler write that enters blkcg_activate_policy(), and the concurrent rmdir that runs blkg_destroy(), all from its own processes; no other user must mount a device or open a file.
S:UScope, unchanged
Double call_rcu on blkg->rcu_head corrupts host-kernel RCU callback lists and the slab-backed blkcg_gq. That stays inside the same kernel security authority and is not a VM, IOMMU, or hypervisor escape.
C:HConfidentiality impact, high
blkcg_activate_policy() calls blkg_get() (percpu_ref_get, not tryget) on a blkg whose refcnt blkg_destroy() already killed, resurrecting it; the matching blkg_put() after mutex_unlock races blkg_free_workfn()'s kfree(blkg) and issues a second call_rcu on the same rcu_head, which the report shows as a UAF in rcu_accelerate_cbs. A UAF on the RCU list and blkcg_gq is an arbitrary kernel-memory read.
I:HIntegrity impact, high
The second call_rcu(&blkg->rcu_head) from the resurrected blkg_put() corrupts the RCU callback list (rcu_accelerate_cbs) while blkg_free_workfn() still does list_del_init() and pd_free_fn() on that object. Those writes through a freed, sprayable blkcg_gq are a kernel write primitive suitable for control-flow hijack.
A:HAvailability impact, high
The commit documents a use-after-free in rcu_accelerate_cbs from the second call_rcu on blkg->rcu_head after blkg_get() resurrects a killed ref; that UAF oopses or panics the kernel even if it is not further exploited.