feat(agent,agent-installer): add policy consent helper - #1982
Benoît Cortier (CBenoit) wants to merge 6 commits into
Conversation
|
Implementation notes:
Note Human-tuned, LLM-assisted content. |
There was a problem hiding this comment.
🟡 Changes recommended
Version parsing and cancellation handling can reject valid callers or return incorrect protocol outcomes.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Adds an elevated Agent policy-consent helper that authenticates UniGetUI and the Agent broker before forwarding policy updates.
Changes:
- Adds the NativeAOT consent helper, protocol, authentication, and tests.
- Restricts broker policy writes to the installed helper.
- Packages, signs, registers, and tests the helper in CI.
File summaries
| File | Description |
|---|---|
package/AgentWindowsManaged/Resources/Includes.cs |
Shares helper discovery constants. |
package/AgentWindowsManaged/Program.cs |
Installs and registers the helper. |
package/AgentWindowsManaged/DevolutionsAgent.csproj |
Links the shared contract. |
package/AgentWindowsManaged.Tests/PackageBrokerInstallerTests.cs |
Tests registry discovery. |
package/AgentPolicyConsent/Protocol.cs |
Defines helper framing and validation. |
package/AgentPolicyConsent/Program.cs |
Implements the helper workflow. |
package/AgentPolicyConsent/PolicyConsentContract.cs |
Defines identity and signer constants. |
package/AgentPolicyConsent/PeerTrust.cs |
Authenticates UI and broker processes. |
package/AgentPolicyConsent/DevolutionsAgentPolicyConsent.csproj |
Configures the NativeAOT executable. |
package/AgentPolicyConsent/BrokerClient.cs |
Forwards policy updates to the broker. |
package/AgentPolicyConsent/app.manifest |
Requires administrator elevation. |
package/AgentPolicyConsent.Tests/ProtocolTests.cs |
Tests protocol and trust behavior. |
package/AgentPolicyConsent.Tests/DevolutionsAgentPolicyConsent.Tests.csproj |
Configures helper tests. |
crates/now-package-broker/src/server/mod.rs |
Applies helper-specific write authentication. |
crates/now-package-broker/src/auth.rs |
Validates the installed helper identity. |
ci/package-agent-windows.ps1 |
Adds the helper to MSI packaging. |
.github/workflows/package.yml |
Signs and repackages the helper. |
.github/workflows/ci.yml |
Builds and tests the helper. |
Review details
- Files reviewed: 18/18 changed files
- Comments generated: 3
- Review effort level: Balanced
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
🔵 Needs a closer look
Helper credential validation does not conform to the canonical policy API character restrictions.
Review details
Suppressed comments (1)
Previously missed (1) — in code that hasn't changed since the last review.
package/AgentPolicyConsent/Protocol.cs:71
- These fields are policy-store credentials, but
IsCredentialaccepts every printable ASCII character after the first one. The canonical policy API restricts store tokens and validation receipts to[A-Za-z0-9._~:-](now-librariesmanagement.rs,PolicyStoreToken/PolicyValidationReceipt), so values containing spaces, quotes, slashes, etc. pass this protocol boundary and are only rejected later by the broker. Apply the canonical character rule here (and to returned store tokens) so malformed helper requests fail as protocol errors rather than entering the privileged write path.
- Files reviewed: 18/18 changed files
- Comments generated: 0 new
- Review effort level: Balanced
There was a problem hiding this comment.
🔵 Needs a closer look
Security-critical native authentication, elevation, protocol, and multi-architecture packaging changes warrant final human review.
Review details
- Files reviewed: 18/18 changed files
- Comments generated: 0 new
- Review effort level: Balanced
67a6419 to
a262d4b
Compare
a262d4b to
c5d59c2
Compare
c5d59c2 to
d2f50f3
Compare
d2f50f3 to
c1f0a22
Compare
Install one protected NativeAOT helper that authenticates retained UniGetUI and Agent process identities before forwarding bounded policy replacement requests. Preserve protocol 2.0 conflict and uncertainty semantics while integrating transactional discovery, signing, and packaging. Issue: #1963 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Require fresh whole-chain WinTrust revocation status before authorizing the UniGetUI parent or Agent broker. Bound broker trust retrieval to the existing exchange timeout and reject all pre-dispatch authentication failures. Issue: #1963 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Authenticate the connected Agent through its retained mapped image and an allowed Devolutions signer before sending policy data. Pin the protected installation directory chain against reparse and untrusted-writer replacement, including custom install locations, and record the evidence behind both UniGetUI signer pins. Issue: #1963 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Preserve timeout responses during broker authentication, accept prerelease UniGetUI versions, and suppress the helper console window. Mark ARM64 discovery registry components as 64-bit so WiX can package them beneath ProgramFiles64Folder. Issue: #1963 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Apply the canonical policy API safe-ASCII character set to helper credentials before a privileged request is dispatched. Issue: #1963 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Accept only current-signed UniGetUI hosts from version 2026.2.7. Remove transition signer discovery while retaining protected helper authorization and ARM64 installer coverage. Issue: #1963 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
c1f0a22 to
d5b9618
Compare
Adds an Agent-installed consent helper that lets supported UniGetUI installations request protected policy updates with explicit elevation consent.
The helper authenticates the running UniGetUI and Agent images, preserves policy validation and conflict semantics, and is installed and discovered through the Agent MSI for both default per-user and all-users UniGetUI deployments.
Issue: #1963