PackageMedic publishes security fixes for the latest stable release line.
Please do not open public issues for suspected vulnerabilities or accidentally exposed credentials. Use GitHub's private vulnerability reporting for GonzMeza/package-medic when available. Include affected versions, reproduction steps, impact, and any proposed mitigation. Do not include live feed tokens or passwords; replace them with inert placeholders.
PackageMedic does not collect telemetry and implements no advisory service of its own. The default doctor workflow runs dotnet restore, and audit/--audit delegates to the active SDK's official NuGet vulnerability command; both operations may contact feeds configured by the user. Use doctor --no-restore without --audit when network access is not acceptable. diff applies the same restore/audit choice to both compared graphs while isolating their NuGet package, HTTP, plugin, CLI-home, and temporary caches. simulate performs two independently cached restores and any explicitly requested audits; private-feed variables are inherited only when named with repeatable --credential-env options and their values are registered for output redaction.
The repository commits NuGet content-hash lockfiles and restores them in locked mode in CI. The website uses exact direct npm versions, an integrity-checked lockfile, installation with dependency lifecycle scripts disabled, registry-signature verification, known-vulnerability auditing, and automated dependency update checks. Third-party GitHub Actions are pinned to immutable commits and updated through Dependabot.
Project discovery does not follow nested symbolic links or junctions. When the CLI supplies an analysis root, direct targets and projects referenced by solution files must stay inside it without traversing reparse points. Projects discovered beside a single solution but omitted from it receive their own restore target. Inaccessible directories and missing solution projects produce operational errors rather than partial clean scans. Git snapshots treat tracked symlinks as inert files; reject non-canonical, traversing, platform-ambiguous, or archive-transformed paths; preserve committed executable mode on Unix; and enforce archive, entry, single-file, expanded-size, free-space, and extraction-time boundaries.
Dependency Time Machine requires a clean tree and materializes two independently owned snapshots of the same immutable commit. It validates the selected declaration and source SHA-256 before mutation, revalidates the mutation after restore, preserves bytes outside the exact version value, refuses ambiguous or unsafe declarations, respects locked restore, rejects archive-transforming Git attributes, deletes only marker-owned snapshot roots without following links, and rechecks the original worktree before reporting. Child dotnet and git executables are resolved from canonical host paths outside the repository and snapshots; isolated homes, package caches, HTTP caches, plugin caches, and temporary directories are never shared between baseline and candidate. Snapshot and process-state isolation is not an operating-system sandbox: restore and MSBuild still execute repository-controlled logic with the caller's permissions and can contact configured feeds. An explicitly inherited credential is available to that repository logic despite output redaction; use short-lived read-only tokens only for trusted commits, never untrusted fork code. Use a disposable runner or container for untrusted repositories. A simulation pass is restore and dependency-graph evidence only; it is not build, test, runtime, compatibility, or package-safety attestation.
Repository-controlled configuration, baseline, solution, NuGet assets, imported XML location, and GitHub Action report files are bounded before memory-intensive parsing. Assets parsing additionally caps individual JSON tokens and high-cardinality package/source/graph collections before materialization. Configuration exclusion/suppression collections and pattern lengths are also capped. Oversized inputs fail closed with operational errors rather than continuing with partial analysis.
Only the latest stable patch release and the latest source revision receive security fixes.