FlawOpen

flawopen.com/Teardowns/cve-2026-49878-android-wpa-supplicant-oob-write

● CVE-2026-49878 · CVSS 7.2 · Hoch
Sicherheitsforschung · FlawOpen

CVE-2026-49878: Schreibzugriff außerhalb des Android-WLAN-Puffers

Das Android-Bulletin vom Oktober 2026 stuft diesen WLAN-RCE-Fehler als Hoch ein. AOSP korrigierte zwei int-Arrays, die nach Bytezahl statt Elementzahl reserviert wurden. Laut Datensatz sind Systemrechte erforderlich.

💡 Einfache Erklärung (ELI5)

Stell dir ein Regal für eine Kiste je Eintrag vor, aber der Mitarbeiter reserviert nur einen Zentimeter je Kiste. Die Kisten ragen über den Platz hinaus. Bei CVE-2026-49878 reservierte wpa_supplicant Bytes anhand der Integerzahl und schrieb ganze Integer. Googles Patch reserviert jedes Element in der passenden Größe.

Kernkonzepte & Begriffe

wpa_supplicant
Android-WLAN-Komponente für drahtlose Authentifizierung und zugehörige 802.11-Interaktionen.
SCS-Antwort
Robust-AV-Aktionsframe des Stream Classification Service. Der Handler verarbeitet es nur bei offener Anfrage und passendem Dialog-Token.
Schreibzugriff außerhalb der Grenzen (CWE-787)
Ein Schreibvorgang überschreitet den reservierten Speicherbereich. Hier zählt die Allokation Bytes, der Code indiziert aber int-Elemente.
os_zalloc / os_calloc
Allokationshelfer von wpa_supplicant. Der Patch übergibt Anzahl und Elementgröße, um den vollständigen Array-Speicher zu reservieren.
Android-Sicherheitspatchlevel (SPL)
Datumskennung des installierten Sicherheitsstands. Google zufolge behebt 2026-10-01 oder neuer die Bulletin-Probleme; Hersteller steuern die Auslieferung.

Framework-Zuordnungen

  • CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-787

Ursachenanalyse

In wpas_handle_robust_av_scs_recv_action sind scs_resp[0] und [1] Arrays vom Typ int *. Vor der Korrektur reservierte os_zalloc(num_active_scs) nur so viele Bytes. Der Code schreibt Integer-IDs und Statuswerte an indizierte Positionen; nötig sind daher num_active_scs * sizeof(int) Bytes. Prüfungen auf offene Anfrage, passenden Dialog-Token, Anzahl und Frame-Länge begrenzen die Eingabe, korrigieren aber nicht die Allocation-Einheit. Der AOSP-Patch ersetzt beide Aufrufe durch os_calloc(num_active_scs, sizeof(int)). Aus dem Out-of-Bounds-Write allein folgt kein vom Angreifer kontrollierter Codepfad.

Schritt-für-Schritt Angriffsablauf

Schritt 1

Antwortframe wird weitergeleitet

Der WLAN-Pfad leitet Robust AV SCS Response an den betroffenen Handler. Der Pfad ist netzwerkseitig erreichbar; die Quellen belegen jedoch nicht, dass jeder unauthentifizierte Sender alle Bedingungen erfüllt.

Schritt 2

Anfragezustand und Grenzen werden geprüft

Der Handler verlangt eine offene Anfrage und passenden Token und prüft die Anzahl. NVDs CISA-ADP-Vektor lautet AV:N/AC:L/PR:H/UI:N; die erforderlichen hohen Rechte beibehalten.

Schritt 3

Integer überschreiten die Byte-Allokation

Der alte Code reserviert ein Byte je Eintrag und schreibt int-Werte. Eine begrenzte Anzahl vergrößert den Speicher nicht.

Schritt 4

Oktober-Patch korrigiert die Allokation

Googles Änderung reserviert für beide Arrays num_active_scs Elemente der Größe sizeof(int). Kein Payload erfinden und keine beliebige Codeausführung aus dem Diff ableiten.

Quellcode: Verwundbar vs. Sicher

Der Diff ist die von AOSP veröffentlichte Codeänderung im Commit d131540379d631d7dcb09b0169e4462bc65abcca, kein rekonstruiertes Pseudocode-Beispiel. os_zalloc(n) verwendet n als Bytezahl; os_calloc(count, size) reserviert und nullt die gewünschte Elementzahl. Die Korrektur repariert beide Arrays und behält die vorhandene Fehlerbereinigung bei.

VERWUNDBARE IMPLEMENTIERUNG
/* AOSP vor der Korrektur: num_active_scs zählt Elemente,
 * os_zalloc erhält den Wert jedoch als Byte-Anzahl. */
scs_resp[0] = (int *) os_zalloc(num_active_scs);
if (!scs_resp[0])
    return;

scs_resp[1] = (int *) os_zalloc(num_active_scs);
if (!scs_resp[1]) {
    os_free(scs_resp[0]);
    return;
}
GEHÄRTETER SICHERHEITS-PATCH
/* AOSP-Korrektur: Für jeden Eintrag ein vollständiges int-Element reservieren. */
scs_resp[0] = os_calloc(num_active_scs, sizeof(int));
if (!scs_resp[0])
    return;

scs_resp[1] = os_calloc(num_active_scs, sizeof(int));
if (!scs_resp[1]) {
    os_free(scs_resp[0]);
    return;
}

Checkliste für Engineering & Systemsicherheit

Quellen