
Write-up técnico e prova de conceito para CVE-2026-8069, uma escalada local de privilégios nos serviços Acer NitroSense e PredatorSense, explorando um named pipe para executar código arbitrário como SYSTEM.
O Acer NitroSense e o PredatorSense 3.x instalaram um serviço Windows chamado PSSvc que expunha um protocolo de named pipe personalizado a utilizadores locais. Um comando do protocolo aceitava um caminho de executável controlado pelo chamador, duplicava o token de winlogon.exe e iniciava esse executável como NT AUTHORITY\SYSTEM.
A restrição de caminho no serviço vulnerável era um teste de substring. Um caminho que começava dentro do diretório do serviço e depois usava componentes ..\ passava no teste, mas resolvia para outro local. Combinado com o controlo de acesso permissivo do pipe e a ausência de autorização do chamador, isto permitia que um utilizador local padrão obtivesse um processo SYSTEM.
A Acer atribuiu CVE-2026-8069, publicou correções e creditou Artem Domarev da Universidade de Hradec Králové no seu aviso de segurança.
Este artigo foca-se no caminho de criação de processo/LPE. O aviso da Acer também descreve a eliminação arbitrária de ficheiros, que estava fora do âmbito desta validação.
A escolha da direção de investigação também foi influenciada por uma análise pública de software OEM publicada por Leon Jacobs da SensePost. Esse trabalho documentou vulnerabilidades no ASUS DriverHub, MSI Center, Acer Control Centre e Razer Synapse 4 (Jacobs, 2025). Reforçou a ideia de que utilitários de hardware fornecidos pelos fornecedores podem expor uma superfície de ataque significativa e pouco explorada. Em vez de revisitar o Acer Control Centre, estendi a investigação a uma família de produtos diferente da Acer: NitroSense e PredatorSense.
| Item | Resultado |
|---|---|
| CVE | CVE-2026-8069 |
| Componente vulnerável testado | PSSvc.exe 3.1.3052.0, assinado pela Acer Incorporated |
| Identidade do serviço | LocalSystem |
| Endpoint IPC | \\.\pipe\predatorsense_service_namedpipe |
| Comando vulnerável | 0x0007 |
| Acesso necessário do atacante | Utilizador local autenticado capaz de executar um programa |
| Interação do utilizador | Nenhuma |
| Resultado | Executável arbitrário iniciado como NT AUTHORITY\SYSTEM |
| CVSS v3.1 da NVD | 7.8 Alta — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Versões corrigidas | PredatorSense 3.00.3198; NitroSense 3.01.3056 |
A cadeia de exploração é curta:
utilizador local autenticado
│
▼
named pipe permissivo do PSSvc
│ comando personalizado 0x0007
▼
verificação de caminho apenas por substring
│ service-dir\..\..\..\Windows\System32\cmd.exe
▼
duplicar token do winlogon.exe da sessão ativa
│
▼
CreateProcessAsUserW → NT AUTHORITY\SYSTEM
Existe uma inconsistência na redação pública. A página da Acer afirma que as versões do NitroSense "anteriores a 3.01.3052" são afetadas, mas o PSSvc.exe versão 3.1.3052.0 assinado pelo fornecedor e testado para este artigo é demonstravelmente vulnerável. A mesma página identifica o NitroSense 3.01.3056 como a versão corrigida. O intervalo de aplicabilidade da NVD também se estende até, mas não incluindo, 3.01.3056.
Para o PredatorSense, a frase de versões afetadas da Acer termina antes de 3.00.3196, enquanto a versão corrigida listada é 3.00.3198 e a NVD usa esta última como limite superior.
A regra operacional conservadora é, portanto, simples: não use a frase ambígua "afetado" como verificação de patch. Atualize para pelo menos as versões corrigidas que a Acer nomeia — PredatorSense 3.00.3198 ou NitroSense 3.01.3056 — ou um pacote mais recente compatível com o modelo.
O problema foi reproduzido com o pacote original do NitroSense.
| Artefacto | SHA-256 |
|---|---|
NitroSense_V3.01.3052_MSFT_SIGNED_20230420.zip | 947FB7C62665875450AFA9C9E7919D2B061ED8197C11B28D64781F121B30C157 |
NitroSense.msi | 6F9D405B6D2ADF2992C4E071453AD2C919A6DD38A89A31EF96EAFE81C50A745C |
PSSvc.exe 3.1.3052.0 instalado | 3BA836B6A5D95B55708E771B74F49098F58B096EF1F63C5CCAE355811E193A40 |
| PoC usado para validação | 31BC81140BAB64A8B0CB70ACC1C2CF3CA84A7B00015E5610AC075DC50DCB0163 |
A assinatura Authenticode do PSSvc.exe foi validada com sucesso e encadeada até à Acer Incorporated. O MSI instalou o PSSvc como um serviço de processo próprio com início sob demanda, a executar como LocalSystem.
O pacote NitroSense instala:
SERVICE_NAME: PSSvc
DISPLAY_NAME: Predator Service
TYPE: WIN32_OWN_PROCESS
START_TYPE: DEMAND_START
ACCOUNT: LocalSystem
Um serviço SYSTEM não é automaticamente vulnerável. A questão importante é se um processo com privilégios inferiores consegue alcançar funcionalidade que foi concebida sob o pressuposto de que o seu chamador é confiável.
A análise de strings expôs imediatamente o endpoint IPC:
\\.\pipe\predatorsense_service_namedpipe
Em 0x140014AD0, o serviço constrói o pipe e passa um descritor de segurança explícito a CreateNamedPipeW:
D:(A;OICI;GA;;;BG)(D;OICI;GA;;;AN)(A;OICI;GRGWGX;;;AU)(A;OICI;GA;;;BA)
Isto merece uma correção explícita: a versão vulnerável não passa um descritor NULL. Ela cria uma DACL permissiva.
| Abreviatura SID | Principal | Permissão efetiva no SDDL |
|---|---|---|
BG | Convidados incorporados | Generic All |
AN | Anónimo | Generic All negado |
AU | Utilizadores autenticados | Generic Read, Write e Execute |
BA | Administradores incorporados | Generic All |
A ACE AU é suficiente para que um utilizador autenticado normal abra o pipe para leitura e escrita. O servidor não faz depois impersonação do cliente nem toma uma decisão de autorização antes de despachar comandos privilegiados.
O thread cliente em 0x14000ABB0 lê mensagens para um buffer de 512 bytes. Ele analisa os primeiros três bytes como um número de comando de 16 bits e uma contagem de argumentos de 8 bits. Cada argumento tem prefixo de comprimento:
Offset Tamanho Significado
0x00 2 ID do comando, little-endian
0x02 1 número de argumentos
0x03 4 comprimento do argumento 0
0x07 n bytes do argumento 0
... DWORD de comprimento repetido + valor
Os argumentos de string são UTF-16LE. Os argumentos inteiros são DWORDs little-endian. O dispatcher aceita IDs de comando abaixo de 0x23 e usa-os como índices numa tabela de funções com 35 entradas em 0x140052C90.
A entrada para o comando 0x0007 aponta para 0x14000BFD0.
Reduzido ao seu comportamento relevante para a segurança, o handler tem esta aparência:
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 responde apenas se uma string ocorre dentro de outra. Não canonicaliza um caminho, não resolve segmentos de ponto, não abre um ficheiro, nem prova que o objeto final permanece sob um diretório confiável.
Assuma que o serviço está instalado em:
C:\Program Files\Acer\NitroSense_Service
O seguinte caminho contém esse diretório no offset zero, portanto wcsstr tem sucesso:
C:\Program Files\Acer\NitroSense_Service\..\..\..\WINDOWS\System32\cmd.exe