unarr/SECURITY.md
Deivid Soto ca7de23a56
Some checks failed
Release / release (push) Failing after 0s
Release / docker (push) Has been skipped
Release / virustotal (push) Failing after 0s
feat(stream)!: retire WebRTC, HLS-only, bump 0.9.4
Drops the custom WebRTC DataChannel pipeline + pion deps + WSS signaling
client + wire framing. Every in-browser playback now uses HLS over HTTP
from the daemon (Tailscale/LAN/UPnP). Browser P2P never re-enabled.

Wire renames (incompatible with web < 2026-05-26): agent.WebRTCSession
=> agent.StreamSession, SyncResponse.WebRTCSessions (JSON: webrtcSessions)
=> StreamSessions (JSON: streamSessions). MIN_AGENT_VERSION is bumped
to 0.9.4 on the web side so older agents see an upgrade card.

Also fixes the libx264 'VBV bitrate > level limit' abort by clamping
the encoder bitrate to the effective output height instead of the
requested label (carried over from the prior 0.9.3 unreleased work).

The seed_file vertical (mode=seed_file handler + engine.SeedFile) was
retired with the in-browser P2P player. [downloads.webrtc] config block
deleted; existing TOML files with the section still parse fine.
2026-05-26 18:04:35 +02:00

4 KiB

Security Policy

Supported Versions

Version Supported
latest
< latest

Only the latest release receives security updates.

Reporting a Vulnerability

Please do NOT report security vulnerabilities through public GitHub issues.

Instead, report them via GitHub Security Advisories:

  1. Go to Security Advisories
  2. Click "Report a vulnerability"
  3. Fill in the details

Alternatively, email security@torrentclaw.com with:

  • Description of the vulnerability
  • Steps to reproduce
  • Potential impact
  • Suggested fix (if any)

Response Timeline

  • Acknowledgment: within 48 hours
  • Initial assessment: within 5 business days
  • Fix and disclosure: coordinated with reporter, typically within 30 days

Scope

The following are in scope:

  • Command injection or arbitrary code execution
  • Path traversal or file access outside intended directories
  • Authentication bypass or credential exposure
  • Denial of service in the daemon
  • Dependency vulnerabilities with exploitable impact

The following are out of scope:

  • Vulnerabilities in torrent protocol itself (BitTorrent DHT, peer exchange)
  • Issues requiring physical access to the machine
  • Social engineering attacks

Security Practices

This project follows these security practices:

  • No hardcoded credentials — API keys stored in config files with 0600 permissions
  • Path traversal protection — All file operations validated through safePath()
  • HTTPS by default — All API communication uses TLS
  • Response size limits — API responses capped at 1MB
  • Non-root Docker — Container runs as unprivileged user (UID 1000)
  • Dependency scanning — Automated via Dependabot

Container Image Vulnerability Scanning

The Docker image (torrentclaw/unarr) is scanned by Docker Scout on Docker Hub and by a CVE gate in CI (see .github/workflows/). Two things matter when reading the Docker Hub vulnerability count:

  • Scanner database differs. Docker Hub (Scout) matches package@version against NVD/GHSA. Trivy/Alpine secdb only lists CVEs Alpine has acknowledged and patched. A high Scout count with a clean Trivy report is expected, not a contradiction.
  • The bulk comes from the bundled ffmpeg codec stack. Alpine's ffmpeg package pulls ~40 codec/parser libraries (x264, x265, libvpx, aom, dav1d, libtheora, libvorbis, libwebp, libbluray, libopenmpt, …). Each carries a long NVD history that Alpine does not backport. ffmpeg is a functional dependency — the HLS transcode pipeline shells out to ffmpeg/ffprobe to decode untrusted media and re-encode to H.264 + AAC.

Accepted risk and policy

  • Fixable CRITICAL/HIGH findings block a release (CI CVE gate, only-fixed).
  • Unfixed-upstream codec CVEs are tracked but accepted: there is no patched Alpine package to move to, and dropping codecs would break playback of common formats. They are mitigated by the hardening below rather than eliminated.
  • Images are rebuilt and re-pushed weekly (scheduled workflow) so any newly fixed base/ffmpeg/Go patch lands between tagged releases.

Mitigations (run the container hardened)

Crafted media (torrents are untrusted input) is the realistic attack vector against ffmpeg's parsers. The shipped docker-compose.yml already applies:

  • Non-root user (UID 1000), read-only root filesystem, writable tmpfs only.
  • Resource limits (memory/CPU) to bound a runaway decode.

Recommended additions for exposed deployments:

    cap_drop: ["ALL"]
    security_opt:
      - no-new-privileges:true

If you do not need HLS transcoding, you can run with transcoding disabled to avoid feeding untrusted media to ffmpeg at all.

Disclosure Policy

We follow coordinated disclosure. We will credit reporters in the release notes unless they prefer to remain anonymous.