LiveActive security incident?Get immediate response
CVE Record

CVE-2026-46223: cgroup: Defer css percpu_ref kill on rmdir until cgroup is depopulated

In the Linux kernel, the following vulnerability has been resolved: cgroup: Defer css percpu_ref kill on rmdir until cgroup is depopulated A chain of commits going back to v7.0 reworked rmdir to satisfy the controller invariant that a subsystem's ->css_offline() must not run while tasks are still doing kernel-side work in the cgroup. [1] d245698d727a ("cgroup: Defer task cgroup unlink until after the task is done switching out") [2] a72f73c4dd9b ("cgroup: Don't expose dead tasks in cgroup") [3] 1b164b876c36 ("cgroup: Wait for dying tasks to leave on rmdir") [4] 4c56a8ac6869 ("cgroup: Fix cgroup_drain_dying() testing the wrong condition") [5] 13e786b64bd3 ("cgroup: Increment nr_dying_subsys_* from rmdir context") [1] moved task cset unlink from do_exit() to finish_task_switch() so a task's cset link drops only after the task has fully stopped scheduling. That made tasks past exit_signals() linger on cset->tasks until their final context switch, which led to a series of problems as what userspace expected to see after rmdir diverged from what the kernel needs to wait for. [2]-[5] tried to bridge that divergence: [2] filtered the exiting tasks from cgroup.procs; [3] had rmdir(2) sleep in TASK_UNINTERRUPTIBLE for them; [4] fixed the wait's condition; [5] made nr_dying_subsys_* visible synchronously. The cgroup_drain_dying() wait in [3] turned out to be a dead end. When the rmdir caller is also the reaper of a zombie that pins a pidns teardown (e.g. host PID 1 systemd reaping orphan pids that were re-parented to it during the same teardown), rmdir blocks in TASK_UNINTERRUPTIBLE waiting for those pids to free, the pids can't free because PID 1 is the reaper and it's stuck in rmdir, and the system A-A deadlocks. No internal lock ordering breaks this; the wait itself is the bug. The css killing side that drove the original reorder, however, can be made cleanly asynchronous: ->css_offline() is already async, run from css_killed_work_fn() driven by percpu_ref_kill_and_confirm(). The fix is to make that chain start only after all tasks have left the cgroup. rmdir's user-visible side then returns as soon as cgroup.procs and friends are empty, while ->css_offline() still runs only after the cgroup is fully drained. Verified by the original reproducer (pidns teardown + zombie reaper, runs under vng) which hangs vanilla and succeeds here, and by per-commit deterministic repros for [2], [3], [4], [5] with a boot parameter that widens the post-exit_signals() window so each state is reliably reachable. Some stress tests on top of that. cgroup_apply_control_disable() has the same shape of pre-existing race: when a controller is disabled via subtree_control, kill_css() ran synchronously while tasks past exit_signals() could still be linked to the cgroup's csets, and ->css_offline() could fire before they drained. This patch preserves the existing synchronous behavior at that call site (kill_css_sync() + kill_css_finish() back-to-back) and a follow-up patch will defer kill_css_finish() there using a per-css trigger. This seems like the right approach and I don't see problems with it. The changes are somewhat invasive but not excessively so, so backporting to -stable should be okay. If something does turn out to be wrong, the fallback is to revert the entire chain ([1]-[5]) and rework in the development branch instead. v2: Pin cgrp across the deferred destroy work with explicit cgroup_get()/cgroup_put() around queue_work() and the work_fn. v1 wasn't actually broken (ordered cgroup_offline_wq + queue_work order in cgroup_task_dead() saved it) but the explicit ref removes the dependency on those non-obvious invariants. Also note the pre-existing cgroup_apply_control_disable() race in the description; a follow-up will defer kill_css_finish() there.

UnknownCVSS not scoredNot KEV-listedUpdated
Glexia's TakeAutomated analysismoderate

Security readout for executives and security teams

Plain-English summary

CVE-2026-46223 is a Linux kernel availability bug in cgroup removal handling. Under specific task-exit and PID namespace teardown conditions, a process removing a cgroup can wait forever, potentially deadlocking important system management processes such as PID 1.

