Skip to content

Specification: PUA Allowlisting with User Warnings#6293

Draft
denelon wants to merge 2 commits into
microsoft:masterfrom
denelon:spec/pua-allowlisting
Draft

Specification: PUA Allowlisting with User Warnings#6293
denelon wants to merge 2 commits into
microsoft:masterfrom
denelon:spec/pua-allowlisting

Conversation

@denelon

@denelon denelon commented Jun 17, 2026

Copy link
Copy Markdown
Collaborator

📖 Description

Specification for a tiered PUA classification system enabling legitimate software (RustDesk, Malwarebytes, etc.) to be published to winget-pkgs with governed allowlisting, client-side warnings, and Group Policy controls. Includes manifest schema extension, validation pipeline changes, and enterprise policy management.

Changes addressing review feedback (June 22):

  • Removed version-specific numbers from headings and schema version reference
  • Rewrote allowlist governance to use the existing waiver system (human validation by Microsoft maintainer via PR label, not a policy bot config or community-maintained YAML file)
  • Fixed --silent behavior: only affects installer switches, does not suppress PUA warnings
  • Added --ignore-warnings support for suppressing PUA warning output
  • Replaced --include-security with existing --details flag for PUA info in show/search/list
  • Clarified PUA categories are derived from various AV vendors (Defender, ESET, K7, Malwarebytes, etc.), not a single source
  • Documented waiver flow: validation pipeline applies label → Microsoft maintainer reviews → waiver granted internally

Authored with GitHub Copilot assistance.

🔗 References

Related Issues:

🔍 Validation

Spec document — no code changes to validate.

✅ Checklist

📋 Issue Type

  • Bug fix
  • Feature
  • Task
Microsoft Reviewers: Open in CodeFlow

Specification for a tiered PUA classification system enabling legitimate
software (RustDesk, Malwarebytes, etc.) to be published to winget-pkgs
with governed allowlisting, client warnings, and GPO controls.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment thread doc/specs/#6189 - PUA Allowlisting.md Outdated
| **Restricted** | Legitimate uses but elevated risk profile | Moderator review required | Strong warning + consent |
| **Blocked** | Confirmed unwanted/malicious | Rejected | N/A |

### Manifest Schema Extension (v1.29.0)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove version

Comment thread doc/specs/#6189 - PUA Allowlisting.md Outdated

### Allowlist Governance

Maintained as `policies/pua-allowlist.yaml` in `winget-pkgs`:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clarify if this file is maintained by automation, or manually. What edit restrictions need to be placed on it at pkgs?

Comment on lines +134 to +137
#### `--silent`:

Warning suppressed entirely. Installation proceeds.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

--silent does not currently control any CLI behavior as far as I'm aware, it only uses the silent installer switches. Confirm if the two behaviors should be mixed

#### `--silent`:

Warning suppressed entirely. Installation proceeds.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing --ignore-warnings

Comment thread doc/specs/#6189 - PUA Allowlisting.md Outdated
| `winget upgrade` | Show PUA warning if upgrading a PUA package |
| `winget show` | Display PUA classification in package details |
| `winget search` | `--include-security` shows PUA flag in results |
| `winget list` | `--include-security` shows PUA flag for installed PUA packages |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not --details ?

Comment thread doc/specs/#6189 - PUA Allowlisting.md Outdated

### Schema Version

Requires manifest schema version 1.29.0 for the `PuaClassification` field.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove version information


## Inspiration

Microsoft Defender's PUA detection flags software based on behavioral categories. While protective for most users, these heuristics also block legitimate software:

@pl4nty pl4nty Jun 20, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Most of the detections I've encountered have been K7 and ESET (via ScanX?), rather than Defender. eg RustDesk is flagged by ESET, Malwarebytes by K7

I'm really glad to see progress on this feature!

- **AnyDesk**, **TeamViewer** portable editions — Flagged under remote access category
- Other legitimate tools — Flagged for system-level access patterns

Their absence from `winget-pkgs` damages credibility and drives users to less-safe acquisition methods (direct downloads from unknown mirrors, Chocolatey community packages without validation).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, sometimes specific versions slip through. winget-pkgs ends up with old or vulnerable versions


| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `Categories` | string[] | Yes | PUA categories detected (enum: see below) |

