diff --git a/Proxytrace.Messaging.Tests/Proxytrace.Messaging.Tests.csproj b/Proxytrace.Messaging.Tests/Proxytrace.Messaging.Tests.csproj index 9a59a86f..9a759300 100644 --- a/Proxytrace.Messaging.Tests/Proxytrace.Messaging.Tests.csproj +++ b/Proxytrace.Messaging.Tests/Proxytrace.Messaging.Tests.csproj @@ -15,6 +15,23 @@ + + diff --git a/docs/testing.md b/docs/testing.md index d6efb86d..d8274a0b 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -112,6 +112,29 @@ container inside the test method — no shared fixture, same isolation rule as e and remember these cost seconds, not milliseconds. They are a targeted supplement to the mocked tests, not a replacement for them. +### The SSH.NET pin + +`Proxytrace.Messaging.Tests` carries a direct `PackageReference` to **SSH.NET 2026.0.0** for a +package no code here calls. It arrives transitively — `Testcontainers.Redis` → `Docker.DotNet` → +`SSH.NET`, because Docker.DotNet can reach a daemon over SSH — and every version at or below +**2025.1.0** carries [CVE-2026-48798](https://github.com/advisories/GHSA-q939-rpr3-3284) (high, +CVSS 7.1): `ScpClient.Download()` does not validate server-supplied filenames on a recursive +download, so a malicious server can traverse out of the target directory. + +The exposure is nil — it is a test-only dependency that never ships in a runtime image, and +nothing in this repository downloads over SCP. The *build* breakage was total: NuGet's audit +raises it as `NU1903`, `TreatWarningsAsErrors` promotes it to an error, and the whole solution +build fails, on every branch at once ([#534](https://github.com/NordsteinSoftware/Proxytrace/issues/534)). + +`Testcontainers.Redis` 4.13.0 is the newest release, so there was no upstream bump to take. Drop +the pin once one of its releases resolves SSH.NET ≥ 2026.0.0 on its own — check the transitive +graph with `dotnet list package` (including transitives), delete the line, and confirm +`dotnet restore` stays clean without it. + +This is the same shape as the manual's Vite override (see +[`commands.md`](commands.md#manual-toolchain-vitepress--the-vite-override)): a pin that exists +only to get ahead of a transitive advisory, and that should be deleted rather than maintained. + ## End-to-end tests (Playwright) The e2e suite (repo-root `e2e/`) boots the full stack via Docker Compose (`docker-compose.e2e.yml`).