Executive priority

Treat as a scheduled but important kernel maintenance item unless affected hosts show task hangs. Raise priority for shared container infrastructure where a local availability fault could disrupt multiple services.

Technical view

The issue is in cgroup rmdir behavior. A synchronous wait for dying tasks can deadlock when the rmdir caller must also reap zombies needed for PID namespace teardown. The fix defers css percpu_ref kill and css_offline processing until the cgroup is fully depopulated.

Likely exposure

Exposure is likely limited to Linux systems running affected kernel versions or kernels containing the referenced cgroup commit chain. Container, cgroup, and PID namespace heavy hosts deserve priority review. The provided source data does not identify distro package versions.

Exploitation context

The sources describe a deterministic reproducer and stress testing, but do not state public exploitation or KEV listing. This is primarily an availability risk requiring specific local kernel state involving cgroup removal, exiting tasks, and PID namespace teardown.

Researcher notes

Evidence supports a kernel cgroup deadlock fixed by asynchronous css kill sequencing. Severity, CVSS, CWE, distro impact, and active exploitation are not provided. A pre-existing related race in cgroup_apply_control_disable is noted for follow-up work.

Mitigation direction

  • Update to a Linux kernel build containing the referenced stable fixes.
  • Check Linux vendor or distribution advisories for backported package versions.
  • Prioritize container hosts and systems with heavy cgroup or PID namespace churn.
  • Avoid relying on upstream version numbers alone; verify backported commits.
  • Monitor for follow-up fixes involving cgroup_apply_control_disable behavior.

Validation and detection

  • Map running kernels to vendor advisories or the referenced upstream stable commits.
  • Review affected hosts for cgroup v2, container runtime, or namespace-heavy workloads.
  • Check kernel logs for task hangs involving cgroup removal or PID namespace teardown.
  • Validate fixes in staging with vendor-supported regression testing.
  • Confirm no production workflows depend on direct wrangler-style kernel changes; use vendor packages.
Prepared
Confidence
medium
Sources
4

Generated from the cited source records. This long-tail analysis has not been individually reviewed by a named human.

Potential ATT&CK relevance

Conservative CVE-to-ATT&CK context

These mappings and lookup hints may be relevant to the vulnerability behavior, CWE, affected product, or exposure path. Glexia-inferred context is not an official MITRE, ATT&CK, CWE, or CVE Program mapping.

ATT&CK lookup starting points

Use these exact CWE pages and searches to review the Glexia ATT&CK library from this CVE's weakness and description context.

cve · low confidence lookup

CVE-2026-46223 mapping review

Open the CVE-to-ATT&CK bridge for reviewed, inferred, or future official mappings tied to this CVE.

Open ATT&CK lookup
Vulnerability profileCVE Program record
Severity
Unknown
CVSS
Not scored
Known Exploited
No
Published
Official CVE source material

CNA and ADP enrichment extracted from CVE v5

These fields come from the CVE record and ADP containers, not from Glexia's Take. They preserve time-varying source decisions such as CISA SSVC, KEV status, CVSS metrics, and provider references.

0CVSS vectors
3Timeline events
0ADP providers
3Source links

Vulnerability timeline

Timeline events are normalized from CVE metadata, CNA source timelines, ADP timelines, and KEV metadata when present.

  1. CVE reservedCVE Program

    The CVE ID was reserved by the assigning CNA.

  2. CVE publishedCVE Program

    The CVE record was published.

  3. CVE updatedCVE Program

    The CVE record metadata indicates this as the latest update time.

Affected products

Products and packages named in the record

VendorProductVersion / packageStatus
LinuxLinux1b164b876c36c3eb5561dd9b37702b04401b0166, 1b164b876c36c3eb5561dd9b37702b04401b0166, 78c72bce4a87819126211c0d24e18350010604fb, 6.19.12unaffected
LinuxLinux7.0, 0, 7.0.9, 7.1affected
Weakness

CWE details

No CWE listed

CWE links open Glexia weakness intelligence pages with official CWE context, developer remediation guidance, and related CVE mappings.