Notepad++ v8.9.6.2 — HMAC競合状態を介した攻撃者制御のUserCommand実行
| GHSA | GHSA-qm4c-qg8p-qfcr |
| CVE | CVE-2026-52885 |
| 重大度 | 高 |
| 影響を受けるバージョン | v8.9.6.2 |
| 修正済みバージョン | v8.9.6.4 |
| パッチコミット | 4f7563c |
| 影響を受けるファイル | PowerEditor/src/NppCommands.cpp :4328–4359 |
| プラットフォーム | Windows 11 Pro x64 |
| 必要な権限 | 標準ユーザー(shortcuts.xmlへの書き込みアクセス権) |
| 研究者 | v3s9er |
| 開示日 | 2026-06-05 |
Notepad++ v8.9.6.2では、任意のUserCommandエントリの注入を防ぐために、shortcuts.xmlに対するHMAC-SHA256整合性チェックが導入されました。
このチェックにはTOCTOUの欠陥があります。HMACはトリガー時にディスク上のファイルに対して検証されますが、実行されるコマンドは起動時に読み込まれたメモリ内の_userCommandsベクターから読み取られます。これら2つのソースが再同期されることはありません。
shortcuts.xmlに書き込みできる攻撃者は、起動前に悪意のあるコマンドを仕込み、Notepad++にそれをメモリへ読み込ませ、ディスク上の正当なファイルを復元してからコマンドをトリガーできます。HMACチェックは成功します(ディスクはクリーン)が、悪意のあるペイロードが実行されます(メモリは古いまま)。
整合性メカニズムは現在のディスク上のshortcuts.xmlを検証する一方、コマンド実行は以前に読み込まれたメモリ内の表現を使用します。2つのデータソースは独立しているため、攻撃者は起動前にファイルを変更し、それをメモリに解析させ、コマンド実行前に元のファイルを復元できます。これにより、HMACチェックは成功する一方で、悪意のあるペイロードが実行されます。
NppCommands.cpp の4328〜4359行目:
// TIME OF CHECK — reads on-disk file
std::string currentHMAC = computeHMAC(
getMachineGUID(),
getFileContent(nppParams.getShortcutsPath().c_str())
);
if (currentHMAC != nppGUI._shortcutsXmlHmacInConfig) { return; }
// validated against DISK
// TIME OF USE — reads in-memory vector (loaded at startup, never refreshed)
int i = id - ID_USER_CMD;
const vector<UserCommand>& cmds = nppParams.getUserCommandList();
UserCommand ucmd = cmds[i];
Command cmd(string2wstring(ucmd.getCmd(), CP_UTF8));
cmd.run(_pPublicInterface->getHSelf()); // executes payload from MEMORY
| 操作 | ソース | タイミング |
|---|---|---|
| チェック(HMAC) | ディスクファイル | トリガー時 |
| 使用(実行) | メモリベクター | 起動時に読み込み |
| ギャップ | 攻撃者制御 | 起動 → トリガー |
前提条件: shortcuts.xmlへの書き込みアクセス権
notepad++.exeと同じディレクトリ%AppData%\Notepad++\手順:
shortcuts.xmlを悪意のあるバージョン(cmd = calc.exe)で上書きする_userCommandsが悪意のあるファイルから読み込まれるshortcuts.xmlをディスクに復元する — HMACがconfig.xmlと一致するWM_COMMAND(21000)(ID_USER_CMD+0)を送信するか、Ctrl+Alt+Pを押す_userCommands[0]を読み取る → calc.exeが実行される結果: 現在のユーザーの権限で攻撃者制御のコマンドが実行されます。管理者権限は不要、UACプロンプトなし、ユーザーへの警告もありません。
poc_8962_toctou.ps1 を参照してください。
要件:
doLocalConf.xmlが存在すること(ポータブルモード)shortcuts.xmlに対する有効なHMACを含むconfig.xml.\poc_8962_toctou.ps1 -NppPath "C:\path\to\notepad++.exe"
検証済み: calc.exeが起動され(PID 35932)、ディスクには常に正当なshortcuts.xmlが表示されていました。
修正(コミット4f7563c)では、HMAC検証が初期ファイル解析とともに起動時に移動されました。チェックと使用が同じタイミングで同じオブジェクトに対して行われるようになり、TOCTOUの窓が排除されました。
| v8.9.6.2(脆弱) | v8.9.6.4(修正済み) | |
|---|---|---|
| HMACチェック | トリガー時にディスクを再読み取り | 起動時に解析と同じバイトを検証 |
| コマンドのソース | 起動時に読み込まれたメモリ | 起動時に検証されたメモリ |
| TOCTOUの窓 | 起動 → トリガー | 排除 |
| 時刻 | イベント | 状態 |
|---|
| T+0.0秒 | 攻撃者が悪意のあるshortcuts.xmlを書き込む | disk=悪意 |
| T+0.0秒 | 攻撃者がNotepad++を起動 | disk=悪意 |
| T+0.1秒 | Notepad++がshortcuts.xmlを読み取り → _userCommands[0]="calc.exe" | mem=悪意 |
| T+4.2秒 | Notepad++の読み込みが完了 | mem=悪意 |
| T+4.2秒 | 攻撃者が正当なshortcuts.xmlを復元 | disk=正常 / mem=悪意 |
| T+4.7秒 | 攻撃者がWM_COMMAND(21000)を送信 | |
| T+4.7秒 | HMACチェック: ディスクから正当なファイルを読み取り → 成功 | CHECK OK |
| T+4.7秒 | 実行: メモリから_userCommands[0]を読み取り → calc.exe | エクスプロイト |
| T+4.7秒 | calc.exeが起動(PID 35932) | 確認済み |
| 種別 | 任意コマンド実行 |
| 管理者権限の必要性 | 不要 |
| UACプロンプト | なし |
| 検出可能性 | 低 — ディスクには常に正当なファイルが表示され、ペイロードはメモリのみに存在 |
| CVSS(推定) | AV:L / AC:H / PR:L / UI:N / S:U / C:H / I:H / A:H |