Files
PowerToys/src/Update
Gordon Lam efc0258cda Validate the update installer before PowerToys.Update launches it (#48903)
## Summary

PowerToys' self-updater downloads the installer into
`%LOCALAPPDATA%\Microsoft\PowerToys\Updates` and then launches it from
`PowerToys.Update.exe` (Stage 2). This makes that launch path more
robust:

- Open the downloaded installer with a read-only share so the file stays
consistent while we inspect and run it.
- Confirm it is a valid, Authenticode-signed **Microsoft** PowerToys
installer (valid signing chain + Microsoft organization) before
executing it. This single chokepoint covers both freshly downloaded and
previously downloaded installers.
- If the check does not pass, log and skip the launch instead of running
an incomplete or invalid file.

## Implementation

- Added `updating::verify_installer_trust` to the shared
`common/updating` library (`installer.h` / `installer.cpp`):
`WinVerifyTrust` for the signing chain, and `CryptQueryObject` /
`CertGetNameString` to confirm the signer's organization is `Microsoft
Corporation`. `Wintrust.lib` / `Crypt32.lib` are linked via `#pragma
comment(lib, ...)`.
- `InstallNewVersionStage2` opens the installer with `FILE_SHARE_READ`,
verifies it, and keeps the handle open across `MsiInstallProductW` / the
bootstrapper launch so the file stays stable during install.

## Validation

- `ApplicationUpdate` and `PowerToys.Update` build clean (x64 Debug).
- Existing updating unit tests pass (30/30).
- Checked end-to-end against real binaries: a Microsoft
Authenticode-signed binary is accepted; a corrupted copy and an unsigned
file are both declined.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Muyuan Li <muyuanli@microsoft.com>
Co-authored-by: Boliang Zhang (from Dev Box) <bozhang@microsoft.com>
Copilot-Session: d168a794-8cce-483d-9c46-10787893dbe2
2026-07-30 16:29:55 +08:00
..