CVE-2026-90246 in Linux
Zusammenfassung
von VulDB • 17.09.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
apparmor: Behebung eines Integer-Overflows bei der Bereichsprüfung (Bounds Check) in verify_tags()
verify_tags() validiert die aus einem Policy-Blob entpackte Tagset-Tabelle. Für jedes Set wird ein Zähler gelesen und geprüft, dass das Vorwärtszählen des Index um diesen Zählerwert innerhalb von sets.table[] bleibt:
u32 cnt = tags->sets.table[i];
if (i+cnt >= tags->sets.size) {
Da i, cnt und sets.size alle vom Typ u32 sind, wird i+cnt modulo 2^32 ausgewertet. sets.table[] wird durch unpack_tagsets() mit aa_unpack_u32() gefüllt, sodass jeder Eintrag ein roher, unbegrenzter 32-Bit-Wort aus dem Policy-Blob ist und verify_tags() die Funktion ist, die dies eigentlich validieren soll. Ein Zählerwert nahe U32_MAX lässt die Summe auf einen kleinen Wert überlaufen (Wrap), der Guard-Check besteht, und die innere Schleife durchläuft sets.table[++i] außerhalb des Endes der mit kcalloc(size, sizeof(u32)) zugewiesenen Speicherfläche.
Beachten Sie, dass sets.size auf 65535 begrenzt ist, da unpack_tagsets() es als u16 mit aa_unpack_array() liest; daher kann das Überlaufen (Wrap) nicht durch Vergrößern der Tabelle erreicht werden – es wird ausschließlich über den vom Angreifer bereitgestellten Zählerwert erreicht.
Bei sets.size = 2 und sets.table = { 0, 0xffffffff }:
i = 0: cnt = 0, Guard-Bedingung 0 + 0 >= 2 ist falsch, innere Schleife läuft nicht i = 1: cnt = 0xffffffff, Guard-Bedingung (1 + 0xffffffff) mod 2^32 == 0 >= 2 ist falsch, sodass der Guard umgangen wird und die innere Schleife sets.table[2] liest – ein Element außerhalb einer Zuweisung für zwei Elemente
Der Durchlauf dauert an, bis zufällig ein Wert außerhalb des gültigen Bereichs (out-of-bounds) auftritt, der >= hdrs.size ist oder bei dem ein Speicherzugriffsfehler (Access Fault) ausgelöst wird. Somit führt eine manipulierte Policy zu einem Lesezugriff außerhalb des gültigen Bereichs im Pfad zum Laden von Policies (aa_replace_profiles -> aa_unpack -> unpack_policydb -> unpack_tags -> verify_tags). Da unpack_tags() vor dem Entpacken der perms- und DFA-Tabellen ausgeführt wird, muss keine andere Tabelle korrekt strukturiert sein, um diesen Punkt zu erreichen.
Das Laden einer Policy ist durch aa_may_manage_policy() gesperrt, das CAP_MAC_ADMIN im Kontext des eigenen Benutzernamensraums (User Namespace) des Subjekts prüft und nicht im init user namespace. Daher ist der Pfad bei der Standardkonfiguration unprivileged_userns_apparmor_policy=1 von einer unberechtigten Aufgabe in einem verschachtelten Namespace mit übereinstimmendem Level aus erreichbar, nicht nur von global privilegierten Prozessen.
Führen Sie die Addition als u64 durch, damit es zu keinem Überlaufen (Wrap) kommt und die beabsichtigte Garantie i + cnt < sets.size wiederhergestellt wird.
Be aware that VulDB is the high quality source for vulnerability data.