@pl4nty pl4nty Jun 20, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does ScanX or something else define these categories? At the moment, public contributors just see the detection name, which seems to vary wildly across vendors

Comment thread doc/specs/#6189 - PUA Allowlisting.md Outdated
- Changes require a dedicated PR (not bundled with manifest submissions)
- Minimum 2 moderator approvals for `Allowed` tier
- Microsoft security team sign-off required for `Restricted` tier
- Annual re-review required (ReviewDate must be within 12 months)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would these reviews be triggered automatically, and/or in public?

- Remove version-specific numbers from headings
- Rewrite governance to use waiver system (Microsoft human review, not policy bot)
- Fix --silent: only affects installer switches, not PUA warnings
- Add --ignore-warnings for suppressing PUA warning output
- Replace --include-security with --details (existing flag)
- Clarify PUA categories come from various AV vendors (not just Defender)
- Document waiver flow: label on PR signals Microsoft maintainer to review

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown

@check-spelling-bot Report

🔴 Please review

See the 📂 files view, the 📜action log, or 📝 job summary for details.

Unrecognized words (8)

AGPL
Bundleware
ESET
Keyloggers
Malwarebytes
rustdesk
upvotes
waivered

These words are not needed and should be removed AAD ABCD abi ACL'd AMap Amd appdata ARMNT asan Baz bitmask bluetooth boundparms brk Buf certs cgi CMSG codepage commandline constexpr Cov cswinrt CTL Dbg Dcom decompressor dedupe DEFT devhome Dns dsc ERANGE errcode errmsg errstr filemode Finalizers FULLWIDTH fuzzer GES github Hackathon HINSTANCE hlocal hmac Hyperlink ICONDIR icu idx img inet Intelli iwr JDK LCID lhs LONGLONG LPBYTE LPCWSTR LPDWORD LPSTR LPVOID LPWSTR MAJORVERSION MAXLENGTH maxvalue MDs MINORVERSION mta nlohmann NONAME NOUPDATE NTFS ofile oid oop OPTOUT outfile OUTOFMEMORY PARAMETERMAP pdb PDWORD pid PKCS pkix placeholders positionals posix pscustomobject pseudocode PSHOST publickey qword redirector regexes remoting reparse REQS rhs rowid RTTI runspace runtimes SARL savepoint Scm sid sqlite subdir subkey trimstart ttl typedef uninitialize uninstallation UNMARSHALING userprofile versioned Webserver website wildcards winreg WMI workaround Wpp wsl

To accept these unrecognized words as correct and remove the previously acknowledged and now absent words, you could run the following commands

... in a clone of the git@github.com:denelon/winget-cli.git repository
on the spec/pua-allowlisting branch (ℹ️ how do I use this?):

curl -s -S -L 'https://raw.githubusercontent.com/check-spelling/check-spelling/v0.0.26/apply.pl' |
perl - 'https://github.com/microsoft/winget-cli/actions/runs/27971972268/attempts/1' &&
git commit -m 'Update check-spelling metadata'

Pattern suggestions ✂️ (2)

You could add these patterns to .github/actions/spelling/patterns.txt:

# Automatically suggested patterns

# hit-count: 1 file-count: 1
# assign regex
= /[^*].*?(?:[a-z]{3,}|[A-Z]{3,}|[A-Z][a-z]{2,}).*/[gi]?(?=\W|$)

# hit-count: 1 file-count: 1
# regex choice
\(\?:[^)]+\|[^)]+\)

Alternatively, if a pattern suggestion doesn't make sense for this project, add a # to the beginning of the line in the candidates file with the pattern to stop suggesting it.

Warnings and Notices ⚠️ (2)

See the 📂 files view, the 📜action log, or 📝 job summary for details.

⚠️ Warnings and Notices Count
ℹ️ candidate-pattern 2
⚠️ unexpected-line-ending 2

See ⚠️ Event descriptions for more information.

If the flagged items are 🤯 false positives

If items relate to a ...

  • binary file (or some other file you wouldn't want to check at all).

    Please add a file path to the excludes.txt file matching the containing file.

    File paths are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your files.

    ^ refers to the file's path from the root of the repository, so ^README\.md$ would exclude README.md (on whichever branch you're using).

  • well-formed pattern.

    If you can write a pattern that would match it,
    try adding it to the patterns.txt file.

    Patterns are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your lines.

    Note that patterns can't match multiline strings.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants