
Écrit technique et preuve de concept pour CVE-2026-8069, une élévation de privilèges locale dans les services Acer NitroSense et PredatorSense, exploitant un tube nommé pour exécuter du code arbitraire en tant que SYSTEM.
Acer NitroSense et PredatorSense 3.x installaient un service Windows nommé PSSvc qui exposait un protocole de named pipe personnalisé aux utilisateurs locaux. Une commande du protocole acceptait un chemin d'exécutable contrôlé par l'appelant, dupliquait le jeton de winlogon.exe et lançait cet exécutable en tant que NT AUTHORITY\SYSTEM.
La restriction de chemin dans le service vulnérable était un test de sous-chaîne. Un chemin commençant dans le répertoire du service puis utilisant des composants ..\ passait le test mais se résolvait ailleurs. Combiné au contrôle d'accès permissif du pipe et à l'absence d'autorisation de l'appelant, cela permettait à un utilisateur local standard d'obtenir un processus SYSTEM.
Acer a attribué CVE-2026-8069, a publié des correctifs et a crédité Artem Domarev de l'Université de Hradec Králové dans son avis de sécurité.
Cet article se concentre sur le chemin de création de processus/élévation de privilèges. L'avis d'Acer décrit également une suppression arbitraire de fichiers, qui sortait du cadre de cette validation.
Le choix de la direction de recherche a également été influencé par une analyse publique des logiciels OEM publiée par Leon Jacobs de SensePost. Ce travail documentait des vulnérabilités dans ASUS DriverHub, MSI Center, Acer Control Centre et Razer Synapse 4 (Jacobs, 2025). Cela a renforcé l'idée que les utilitaires matériels fournis par les fournisseurs peuvent exposer une surface d'attaque significative et sous-explorée. Plutôt que de revisiter Acer Control Centre, j'ai étendu l'investigation à une autre famille de produits Acer : NitroSense et PredatorSense.
| Élément | Résultat |
|---|---|
| CVE | CVE-2026-8069 |
| Composant vulnérable testé | PSSvc.exe 3.1.3052.0, signé par Acer Incorporated |
| Identité du service | LocalSystem |
| Point de terminaison IPC | \\.\pipe\predatorsense_service_namedpipe |
| Commande vulnérable | 0x0007 |
| Accès attaquant requis | Utilisateur local authentifié capable d'exécuter un programme |
| Interaction utilisateur | Aucune |
| Résultat | Exécutable arbitraire lancé en tant que NT AUTHORITY\SYSTEM |
| CVSS v3.1 NVD | 7.8 Élevé — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Versions corrigées | PredatorSense 3.00.3198 ; NitroSense 3.01.3056 |
La chaîne d'exploitation est courte :
utilisateur local authentifié
│
▼
named pipe PSSvc permissif
│ commande personnalisée 0x0007
▼
vérification de chemin par sous-chaîne uniquement
│ service-dir\..\..\..\Windows\System32\cmd.exe
▼
duplication du jeton winlogon.exe de la session active
│
▼
CreateProcessAsUserW → NT AUTHORITY\SYSTEM
Il existe une incohérence dans la formulation publique. La page d'Acer indique que les versions de NitroSense « antérieures à 3.01.3052 » sont concernées, alors que la version 3.1.3052.0 de PSSvc.exe signée par le fournisseur et testée pour cet article est manifestement vulnérable. La même page identifie NitroSense 3.01.3056 comme version corrigée. La plage d'applicabilité NVD s'étend également jusqu'à, mais sans inclure, 3.01.3056.
Pour PredatorSense, la phrase d'Acer sur les versions concernées s'arrête avant 3.00.3196, tandis que la version corrigée listée est 3.00.3198 et que NVD utilise cette dernière comme limite supérieure.
La règle opérationnelle prudente est donc simple : ne pas utiliser la phrase ambiguë « concerné » comme vérification de correctif. Mettez à niveau au moins vers les versions corrigées nommées par Acer — PredatorSense 3.00.3198 ou NitroSense 3.01.3056 — ou un package plus récent compatible avec le modèle.
Le problème a été reproduit avec le package NitroSense d'origine.
| Artefact | SHA-256 |
|---|---|
NitroSense_V3.01.3052_MSFT_SIGNED_20230420.zip | 947FB7C62665875450AFA9C9E7919D2B061ED8197C11B28D64781F121B30C157 |
NitroSense.msi | 6F9D405B6D2ADF2992C4E071453AD2C919A6DD38A89A31EF96EAFE81C50A745C |
PSSvc.exe 3.1.3052.0 installé | 3BA836B6A5D95B55708E771B74F49098F58B096EF1F63C5CCAE355811E193A40 |
| PoC utilisé pour la validation | 31BC81140BAB64A8B0CB70ACC1C2CF3CA84A7B00015E5610AC075DC50DCB0163 |
La signature Authenticode de PSSvc.exe a été validée avec succès et remontait jusqu'à Acer Incorporated. Le MSI installait PSSvc comme service à processus propre à démarrage manuel fonctionnant en tant que LocalSystem.
Le package NitroSense installe :
SERVICE_NAME: PSSvc
DISPLAY_NAME: Predator Service
TYPE: WIN32_OWN_PROCESS
START_TYPE: DEMAND_START
ACCOUNT: LocalSystem
Un service SYSTEM n'est pas automatiquement vulnérable. La question importante est de savoir si un processus de moindre privilège peut atteindre des fonctionnalités conçues en supposant que son appelant est de confiance.
L'analyse des chaînes a immédiatement révélé le point de terminaison IPC :
\\.\pipe\predatorsense_service_namedpipe
À 0x140014AD0, le service crée le pipe et transmet un descripteur de sécurité explicite à CreateNamedPipeW :
D:(A;OICI;GA;;;BG)(D;OICI;GA;;;AN)(A;OICI;GRGWGX;;;AU)(A;OICI;GA;;;BA)
Il convient de corriger explicitement ce point : la version vulnérable ne transmet pas un descripteur NULL. Elle crée une DACL permissive.
| Abréviation SID | Principal | Autorisation effective dans le SDDL |
|---|---|---|
BG | Invités intégrés | Contrôle total générique |
AN | Anonyme | Contrôle total générique refusé |
AU | Utilisateurs authentifiés | Lecture, écriture et exécution génériques |
BA | Administrateurs intégrés | Contrôle total générique |
L'ACE AU suffit à un utilisateur authentifié normal pour ouvrir le pipe en lecture et en écriture. Le serveur n'effectue ensuite pas d'emprunt d'identité du client ni de décision d'autorisation avant de distribuer les commandes privilégiées.
Le thread client à 0x14000ABB0 lit les messages dans un tampon de 512 octets. Il analyse les trois premiers octets comme un numéro de commande sur 16 bits et un nombre d'arguments sur 8 bits. Chaque argument est préfixé par sa longueur :
Décalage Taille Signification
0x00 2 identifiant de commande, petit-boutiste
0x02 1 nombre d'arguments
0x03 4 longueur de l'argument 0
0x07 n octets de l'argument 0
... longueur DWORD répétée + valeur
Les arguments chaîne sont en UTF-16LE. Les arguments entiers sont des DWORD petit-boutistes. Le répartiteur accepte les identifiants de commande inférieurs à 0x23 et les utilise comme index dans une table de fonctions de 35 entrées à 0x140052C90.
L'entrée pour la commande 0x0007 pointe vers 0x14000BFD0.
Réduit à son comportement pertinent pour la sécurité, le gestionnaire ressemble à ceci :
int command_07(parsed_arguments *args)
{
wchar_t service_directory[MAX_PATH];
wchar_t *requested_path = args->wide_string[0];
uint32_t mode = args->dword[1];
GetModuleFileNameW(NULL, service_directory, MAX_PATH);
PathRemoveFileSpecW(service_directory);
if (wcsstr(requested_path, service_directory) != NULL)
return launch_with_selected_token(requested_path, mode);
return 0;
}