Look up another CVE · open CVE-2026-63799 in the interactive tracker
CVE-2026-63799
sched/mmcid: Fix OOB clear_bit when CID is MM_CID_UNSET in fixup path
Published 2026-07-19 (3 months ago) by the Linux kernel CNA. Subsystem kernel/sched. Debian urgency: unimportant.
What to do, per Debian release
Debian's own status for CVE-2026-63799 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 | not affected | 6.1.190-1 | Nothing to do. bookworm never shipped the vulnerable code. |
| Debian 13trixie | not affected | 6.12.113-1 | Nothing to do. trixie never shipped the vulnerable code. |
| Debian 14forky | fixed | 7.1.3-1 | Update the kernel and reboot. Fixed in 7.1.3-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 7.1.3-1 | Update the kernel and reboot. Fixed in 7.1.3-1. A running kernel keeps the old code until the machine restarts. |
The vulnerability
What the bug is
In mm_cid_fixup_cpus_to_tasks(), when rq->curr has the target mm and mm_cid.active is set, the CID is checked with cid_in_transit() before setting the transition bit. In per-CPU mode a newly forked or exec'd task can be running with mm_cid.cid == MM_CID_UNSET because CIDs are assigned lazily on schedule-in. With cid_in_transit() the guard passes for MM_CID_UNSET (no transit bit), converts it to MM_CID_UNSET | MM_CID_TRANSIT and stores it back; later mm_cid_schedout() feeds this to clear_bit() with MM_CID_UNSET as the bit number, triggering an out-of-bounds write. Symptoms: this is genuine memory corruption, but a bounded out-of-bounds write, not an arbitrary one. MM_CID_UNSET is the fixed sentinel BIT(31), so once the bad value reaches mm_cid_schedout() the cid_from_transit_cid() strip leaves MM_CID_UNSET, which fails the "cid < max_cids" convergence test and falls into mm_drop_cid() -> clear_bit(MM_CID_UNSET, mm_cidmask(mm)). The cid bitmap is embedded in the mm_struct slab object (after cpu_bitmap and mm_cpus_allowed) and is only num_possible_cpus() bits wide, so clearing bit 31 is a deterministic OOB bit-clear at a fixed offset of 2^31 / 8 == 256 MiB past the bitmap base. The address is not attacker-influenced (fixed sentinel -> fixed offset) and the op only clears a single bit; what sits 256 MiB further along the direct map is whatever kernel object happens to live there, so this corrupts one bit of unpredictable kernel memory -- it is not an arbitrary-address or arbitrary-value write. It triggers only in per-CPU CID mode, when a CPU is running an active task of the target mm whose cid is still MM_CID_UNSET -- the fork()/execve() window before that task's next schedule-in assigns it a real CID -- and a per-CPU -> per-task fixup walks over it (the mode fallback driven by a thread exit, sched_mm_cid_exit(), or by the deferred max_cids recompute in mm_cid_work_fn()). In practice syzkaller surfaced it as a KASAN use-after-free reported in __schedule -> mm_cid_switch_to, where the offending clear_bit() is inlined via mm_cid_schedout() -> mm_drop_cid(). Guard the transition-bit assignment against MM_CID_UNSET, in addition to the existing cid_in_transit() check, so the bit is only set on a genuine task-owned CID. A CPU-owned (MM_CID_ONCPU) CID of a running active task is handled by the cid_on_cpu(pcp->cid) branch above and never reaches this path, so excluding MM_CID_UNSET (and the already-transitioning case) is sufficient.
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.
kernel/sched/core.c
- What this is
- SCHEDULERMAINTAINERS section matched on kernel/sched/ · linux-kernel@vger.kernel.org · Maintained
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, sidy
- y
- built into the kernel image on every flavour - only a patch removes it
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 Debian linux-config packages
Signals
- Published
- 2026-07-19 (3 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.2% of all CVEssource
- CISA KEV
- not listedthe KEV catalogue
- Debian urgency
- unimportantsource
- Subsystem
- kernel/sched
Upstream fixes
The versions the CNA records as introducing and fixing this, and the commit for each. source
| Introduced | Fixed in | Commit |
|---|---|---|
| 6.19 | 7.1.3 | 8d32856fb72b |
| 6.19 | 7.2 | de3ab9bd3133 |
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 bug is reached only through local scheduler paths triggered by fork/clone, exit, and execve syscalls, not by any network, Bluetooth, or physical device interface.
- AC:LAttack complexity, low
- An unprivileged attacker can deliberately create many threads to enter per-CPU CID mode, fork/exec a task that remains active with MM_CID_UNSET, and time thread exits or affinity-driven fixups to hit the vulnerable branch without depending on conditions outside their control.
- PR:LPrivileges required, low
- Triggering the vulnerable fixup requires only standard unprivileged process operations (creating threads, forking, exiting) within one's own address space, including from unprivileged user namespaces.
- UI:NUser interaction, none
- Exploitation requires no action from any other user or administrator; the attacker drives the entire thread lifecycle and timing themselves.
- S:UScope, unchanged
- Impact is kernel memory corruption within the same kernel security boundary; it does not constitute a VM escape, sandbox breakout, or cross-authority boundary crossing.
- C:HConfidentiality impact, high
- The out-of-bounds bit-clear corrupts unpredictable kernel memory at a fixed large offset, and any such memory corruption can potentially be leveraged for information disclosure even though the immediate primitive is a single-bit write.
- I:HIntegrity impact, high
- The vulnerability performs an out-of-bounds write via clear_bit() with bit number MM_CID_UNSET (BIT(31)), which is genuine kernel memory corruption in the integrity domain.
- A:HAvailability impact, high
- Syzkaller reported this as a KASAN fault in __schedule -> mm_cid_switch_to, and corrupting arbitrary kernel memory can cause kernel oops, panic, or crash-level denial of service.