flawopen.com/Teardowns/cve-2024-33066-qualcomm-wlan-log-redirection
CVE-2024-33066 : faille de redirection des journaux WLAN
CVE-2024-33066 corrompt la mémoire si le WLAN Resource Manager de Qualcomm redirige un journal vers un chemin choisi. Correctif en octobre 2024.
Imaginez la réception d'un hôtel qui laisse n'importe qui appeler pour dire : « désormais, envoyez les copies du livre d'or à cette adresse ». Le réceptionniste recopie ce qu'on lui dicte sur une petite fiche, même quand le texte déborde de la fiche sur le comptoir, puis envoie les copies là où c'est écrit, y compris dans le coffre du directeur. La correction consiste à n'accepter qu'une courte étiquette désignant un tiroir de la salle des archives.
Concepts Clés et Termes
WLAN Resource Manager- Le composant Wi-Fi cité dans l'avis de Qualcomm sur
CVE-2024-33066. Il tourne sur les plateformes réseau de Qualcomm, utilisées dans des routeurs, des systèmes maillés et des points d'accès. Puces IPQ / QCN- Familles de systèmes sur puce réseau Wi-Fi de Qualcomm. La liste concernée comprend IPQ5332, IPQ8074A, IPQ9574, QCN9000 et les plateformes Immersive Home, pas des puces de téléphone.
CWE-20- Validation incorrecte des entrées : le logiciel fait confiance à une entrée sans vérifier qu'elle a les propriétés dont le code dépend, comme une longueur maximale ou un répertoire autorisé.
Ouverture relative à un répertoire- Ouvrir un fichier avec
openat()à partir d'un descripteur de répertoire et d'un simple nom sans '/', pour que le résultat ne puisse pas se trouver hors de ce répertoire. Vecteur CVSS 3.1- AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H : joignable par le réseau, faible complexité, sans privilèges ni interaction de l'utilisateur, impact élevé sur les trois propriétés (score 9.8).
Correspondances de référentiels
- Référence CWE pour la faiblesse décrite dans ce guide : CWE-20
Analyse de Cause Racine
L'avis de Qualcomm indique seulement que le WLAN Resource Manager subissait une corruption mémoire "while redirecting log file to any file location with any file name" (CWE-20). La destination fournie avec une demande de redirection des journaux était utilisée sans vérifier sa longueur ni l'endroit visé. Le code ci-dessous modélise ce défaut de validation ; il est illustratif et n'est pas du code source de Qualcomm.
Déroulement de l'Attaque Étape par Étape
1. Une demande de redirection des journaux arrive
Le WLAN Resource Manager accepte une demande d'envoyer sa sortie de journal ailleurs. Le vecteur CVSS (AV:N/PR:N/UI:N) classe la faille comme joignable par le réseau, sans privilèges ni interaction de l'utilisateur.
2. N'importe quel emplacement et n'importe quel nom sont acceptés
D'après la description de Qualcomm, la redirection fonctionnait vers n'importe quel emplacement et avec n'importe quel nom de fichier : ni la longueur de la destination demandée ni l'endroit visé n'étaient vérifiés.
3. L'entrée non vérifiée corrompt la mémoire
Dans le modèle ci-dessous, un nom plus long que le tampon fixe du chemin le déborde (strcpy), et n'importe quel chemin, y compris des fichiers de configuration, peut être ouvert en écriture. Qualcomm n'a pas précisé lequel de ces cas se produisait dans son code.
4. Impact et état
CVSS 3.1 classe comme élevé l'impact sur la confidentialité, l'intégrité et la disponibilité (9.8). Qualcomm a livré le correctif aux fabricants dans son bulletin d'octobre 2024 ; le tri de la CISA ne relève aucune exploitation connue.
Code Source : Vulnérable vs Sécurisé
Modèle illustratif de la classe de vulnérabilité, pas du code Qualcomm. Le gestionnaire durci borne l'entrée avec strnlen avant de l'utiliser, n'accepte qu'un nom court issu d'un jeu de caractères fixe (pas de '/', pas de '.' initial) et l'ouvre avec openat() par rapport à un répertoire de journaux choisi au démarrage, avec O_NOFOLLOW pour qu'un lien symbolique posé à l'avance ne détourne pas l'écriture. L'appelant peut choisir le nom du fichier, jamais son emplacement, et une entrée trop longue est refusée au lieu d'être copiée.
#include <fcntl.h>
#include <string.h>
#define LOG_PATH_MAX 64
struct rm_log_cfg {
char path[LOG_PATH_MAX];
int fd;
};
/* Traite une requête de « redirection de journal » ; `requested` provient du corps de la requête. */
int rm_set_log_destination(struct rm_log_cfg *cfg, const char *requested)
{
strcpy(cfg->path, requested); /* aucune vérification de longueur : une entrée longue déborde path[] */
cfg->fd = open(cfg->path, O_WRONLY | O_CREAT | O_APPEND, 0644); /* n’importe quel emplacement */
return cfg->fd < 0 ? -1 : 0;
}
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#define LOG_NAME_MAX 32
struct rm_log_cfg {
int dir_fd; /* répertoire de journaux fixe, ouvert une fois au démarrage */
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; /* rejette '/', le nom ne peut donc pas sortir de dir_fd */
}
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;
}
Liste de Contrôle de Sécurité pour l'Ingénierie
- ✓En CI, appelez rm_set_log_destination avec un nom de 64 caractères, '../etc/passwd', '/tmp/x', '.hidden' et un nom contenant '/', et vérifiez que chaque appel renvoie -EINVAL sans créer de fichier.
- ✓Faites échouer la CI sur tout nouvel appel à strcpy ou sprintf qui écrit des champs de requête dans un tampon de taille fixe (par exemple avec une règle semgrep ou clang-tidy) ; exigez une borne explicite comme strnlen ou snprintf.
- ✓Résolvez chaque fichier de sortie choisi par l'appelant avec
openat()à partir d'un descripteur de répertoire ouvert au démarrage, et passez O_NOFOLLOW pour qu'aucun nom ne puisse sortir de ce répertoire. - ✓Recensez les routeurs et points d'accès basés sur des puces IPQ/QCN, vérifiez que leur firmware inclut le correctif d'octobre 2024 de Qualcomm et gardez les interfaces d'administration et de diagnostic sur un réseau d'administration.