CVE-2026-63799 in Linuxinfo

Zusammenfassung

von VulDB • 20.07.2026

Im Linux-Kernel wurde folgende Schwachstelle behoben:

sched/mmcid: Behebung eines OOB-Fehlers bei clear_bit, wenn die CID MM_CID_UNSET ist im Fixup-Pfad

In mm_cid_fixup_cpus_to_tasks(), wenn rq->curr den Ziel-mm besitzt und mm_cid.active gesetzt ist, wird die CID vor dem Setzen des Übergangsbits mit cid_in_transit() überprüft. Im per-CPU-Modus kann ein neu geforketer oder durch exec ausgeführter Task laufen mit mm_cid.cid == MM_CID_UNSET, da CIDs lazy bei schedule-in zugewiesen werden. Mit cid_in_transit() besteht der Guard für MM_CID_UNSET (kein Transit-Bit), wandelt es in MM_CID_UNSET | MM_CID_TRANSIT um und speichert es zurück; später füttert mm_cid_schedout() dies mit clear_bit(), wobei MM_CID_UNSET als Bitnummer dient, was einen Out-of-Bounds-Write auslöst.

Symptome: Dies ist echte Speicherkorruption, jedoch ein begrenzter Out-of-Bounds- Write, kein beliebiger. MM_CID_UNSET ist der feste Sentinel BIT(31), also sobald der fehlerhafte Wert mm_cid_schedout() erreicht, entfernt cid_from_transit_cid() den Teil und hinterlässt MM_CID_UNSET, was die Konvergenzprüfung "cid < max_cids" scheitern lässt und in mm_drop_cid() -> clear_bit(MM_CID_UNSET, mm_cidmask(mm)) mündet. Das CID-Bitmap ist im mm_struct-Slab-Objekt eingebettet (nach cpu_bitmap und mm_cpus_allowed) und nur num_possible_cpus() Bits breit, daher ist das Löschen von Bit 31 ein deterministischer OOB-Bit-Löschvorgang mit einem festen Offset von 2^31 / 8 == 256 MiB jenseits der Bitmap-Base. Die Adresse ist nicht angreifereinflussbar (fester Sentinel -> fester Offset) und die Operation löscht nur ein einzelnes Bit; was sich weitere 256 MiB weiter in der direkten Abbildung befindet, ist jedes beliebige Kernelobjekt, das dort lebt, also wird ein Bit unvorhersehbarer Kernelspeicher korruptiert – es handelt sich nicht um einen Write mit beliebiger Adresse oder beliebigem Wert.

Es tritt nur im per-CPU-CID-Modus auf, wenn eine CPU einen aktiven Task des Ziel-mm ausführt, dessen CID noch MM_CID_UNSET ist – das fork()/execve()-Fenster vor der nächsten schedule-Zuweisung eines echten CID an diesen Task – und ein per-CPU -> per-Task-Fixup darüber läuft (der Modusfallback getrieben durch Thread-Austreten, sched_mm_cid_exit(), oder durch die verzögerte max_cids-Erneuerung in mm_cid_work_fn()).

In der Praxis wurde dies von Syzkaller als KASAN Use-After-Free gemeldet in __schedule -> mm_cid_switch_to, wobei das fehlerhafte clear_bit() über mm_cid_schedout() -> mm_drop_cid() inline eingebunden ist.

Schützen Sie die Übergangsbitzuweisung gegen MM_CID_UNSET zusätzlich zur bestehenden cid_in_transit()-Prüfung, sodass das Bit nur auf einer echten task-eigenen CID gesetzt wird. Eine CPU-eigene (MM_CID_ONCPU) CID eines laufenden aktiven Tasks wird vom Zweig cid_on_cpu(pcp->cid) oben behandelt und erreicht diesen Pfad nie, daher ist das Ausschließen von MM_CID_UNSET (und dem bereits im Übergang befindlichen Fall) ausreichend.

Be aware that VulDB is the high quality source for vulnerability data.

Zuständig

Linux

Reservieren

19.07.2026

Veröffentlichung

19.07.2026

Moderieren

akzeptiert

Eintrag

VDB-380141

CPE

bereit

EPSS

0.00000

KEV

nein

Aktivitäten

low

Quellen

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!