Jellyfin AI Upscalerv1.6.1.16

Security model

Threat model, hardening defaults, and the audit trail of fixes that shaped the current posture.

Threat model

The plugin + service combo sits inside your home LAN by default. We assume:

Authentication

Plugin controller (/Upscaler/*)

AI service (:5000)

Never expose :5000 directly to the internet even with a token. Put it behind a reverse proxy that enforces the token at the edge and rate-limits — see Deployment → Reverse proxy.

Input validation

Audit history

Notable security-relevant fixes from the changelog:

VersionFindingFix
v1.6.1.11 /Upscaler/jobs leaked absolute file paths to any authenticated user, not just admins. Endpoint gated with [Authorize(Policy = "RequiresElevation")]. Path strings additionally filtered to show relative segments only.
v1.6.1.9 Model ID regex was permissive, allowed dot-segments without constraints — theoretical path escape. Tightened regex to explicit dot-separated segments: ^[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)*$.
v1.6.1.7 Wrapper-install endpoint accepted arbitrary command strings from the request body. Rewritten to generate a fixed template on the server; request body is ignored.
v1.6.1.4 Service-side /logs-stream SSE exposed full log content without auth when the shared token wasn't set. Moved behind the same token as every other endpoint; health probe remains the only anonymous route.

Hardening checklist (public / semi-public deploys)

  1. Set API_TOKEN to a long random value. Rotate on any suspected leak.
  2. Do not port-forward :5000. Put it behind a reverse proxy and enforce the token at the proxy as well.
  3. Disable FFmpeg Remote Transcoding if you don't use it; the SSH path is a potential sharp edge.
  4. Run the AI service container with read_only: true except for /app/models.
  5. Pin an explicit image tag (kuscheltier/jellyfin-ai-upscaler:v1.6.1.16-cuda), not latest-cuda.
  6. Keep Jellyfin on 10.11.x — older LTS lines don't receive the auth-policy fixes the plugin depends on.
  7. Review the weekly container digest against the published SHA before updating.

Reporting vulnerabilities

For a security issue (not a functionality bug), do not open a public GitHub issue. Instead:

Out of scope