FlawOpen

flawopen.com/Teardowns/cve-2024-33066-qualcomm-wlan-log-redirection

● CVE-2024-33066 · CVSS 9.8 · Kritisch
Sicherheitsforschung · FlawOpen

CVE-2024-33066: Qualcomm-WLAN-Logfehler

CVE-2024-33066 beschädigt Speicher, wenn Qualcomms WLAN Resource Manager Logs an einen gewählten Pfad umleitet. Behoben im Okt. 2024.

💡 Einfache Erklärung (ELI5)

Stellen Sie sich eine Hotelrezeption vor, bei der jeder anrufen und sagen darf: „Schicken Sie Kopien des Gästebuchs ab sofort an diese Adresse.“ Der Rezeptionist schreibt alles Diktierte auf eine kleine Karteikarte, auch wenn der Text über den Kartenrand hinaus auf den Tresen läuft, und schickt die Kopien dann dorthin, wo es steht – auch in den Safe des Direktors. Die Lösung: nur ein kurzes Etikett annehmen, das eine Schublade im Archivraum benennt.

Kernkonzepte & Begriffe

WLAN Resource Manager
Die in Qualcomms Hinweis zu CVE-2024-33066 genannte WLAN-Komponente. Sie läuft auf Qualcomms Netzwerkplattformen, die in Routern, Mesh-Systemen und Access Points eingesetzt werden.
IPQ-/QCN-Chips
Qualcomms Familien von WLAN-Netzwerk-System-on-Chips. Betroffen sind unter anderem IPQ5332, IPQ8074A, IPQ9574, QCN9000 und Immersive-Home-Plattformen, keine Smartphone-Chips.
CWE-20
Unzureichende Eingabevalidierung: Die Software vertraut einer Eingabe, ohne zu prüfen, ob sie die Eigenschaften hat, auf die sich der Code verlässt, etwa eine Maximallänge oder ein erlaubtes Verzeichnis.
Verzeichnisrelatives Öffnen
Eine Datei mit openat() relativ zu einem Verzeichnisdeskriptor und mit einem einfachen Namen ohne '/' öffnen, sodass das Ergebnis dieses Verzeichnis nicht verlassen kann.
CVSS-3.1-Vektor
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H: über das Netzwerk erreichbar, geringe Komplexität, keine Rechte oder Benutzerinteraktion nötig, hohe Auswirkung auf alle drei Schutzziele (Wert 9.8).

Framework-Zuordnungen

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

Ursachenanalyse

Qualcomms Hinweis besagt nur, dass im WLAN Resource Manager Speicher beschädigt wurde "while redirecting log file to any file location with any file name" (CWE-20). Das mit einer Anfrage zur Log-Umleitung gelieferte Ziel wurde verwendet, ohne Länge oder Zielort zu prüfen. Der Code unten modelliert diese Lücke in der Eingabeprüfung; er ist illustrativ und kein Qualcomm-Quellcode.

Schritt-für-Schritt Angriffsablauf

Schritt 1

1. Eine Anfrage zur Log-Umleitung trifft ein

Der WLAN Resource Manager nimmt eine Anfrage an, seine Log-Ausgabe anderswohin zu schreiben. Der CVSS-Vektor (AV:N/PR:N/UI:N) stuft die Schwachstelle als über das Netzwerk ohne Rechte und ohne Benutzerinteraktion erreichbar ein.

Schritt 2

2. Jeder Ort und jeder Name wird akzeptiert

Laut Qualcomms Beschreibung funktionierte die Umleitung an jeden Ort und mit jedem Dateinamen: Das angefragte Ziel wurde weder auf Länge noch auf den Zielort geprüft.

Schritt 3

3. Ungeprüfte Eingabe beschädigt Speicher

Im Modell unten überläuft ein Name, der länger als der feste Pfadpuffer ist, diesen Puffer (strcpy), und jeder Pfad – auch Konfigurationsdateien – kann zum Schreiben geöffnet werden. Welcher dieser Fälle in Qualcomms Code auftrat, hat Qualcomm nicht veröffentlicht.

Schritt 4

4. Auswirkung und Status

CVSS 3.1 bewertet die Auswirkung auf Vertraulichkeit, Integrität und Verfügbarkeit als hoch (9.8). Qualcomm hat die Korrektur im Bulletin vom Oktober 2024 an die Gerätehersteller geliefert; die Einstufung der CISA verzeichnet keine bekannte Ausnutzung.

Quellcode: Verwundbar vs. Sicher

Illustratives Modell der Schwachstellenklasse, kein Qualcomm-Code. Der gehärtete Handler begrenzt die Eingabe mit strnlen, bevor er sie verwendet, akzeptiert nur einen kurzen Namen aus einem festen Zeichensatz (kein '/', kein führender '.') und öffnet ihn mit openat() relativ zu einem beim Start gewählten Log-Verzeichnis, mit O_NOFOLLOW, damit ein platzierter Symlink den Schreibvorgang nicht umlenkt. Der Aufrufer kann den Dateinamen wählen, nie aber den Ort, und überlange Eingaben werden abgelehnt statt kopiert.

VERWUNDBARE IMPLEMENTIERUNG
#include <fcntl.h>
#include <string.h>

#define LOG_PATH_MAX 64

struct rm_log_cfg {
    char path[LOG_PATH_MAX];
    int fd;
};

/* Verarbeitet eine Anfrage zur Protokollumleitung; `requested` stammt aus dem Anforderungstext. */
int rm_set_log_destination(struct rm_log_cfg *cfg, const char *requested)
{
    strcpy(cfg->path, requested);   /* keine Längenprüfung: Eine lange Eingabe überschreibt path[] */
    cfg->fd = open(cfg->path, O_WRONLY | O_CREAT | O_APPEND, 0644);  /* beliebiger Speicherort */
    return cfg->fd < 0 ? -1 : 0;
}
GEHÄRTETER SICHERHEITS-PATCH
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

#define LOG_NAME_MAX 32

struct rm_log_cfg {
    int dir_fd;                /* festes Protokollverzeichnis, einmalig beim Start geöffnet */
    char name[LOG_NAME_MAX];
    int fd;
};

static int valid_log_name(const char *name, size_t len)
{
    if (len == 0 || len >= LOG_NAME_MAX || name[0] == '.')
        return 0;
    for (size_t i = 0; i < len; i++) {
        char c = name[i];
        int ok = (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
                 c == '-' || c == '_' || c == '.';
        if (!ok)
            return 0;          /* weist '/' zurück, sodass der Name dir_fd nicht verlassen kann */
    }
    return 1;
}

int rm_set_log_destination(struct rm_log_cfg *cfg, const char *requested)
{
    size_t len = strnlen(requested, LOG_NAME_MAX);
    if (!valid_log_name(requested, len))
        return -EINVAL;

    int fd = openat(cfg->dir_fd, requested,
                    O_WRONLY | O_CREAT | O_APPEND | O_NOFOLLOW | O_CLOEXEC, 0600);
    if (fd < 0)
        return -errno;

    memcpy(cfg->name, requested, len + 1);
    if (cfg->fd >= 0)
        close(cfg->fd);
    cfg->fd = fd;
    return 0;
}

Checkliste für Engineering & Systemsicherheit

Quellen