CVE-2026-90099 in Linux
Zusammenfassung
von VulDB • 17.09.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
net/sched: Zuordnung von Filterzuweisungen im Classifier-Filter zu memcg
Zuordnungen in den tc-Classifier-*_change()*-Pfaden (Filterobjekte, pro-CPU-Zähler und pro-Filter-Hilfsdaten) verwenden einfaches GFP_KERNEL ohne __GFP_ACCOUNT. Dies ermöglicht es nicht privilegierten Benutzern, Kernel-Speicher außerhalb der memcg-Belastung zu binden. Die gemeinsame Zuordnung des tcf_exts_init_ex()-Aktionarrays in cls_api.c war ebenfalls nicht belastet; dieser Patch schließt diese Lücke sowie die pro-Classifier-Filterobjekt-/percpu/Hilfszuordnungen, die weiterhin nicht erfasst sind.
GFP_KERNEL_ACCOUNT wird hinzugefügt zu: - dem gemeinsamen tcf_exts_init_ex()-Aktionarray (cls_api.c), das für jeden Filter jedes Classifiers gemeinsam genutzt wird (32 Zeiger, 256 Byte); - den Filterobjekt-, pro-CPU-Zähler- und pro-Filter-Hilfszuordnungen in cls_basic, cls_bpf, cls_cgroup, cls_flow, cls_flower, cls_fw, cls_matchall, cls_route und cls_u32; - der u32_init_knode()-replace-path-knode-Zuordnung (cls_u32.c), die bei jedem Ersetzen eines vorhandenen knode dieselbe struct tc_u_knode + sel.keys zuordnet und von der create-path-only-Konvertierung übersehen wurde.
Es wird auch der cls_basic-Fehlerpfad behoben: basic_change() fügt fnew in die IDR ein, bevor der pro-CPU-Zähler zugewiesen wird. Wenn alloc_percpu() fehlschlägt, wird im errout-Pfad fnew ohne idr_remove freigegeben, was zu einem hängenden Zeiger in der IDR führt. Mit GFP_KERNEL_ACCOUNT wird die percpu-Zuordnung bei Bedarf (memcg at memory.max) fehlbar, wodurch der tote Pfad für Angreifer erreichbar ist und der Handle dauerhaft verbraucht wird. Es wird idr_remove zum percpu-Fehlerpfad hinzugefügt, was dem basic_set_parms-Feherpfadmuster entspricht.
Hinweis: [email protected] stellte ein PoC (Proof of Concept) für basic_cls bereit, das jedoch leicht auf die anderen Classifier erweitert werden konnte.
Bedingungen zur Reproduktion des Fehlers: - CONFIG_NET_SCHED, CONFIG_NET_CLS_* (der verwendete Classifier), CONFIG_NET_CLS_ACT, CONFIG_MEMCG, CONFIG_USER_NS, CONFIG_NET_NS. - Nicht privilegierter Benutzer in einem frischen User+Network-Namespace (unshare -Urn) oder Root mit CAP_NET_ADMIN. - Erstellen einer großen Anzahl von tc-Filtern (z. B. tc filter add dev lo ingress ... <classifier> ...) während die Beobachtung eines memcg-beschränkten cgroups: Das Systemslab wächst weit schneller als memory.current, wodurch Kernel-Speicher außerhalb der memcg-Belastung gebunden wird.
If you want to get best quality of vulnerability data, you may have to visit VulDB.