
Technical write-up e proof-of-concept per CVE-2026-8069, una escalation locale dei privilegi nei servizi Acer NitroSense e PredatorSense, che sfrutta una named pipe per eseguire codice arbitrario come SYSTEM.
Acer NitroSense e PredatorSense 3.x installavano un servizio Windows chiamato PSSvc che esponeva un protocollo personalizzato su named pipe agli utenti locali. Un comando del protocollo accettava un percorso eseguibile controllato dal chiamante, duplicava il token di winlogon.exe e avviava quell'eseguibile come NT AUTHORITY\SYSTEM.
La restrizione sul percorso nel servizio vulnerabile era un test di sottostringa. Un percorso che iniziava all'interno della directory del servizio e poi utilizzava componenti ..\ superava il test ma veniva risolto altrove. Combinato con il controllo di accesso permissivo della pipe e l'assenza di autorizzazione del chiamante, ciò consentiva a un utente locale standard di ottenere un processo SYSTEM.
Acer ha assegnato CVE-2026-8069, ha pubblicato versioni corrette e ha accreditato Artem Domarev dell'Università di Hradec Králové nel suo bollettino di sicurezza.
Questo articolo si concentra sul percorso di creazione processo/LPE. Il bollettino di Acer descrive anche l'eliminazione arbitraria di file, che era fuori dall'ambito di questa validazione.
La scelta della direzione di ricerca è stata influenzata anche da un'analisi pubblica del software OEM pubblicata da Leon Jacobs di SensePost. Quel lavoro documentava vulnerabilità in ASUS DriverHub, MSI Center, Acer Control Centre e Razer Synapse 4 (Jacobs, 2025). Ha rafforzato l'idea che le utility hardware fornite dai vendor possano esporre una superficie d'attacco significativa e poco esplorata. Piuttosto che rivisitare Acer Control Centre, ho esteso l'indagine a una diversa famiglia di prodotti Acer: NitroSense e PredatorSense.
| Elemento | Risultato |
|---|---|
| CVE | CVE-2026-8069 |
| Componente vulnerabile testato | PSSvc.exe 3.1.3052.0, firmato da Acer Incorporated |
| Identità del servizio | LocalSystem |
| Endpoint IPC | \\.\pipe\predatorsense_service_namedpipe |
| Comando vulnerabile | 0x0007 |
| Accesso richiesto all'attaccante | Utente locale autenticato in grado di eseguire un programma |
| Interazione con l'utente | Nessuna |
| Risultato | Eseguibile arbitrario avviato come NT AUTHORITY\SYSTEM |
| CVSS v3.1 NVD | 7.8 Alto — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Versioni corrette | PredatorSense 3.00.3198; NitroSense 3.01.3056 |
La catena di sfruttamento è breve:
utente locale autenticato
│
▼
named pipe PSSvc permissiva
│ comando personalizzato 0x0007
▼
controllo del percorso solo per sottostringa
│ service-dir\..\..\..\Windows\System32\cmd.exe
▼
duplicazione del token di winlogon.exe della sessione attiva
│
▼
CreateProcessAsUserW → NT AUTHORITY\SYSTEM
C'è un'incoerenza nella formulazione pubblica. La pagina di Acer afferma che le versioni di NitroSense "precedenti alla 3.01.3052" sono vulnerabili, ma la versione 3.1.3052.0 di PSSvc.exe firmata dal vendor e testata per questo articolo è dimostrabilmente vulnerabile. La stessa pagina identifica NitroSense 3.01.3056 come versione corretta. Anche l'intervallo di applicabilità NVD si estende fino a, ma non includendo, 3.01.3056.
Per PredatorSense, la frase di Acer sulle versioni vulnerabili si ferma prima della 3.00.3196, mentre la versione corretta elencata è la 3.00.3198 e NVD usa quest'ultima come limite superiore.
La regola operativa prudente è quindi semplice: non usare l'ambigua frase "vulnerabili" come controllo per le patch. Aggiornare almeno alle versioni corrette indicate da Acer—PredatorSense 3.00.3198 o NitroSense 3.01.3056—o a un pacchetto più recente compatibile con il modello.
Il problema è stato riprodotto con il pacchetto NitroSense originale.
| Artefatto | SHA-256 |
|---|---|
NitroSense_V3.01.3052_MSFT_SIGNED_20230420.zip | 947FB7C62665875450AFA9C9E7919D2B061ED8197C11B28D64781F121B30C157 |
NitroSense.msi | 6F9D405B6D2ADF2992C4E071453AD2C919A6DD38A89A31EF96EAFE81C50A745C |
PSSvc.exe 3.1.3052.0 installato | 3BA836B6A5D95B55708E771B74F49098F58B096EF1F63C5CCAE355811E193A40 |
| PoC usato per la validazione | 31BC81140BAB64A8B0CB70ACC1C2CF3CA84A7B00015E5610AC075DC50DCB0163 |
La firma Authenticode di PSSvc.exe è stata validata con successo e la catena di certificazione risaliva a Acer Incorporated. L'MSI installava PSSvc come servizio a processo singolo ad avvio su richiesta, in esecuzione come LocalSystem.
Il pacchetto NitroSense installa:
SERVICE_NAME: PSSvc
DISPLAY_NAME: Predator Service
TYPE: WIN32_OWN_PROCESS
START_TYPE: DEMAND_START
ACCOUNT: LocalSystem
Un servizio SYSTEM non è automaticamente vulnerabile. La domanda importante è se un processo con privilegi inferiori possa raggiungere funzionalità progettate presupponendo che il chiamante sia attendibile.
L'analisi delle stringhe ha subito rivelato l'endpoint IPC:
\\.\pipe\predatorsense_service_namedpipe
All'indirizzo 0x140014AD0, il servizio crea la pipe e passa un descrittore di sicurezza esplicito a CreateNamedPipeW:
D:(A;OICI;GA;;;BG)(D;OICI;GA;;;AN)(A;OICI;GRGWGX;;;AU)(A;OICI;GA;;;BA)
Vale la pena di chiarirlo esplicitamente: la build vulnerabile non passa un descrittore NULL. Crea una DACL permissiva.
| Abbreviazione SID | Entità | Permesso effettivo nella SDDL |
|---|---|---|
BG | Guest predefiniti | Accesso generico completo |
AN | Anonimo | Accesso generico completo negato |
AU | Utenti autenticati | Lettura, scrittura ed esecuzione generiche |
BA | Amministratori predefiniti | Accesso generico completo |
L'ACE AU è sufficiente perché un normale utente autenticato apra la pipe in lettura e scrittura. Il server non impersona quindi il client né esegue una decisione di autorizzazione prima di smistare i comandi privilegiati.
Il thread client all'indirizzo 0x14000ABB0 legge i messaggi in un buffer di 512 byte. Analizza i primi tre byte come un numero di comando a 16 bit e un conteggio di argomenti a 8 bit. Ogni argomento è preceduto dalla sua lunghezza:
Offset Dimensione Significato
0x00 2 ID comando, little-endian
0x02 1 numero di argomenti
0x03 4 lunghezza dell'argomento 0
0x07 n byte dell'argomento 0
... DWORD di lunghezza ripetuta + valore
Gli argomenti stringa sono in UTF-16LE. Gli argomenti interi sono DWORD little-endian. Lo smistatore accetta ID di comando inferiori a 0x23 e li usa come indici in una tabella di funzioni a 35 voci all'indirizzo 0x140052C90.
La voce per il comando 0x0007 punta a 0x14000BFD0.
Ridotto al suo comportamento rilevante per la sicurezza, il gestore si presenta così:
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;
}
wcsstr risponde solo se una stringa compare all'interno di un'altra. Non canonizza un percorso, non risolve i segmenti punto, non apre un file e non dimostra che l'oggetto finale rimanga sotto una directory attendibile.
Supponiamo che il servizio sia installato in: