Vulnerable packages at v26.16.0: System.Security.Cryptography.Pkcs 9.0.4 (High, transitive) and ImageSharp 3.1.12 (Moderate) #929
Open
opened 2026-10-22 08:15:52 +02:00 by timothy
·
5 comments
No Branch/Tag Specified
main
renovate/meziantou.analyzer-3.x
renovate/nuget-sixlabors.imagesharp-vulnerability
913-scripted-playout-401
929-vuln-pkcs-imagesharp-v4
renovate/dotnet-monorepo
release/v26.15.0-notes
renovate/lucene.net
renovate/cliwrap-3.x
issue-806-guard-populations
scratch/767b-poisoned
scratch/767b-control
release/v26.14.0-notes
release/v26.14.0
renovate/sqlitepclraw.bundle_e_sqlite3-3.x
docs/510-skill-logo-bug-policy
fix/510-watermark-resolution-policy
fix/629-verdict-classifier-falseopens
fix/609-decisions-edit-token-scope
issue-135-clear-to-none
release/v26.12.0-notes
fix/409b-lastscan-api-parity
fix/401-updatechannel-mirror-422
fix/327-playlist-rename-validation
fix/410-scancancel-log-level
fix/409-447-librariesscreen-neverscanned
fix/338-zap-exit-code
fix/367-plex-budget-message
fix/310-debom-legacy-cs
ci/604-lane-rebalance
feat/388-design-mirror
feat/247-test-ownership
feat/247-primary-action
feat/357-player-owned-playback
feat/357-jellyfin-plugin-poc
fix/289-mcp-hardening
issue58-mcp
feat/244-channels-extract
ci/auto-bump-prod-compose
feat/multi-rerun-collections-api
feat/collections-api
feat/quick-wins
feat/185-docs-part2
feat/140-collections-screen
feat/146-channel-edit
feat/147-classic-ui-link
issue22-renovate-dashboard
feat/91-cutover
feat/63-composite-create
feat/65-library-browse
feat/85-epg
feat/86-schedule-editor
feat/109-dashboard-data
feat/99-session-tracking
fix/dockerfile-node-tag
feat/59-spa-foundation
docs/59-ui-redesign-brief
feat/102-json-guide
feat/111-schedule-durations
feat/104-artwork-upload
feat/103-media-sources-api
feat/playouts-read-api
feat/108-health-api
feat/105-picker-list-endpoints
issue-97-channel-state-api
issue42-jellyfin-musicvideos
issue46-rest-api-error-contract
dependabot/nuget/ErsatzTV.FFmpeg.Tests/multi-d307a2e06f
qsv-improvements
hdr-vulkan-cuda-test
v26.16.0
v26.15.0
v26.14.0
v26.13.0
v26.12.0
v26.11.0
v26.10.0
v26.9.0
v26.8.0
v26.7.0
blazor-final
v26.6.0
v26.5.0
v26.4.0
v26.3.1
v26.3.0
v26.2.0
v26.1.1
v26.1.0
v25.9.0
v25.8.0
v25.7.1
v25.7.0
v25.6.0
v25.5.0
v25.4.0
v25.3.1
v25.3.0
v25.2.0
v25.1.0
v0.8.8-beta
v0.8.7-beta
v0.8.6-beta
v0.8.5-beta
v0.8.4-beta
v0.8.3-beta
v0.8.2-beta
v0.8.1-beta
v0.8.0-beta
v0.7.9-beta
v0.7.8-beta
v0.7.7-beta
v0.7.6-beta
v0.7.5-beta
v0.7.4-beta
v0.7.3-beta
v0.7.2-beta
v0.7.1-beta
v0.7.0-beta
v0.6.9-beta
v0.6.8-beta
v0.6.7-beta
v0.6.6-beta
v0.6.5-beta
v0.6.4-beta
v0.6.3-beta
v0.6.2-beta
v0.6.1-beta
v0.6.0-beta
v0.5.8-beta
v0.5.7-beta
v0.5.6-beta
v0.5.5-beta
v0.5.4-beta
v0.5.3-beta
v0.5.2-beta
v0.5.1-beta
v0.5.0-beta
v0.4.5-alpha
v0.4.4-alpha
v0.4.3-alpha
v0.4.2-alpha
v0.4.1-alpha
v0.4.0-alpha
v0.3.8-alpha
v0.3.7-alpha
develop
v0.3.6-alpha
v0.3.5-alpha
v0.3.4-alpha
v0.3.3-alpha
v0.3.2-alpha
v0.3.1-alpha
v0.3.0-alpha
v0.2.5-alpha
v0.2.4-alpha
v0.2.3-alpha
v0.2.2-alpha
v0.2.1-alpha
v0.2.0-alpha
v0.1.5-alpha
v0.1.4-alpha
v0.1.3-alpha
v0.1.2-alpha
v0.1.1-alpha
v0.1.0-alpha
v0.0.62-alpha
v0.0.61-alpha
v0.0.60-alpha
v0.0.59-alpha
v0.0.58-alpha
v0.0.57-alpha
v0.0.56-alpha
v0.0.55-alpha
v0.0.54-alpha
v0.0.53-alpha
v0.0.52-alpha
v0.0.51-alpha
v0.0.50-alpha
v0.0.49-prealpha
v0.0.48-prealpha
v0.0.47-prealpha
v0.0.46-prealpha
v0.0.45-prealpha
v0.0.44-prealpha
v0.0.43-prealpha
v0.0.42-prealpha
v0.0.41-prealpha
v0.0.40-prealpha
v0.0.39-prealpha
v0.0.38-prealpha
v0.0.37-prealpha
v0.0.36-prealpha
v0.0.35-prealpha
v0.0.34-prealpha
v0.0.33-prealpha
v0.0.32-prealpha
v0.0.31-prealpha
v0.0.30-prealpha
v0.0.29-prealpha
v0.0.28-prealpha
v0.0.27-prealpha
v0.0.26-prealpha
v0.0.25-prealpha
v0.0.24-prealpha
v0.0.23-prealpha
v0.0.22-prealpha
v0.0.21-prealpha
v0.0.20-prealpha
v0.0.19-prealpha
v0.0.18-prealpha
v0.0.17-prealpha
v0.0.16-prealpha
v0.0.15-prealpha
v0.0.14-prealpha
v0.0.13-prealpha
v0.0.12-prealpha
v0.0.11-prealpha
v0.0.10-prealpha
v0.0.9-prealpha
v0.0.8-prealpha
v0.0.7-prealpha
v0.0.6-prealpha
v0.0.5-prealpha
v0.0.4-prealpha
v0.0.3-prealpha
v0.0.2-prealpha
v0.0.1-prealpha
Labels
Clear labels
ad-hoc
api
bug
ci-cd
content
dependencies
enhancement
frontend
in-progress
jellyfin
parked
priority: high
priority: low
priority: medium
review
security
One-off / ad-hoc work not tracked by a dedicated issue
REST API / HTTP endpoints
Something isn't working
Build, test, deploy pipeline
Channel content / schedules / playlists
Dependency updates (Renovate)
New feature or improvement
ChicoryTV React SPA frontend
Claimed by an active session — do not pick up
Jellyfin tuner / IPTV integration
Excluded from automatic queue pickup; work only when explicitly selected
Adversarial review finding
Security / vulnerability fix
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: timothy/ersatztv#929
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
dotnet list ErsatzTV.sln package --vulnerable --include-transitive, run 2026-10-22 as part of the v26.16.0 release cut, reports two advisories. Both were published after v26.15.0 and are present in that prod build too, so v26.16.0 ships them unchanged rather than introducing them.System.Security.Cryptography.Pkcs9.0.4 (transitive)EFCore.BulkExtensions9.0.2 →.Oracle/.SqlServer→Oracle.ManagedDataAccess.Core23.9.0 (dotnet nuget why)SixLabors.ImageSharp3.1.12 (direct)Reachability (unmeasured)
Done-when
System.Security.Cryptography.Pkcsresolves to >= 9.0.21 in every project. Via a central transitive pin (CentralPackageTransitivePinningEnabled+<PackageVersion>), or by dropping the unused Oracle/SqlServer BulkExtensions providers if the core package allows it. The vulnerable scan no longer lists it.dotnet list package --vulnerable --include-transitiveclean, or every remaining entry justified in the PRrefs #924 (found during the v26.16.0 cut)
Claimed by an orchestrated slot: branch
929-vuln-pkcs-imagesharp-v4, worktree/Users/timothy/orca/workspaces/ersatztv/wt-929. Plan: central transitive pin for System.Security.Cryptography.Pkcs >= 9.0.21, ImageSharp -> 4.x (supersedes Renovate PR #923), pixel/md5 comparison of logo + watermark output 3.x vs 4.x.Implementation status (slot worktree
/Users/timothy/orca/workspaces/ersatztv/wt-929, branch929-vuln-pkcs-imagesharp-v4, not pushed yet; review pending).Pkcs: done.
System.Security.Cryptography.Pkcs9.0.21 is now a direct reference inErsatzTV.Infrastructure.csproj, following the existing Microsoft.OpenApi / SQLitePCLRaw pattern. All 11 projects resolve 9.0.21, and the scan no longer lists it. The central transitive pin was tried and rejected:CentralPackageTransitivePinningEnabledfails restore with NU1109 in every project, becauseMicrosoft.Extensions.DependencyModelis exact-pinned at[8.0.2], below the>= 9.0.xthat EF Core requires.ImageSharp: the issue's premise does not hold. 4.1.2 is not a drop-in bump.
SixLabors_ValidateLicenseMSBuild target. It fails a Release build when no Six Labors license key is set (measured:dotnet build -c ReleaseerrorsNo Six Labors license foundon 3.2.0 and 4.1.3; Debug only warns). CI and the Docker image build Release, so #923 as it stands would turn every PR red. 3.1.12 has no such target. The license text itself is byte-identical across these versions.security.imagesharp-3x-tiff-decoder-disabled.dependency-scan.ymlstays red on ImageSharp.dotnet list --vulnerableignoresNuGetAuditSuppress(measured), so suppressing the advisories cannot turn it green.SixLaborsLicenseKey), then bump and re-measure the #511 decoder behaviours.Live E2E (local, port 8500, origin/main
e919b925fvs branch): a PNG watermark rendered through/ffmpeg/stream/929gives an identical frame md5 (fb1a68cb…, 64x64 red block at 96,54) on both builds. A channel logo URL pointing at a TIFF is 201 on main and 422 on the branch, and the 422's decoder list has no TIFF. A PNG logo URL is 201 on both.Live E2E re-run on the branch head after review (local, port 8500, 2026-10-27,
ETV_UI_PORT=8500 scripts/e2e-local.sh <fresh CONFIG_DIR>, same assets for both builds, asset server on 127.0.0.1:8501).Base vs branch. The branch keeps ImageSharp 3.1.12, so there is no 4.x output to compare. What changed for rendering is the decode call sites. The base build is the branch with
RemoteImageValidator.csandImageElementBase.cschecked out from origin/maine919b925f, which restores the default-configuration decodes. That build answers a TIFF logo URL with 201, so it really is the old decode path. The branch answers 422, and the decoder list in the response has no TIFF.Channel logo render. Each channel's logo was saved from a URL, which goes through
RemoteLogoCacher->RemoteImageValidator. It was then drawn on stream by aChannelLogowatermark through the graphics engine (ImageElementBase). The first video frame of/ffmpeg/stream/<n>?mode=ts-legacywas decoded to rgb24 and hashed:7b2c924130b8616ff33d3a73da0451b7a8d915f67898fe4145a2c810fa972cfb92dbe332…(= source)7b2c924130b8616ff33d3a73da0451b7a8d915f67898fe4145a2c810fa972cfb92dbe332…(= source)277e232fb023f90e6ef73b164908ed1d453416fb9227b99c0a763f83a4ef211eac20d212…(= source)277e232fb023f90e6ef73b164908ed1d453416fb9227b99c0a763f83a4ef211eac20d212…(= source)The logo is visibly composited at (96,54) on both builds: a pixel inside it reads (36,6,60) for PNG and (25,4,59) for JPEG, against a (26,65,129) background.
/iptv/logos/gen?text=E2E929is5f215b44…on both.Watermark render. A custom PNG watermark (64x64 red) gives frame md5
fb1a68cb29a6afab3325c641ec738f79on both builds, with the red bbox at (96,54)-(159,117) and 4096 red pixels.Done
What was done: Adversarial correctness/security review of
bd24d21e23f363da3fc5ea5262b78671172d495ausinggit diff origin/main...HEAD. Blocking: none. Should-fix: none. Nit: none. VERDICT: merge.Root cause: Existing vulnerable dependencies; Pkcs is overridden directly and ImageSharp remains under the explicitly accepted dated TIFF-disabled exception.
Files changed: None; inspection only. No commit or push.
Verification: All 17 solution project assets exist; Pkcs resolves to 9.0.21 in all 11 containing it and is absent from six. Recorded gate-r2 logs show Infrastructure.Tests 123 passed and Architecture.Tests 12 passed.
vuln-r2.txtlists only the six ImageSharp advisories covered by the record. TIFF exclusion is behavior-tested and decode/configuration/forbidden API use is checked in compiled production IL. The gwg2 ICC runtime half is honestly labelled as ImageSharp 3.1.12 behavior; tests preserve the profile across validator/clone/resize/CloneAs, enforce an allocation ceiling, and prove the hostile fixture with an Entries-allocation positive control. The carrier-roundtrip limitation and watermark allocation-only limitation are explicit. No fresh dotnet run because this sandbox cannot run it; no PR exists, neither is a defect.Deferred: Provision Six Labors licensing and upgrade ImageSharp per the existing record. This review does not close the implementation issue.
Follow-up issues: None added.
Docs updated: None; reviewed
docs/decisions/records/security/imagesharp-3x-tiff-decoder-disabled.md, especially lines 44-94.Closing record
PR: http://192.168.1.95:3000/timothy/ersatztv/pulls/934 (head
bd24d21e2, supersedes Renovate #923). Not closed by this slot; the orchestrator closes #923 and ticks Done-when after merge.What was done: Pkcs pinned to 9.0.21 via a direct reference in ErsatzTV.Infrastructure; ImageSharp held at 3.1.12 with TIFF decoding removed from the one decode configuration (
ImageSharpDecoding), under decision recordsecurity.imagesharp-3x-tiff-decoder-disabled; IL-scan architecture tests plus allocation-pinned ICC tests enforce the bounds; Renovate holds ImageSharp on 3.1.x.Gate (head
bd24d21e2): Release build 0 errors; all .NET test projects green (Infrastructure 136, ErsatzTV.Tests 2142, Core 720, Scanner 1504, FFmpeg 83, Mcp 61, Architecture 12); vitest 1371; pytest 1599. Output: /private/tmp/claude-501/-Users-timothy-ersatztv/f9ce6bc6-5b36-491a-8d72-89c1f70dd3e1/scratchpad/e2e929/gate-bd24d21e23f363da3fc5ea5262b78671172d495a.txtVulnerable scan: only SixLabors.ImageSharp 3.1.12 remains (6 advisories), each justified in the record table.
Done-when evidence
dotnet list ErsatzTV.sln package --vulnerable --include-transitiveno longer lists Pkcs (gate file); direct reference in ErsatzTV.Infrastructure.csproj + Directory.Packages.props. Note the box's suggested mechanism (transitive pinning) was tried and fails NU1109; the direct reference achieves the outcome.docs/decisions/records/security/imagesharp-3x-tiff-decoder-disabled.md(the OR branch);ImageSharpSurfaceTestsandImageSharpDecodingTestsgreen in the gate file; live-E2E at comment 34502.scripts/post-review-verdict.sh 934still to be run by the orchestrator on the head.