chore(deps): pin SSH.NET 2026.0.0 to clear GHSA-q939-rpr3-3284 - #519
Merged
Conversation
The NuGet half of the #146 vulnerability gate is failing on main: [nuget] high - SSH.NET@2025.1.0 - GHSA-q939-rpr3-3284 - transitive [nuget] 1 advisory at or above "high". GHSA-q939-rpr3-3284 is high severity: ScpClient's recursive download honours server-controlled SCP filenames, allowing an arbitrary file write. Affected range is <= 2025.1.0; fixed in 2026.0.0. SSH.NET arrives transitively through Testcontainers 4.13.0, which is the latest release and still declares SSH.NET 2025.1.0. So Dependabot has nothing to propose here, and no amount of re-running the update job would produce a PR - lifting the resolved version needs a direct reference in the consuming project, which is what this commit adds. Scope of the exposure: Cluckwork never calls ScpClient. Testcontainers reaches SSH.NET only for remote/SSH Docker hosts, and the fixtures use a local daemon. The dependency is also test-only. This is gate hygiene rather than a live vulnerability - but the gate scans transitives and fails closed, so it blocks every unrelated PR until the resolved version moves. Lock files were regenerated solution-wide so all five agree, since CI restores with --locked-mode. Collateral from the floating version ranges re-resolving, all patch or minor: - ASP.NET Core / EF Core 10.0.10 -> 10.0.11 - Newtonsoft.Json 13.0.3 -> 13.0.4 - BouncyCastle.Cryptography 2.6.2 -> 2.7.0 (required by SSH.NET 2026.0.0) The runtime base image already moved to 10.0.11 in #518, so the managed packages now match it. Verified: - dotnet build Cluckwork.sln - 0 warnings, 0 errors - dotnet test Cluckwork.sln - 1637 passed, 0 failed (1167 integration tests against real Testcontainers/Docker, which is what exercises SSH.NET 2026.0.0 at runtime) - the gate itself: dotnet list package --vulnerable --include-transitive piped through .github/scripts/vuln-gate.mjs now reports 'no advisories at or above "high" (0 excepted, 0 below threshold)' and exits 0
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds a direct
SSH.NET2026.0.0 reference toCluckwork.Api.IntegrationTestsso the transitive pin lifts off the vulnerable version, and regenerates the lock files.Why
The NuGet half of the #146 vulnerability gate is failing on
main— run 31612525602:GHSA-q939-rpr3-3284 is high severity —
ScpClient's recursive download honours server-controlled SCP filenames, allowing an arbitrary file write. Affected<= 2025.1.0, fixed in2026.0.0.Dependabot cannot fix this one. SSH.NET arrives transitively via
Testcontainers 4.13.0, which is the latest release and still declaresSSH.NET 2025.1.0— there is no upstream bump to propose, so re-running the update job produces nothing. A direct reference in the consuming project is the only lever that moves the resolved version.Exposure
Low, and this is gate hygiene rather than a live vulnerability:
ScpClient; Testcontainers reaches SSH.NET only for remote/SSH Docker hosts, and the fixtures use a local daemon.But the gate scans transitives and fails closed by design, so it blocks every unrelated PR until the resolved version moves.
Collateral
Lock files were regenerated solution-wide so all five agree (CI restores with
--locked-mode). The floating version ranges re-resolved; everything is patch or minor:The runtime base image already moved to .NET 10.0.11 in #518, so the managed packages now match it.
Verification
dotnet build Cluckwork.sln— 0 warnings, 0 errorsdotnet test Cluckwork.sln— 1637 passed, 0 failed, including 1167 integration tests against real Testcontainers/Docker, which is what exercises SSH.NET 2026.0.0 at runtimedotnet list package --vulnerable --include-transitivepiped through.github/scripts/vuln-gate.mjsnow reportsno advisories at or above "high" (0 excepted, 0 below threshold)and exits 0No migration, no user-visible behaviour change — no schema-doc or GLOSSARY/Help update applies.
Follow-up
Drop the direct reference once Testcontainers itself depends on
SSH.NET >= 2026.0.0. The<PackageReference>carries a comment saying so.