Trust center

Everything that backs the claim lives in the repo.

This is the index. Each entry links to the living document where the real work is kept — no PDFs behind a form, no marketing gloss. If it is not here, it does not exist yet, and this site will not pretend otherwise.

Evidence & artifacts
Process & governance
Test coverage, honestly
305 of 305
implemented requirements with tagged tests
The traceability check fails the merge gate on any implemented requirement without one — this cannot silently regress.
55
approved, not yet built
Backlog requirements carry no tests by definition; they are specified, awaiting implementation.
8 of 15
process rules machine-tested
The rest of the process rules are enforced by git hooks and the merge-gate checklist rather than the test suite.
Not in place yet

Controls this project does not have. Stated here so the evidence above cannot be mistaken for more than it is; each entry cites the committed document that records the deferral or decision.

External penetration test

None has been performed. The roadmap schedules the penetration-test decision — whether, scope, and by whom — at the 1.0 go-live milestone.

docs/roadmap.md
CI-enforced quality gates

Test suites and consistency checks run at every merge gate on the operator’s machine, not in CI; the Pages deploy workflow is the only CI.

docs/process/commit-standard.md
Live dependency-advisory review

Dependency inventory is complete and mechanically verified, but advisory scanning (pip-audit, npm audit) is deferred until network-connected CI exists.

docs/security/soup-register.md
Formal CAPA process

There is no corrective-and-preventive-action log; the known-anomalies register is the nearest current artifact.

docs/security/known-anomalies.md
Risk register
52 risks · rendered from docs/security/risk-register.md
IDRiskLIStatus
RISK-001Arbitrary file read via client-supplied path to an OPDS download/stream endpoint (Mylar `deliverFile` traversal — the headline finding).HHMitigated
RISK-002SQL injection via client-controlled ids/params interpolated into SQL (Mylar `_Comic`/`_StoryArc` string concat).MHMitigated
RISK-003OPDS world-readable and exempt from site auth by default.HMMitigated
RISK-004Weak OPDS auth primitives: plaintext-compared Basic, no TLS enforced, no lockout/rate limit.MMMitigated
RISK-005Zip-bomb / decompression / truncated-image resource exhaustion when the server opens untrusted archives and resizes images (PIL `LOAD_TRUNCATED_IMAGES`) at OPDS feed/stream time.MMMitigated
RISK-006Download filename derived from attacker-controlled redirect-final URL (`unquote` before `basename`); traversal / hostile / device names.MHMitigated
RISK-007Scraped hrefs fetched with session cookies and redirects followed blindly (SSRF to internal addresses; cookie exfiltration; `run.php`/`go.php` URL mutation).MHMitigated
RISK-008`zipfile.extractall` on hostile packs: zip-bombs, `../` traversal entries, symlink tricks; extraction before verification.MHAccepted
RISK-009FlareSolverr call uses `verify=False`; Cloudflare clearance cookies persisted in plaintext (`.gc_cookies.dat`); solver URL is an SSRF pivot.MMMitigated
RISK-010Decompression-bomb / zip-slip / malformed-image exposure on the **import**, **cover-extraction**, and **ComicInfo-tagging** archive paths (DDL/OPDS limits do not cover these).MMMitigated
RISK-011User-editable ComicVine wiki HTML flows into names/aliases/descriptions → stored XSS in UI **and** steers downstream indexer/DDL search queries.MMMitigated
RISK-012`CV_VERIFY` disables TLS certificate verification globally for ComicVine traffic.LMMitigated
RISK-013Secret exposure: CV API key in URL query strings; indexer/SAB keys in logs; Mylar's reversible salted-base64 at-rest obfuscation; secrets in image/repo/diagnostics.MHMitigated
RISK-014Scraped/remote text (DDL series titles/sizes/years, CV fields) written unescaped into logs, DB, UI → XSS + log injection.MMMitigated
RISK-015Single hardcoded DDL upstream (getcomics.org) → domain takeover becomes a malware-delivery channel; CRC does not authenticate content.LHMitigated
RISK-016Cloudflare evasion + spoofed User-Agent + shortener filtering are ToS-sensitive automation choices.MLAccepted
RISK-017Mylar's per-provider proxy applied only to the DDL session (split-tunnel surprise; other traffic ignores the proxy).LLAccepted
RISK-018Hostile filename crashes the parser (Mylar wraps whole passes in bare `except`; no fuzzing).LMMitigated
RISK-019Attacker-influenced ComicVine series/issue titles used to build destination folder/file paths could escape the managed library root (`..`, separators, absolute paths).MHMitigated
RISK-020**M1/M2 ship with NO application auth** on UI/API/OPDS/WebSocket; only compensating control is Tailscale-only exposure.HHMitigated
RISK-021No listener-level request-body-size cap or request rate limit → memory/CPU DoS from large or rapid requests (incl. WebSocket floods).MMMitigated
RISK-022Cross-Site WebSocket Hijacking (unvalidated Origin) and unconsolidated CSRF stance on state-changing endpoints once cookie-session auth exists.LMMitigated
RISK-023Hotlinked ComicVine cover URLs leak iPad/OPDS client requests to a third-party CDN (traffic-analysis / availability coupling).LLMitigated
RISK-024XXE / entity-expansion (billion-laughs) via untrusted XML: Newznab/Torznab RSS responses and any residual CV/OPDS XML; only CBL got a hardening note.MMMitigated
RISK-025SSRF via config-/wiki-supplied outbound URLs: ComicVine cover-image fetch (wiki-editable `ImageURL`), and indexer/SAB/FlareSolverr/pull-source hosts pointed at internal/loopback addresses. DDL allowlist does not cover these.MMMitigated
RISK-026Indexer returns a mislabelled payload (HTML/error page where an NZB is expected) → bad content into the pipeline.LMMitigated
RISK-027Hostile/slow provider (indexer or GetComics) wedges workers or triggers a ban; unbounded pagination walk.MMMitigated
RISK-028Mylar's SAB add-by-URL scheme (SAB pulls the NZB from Mylar's API via a one-time download key) adds a callback auth surface.LMMitigated
RISK-029SAB-reported completed path (remote/foreign) read/moved by the process → path confusion / reading unintended locations.LMMitigated
RISK-030Password-protected / corrupt archives consume resources or slip into the library.LMMitigated
RISK-031Shell script hooks (pre/extra/on-snatch) are a remote-code-execution surface (Mylar feature).LHAccepted
RISK-032Crash/power-loss loses acknowledged work or corrupts queue state → duplicate snatches / double imports (Mylar smears state across globals/DB/memory).MMMitigated
RISK-033Container runs privileged / library volumes owned by root → host-level blast radius.LMMitigated
RISK-034Self-update mechanism (git pull / tarball fetch) is a supply-chain/RCE surface (Mylar feature).LHAccepted
RISK-035ComicVine XML parsing via minidom/expat (entity-expansion unsafe in some configs).LMMitigated
RISK-036ComicVine `requests.get` without a timeout hangs the scheduler thread indefinitely.MMMitigated
RISK-037CBL reading-list import parses untrusted XML from the internet (XXE/entity expansion).LMMitigated
RISK-038Spoofed browser User-Agent to ComicVine (ToS/politeness inheritance).LLMitigated
RISK-039External weekly-pull JSON source (unofficial third party) as an outbound dependency and untrusted-content ingress.LLMitigated
RISK-040Unbounded `import_history` growth from a blocked-item retry loop: a still-completed `import_blocked` item is re-fed to `import_pending` by every ~1-min tracking cycle (the deliberate retry-on-evidence-change path), and each failed retry writes a fresh `import_blocked` history event — a permanently stuck item ping-pongs and accretes ~1.4k rows/day until the user acts.MLMitigated
RISK-041Plaintext provider credentials in database/config backups. Scheduled backups copy the SQLite DB and config file verbatim; both persist ComicVine/Newznab (DogNZB, NZB.su)/SABnzbd keys in plaintext (no encryption-at-rest/secret store yet), so every backup file is credential-bearing.LHMitigated
RISK-042Third-party use of the owner's published, un-revocable ComicVine API key. The key is embedded in `docs/research/Foragerr.dc.html` in public git history (blob `495f29e`, all tags `v0.1.0`–`v0.3.5`); it cannot be rotated or revoked (provider offers neither). Anyone reading history can extract and use it, spoofing the client identity of foragerr's ComicVine traffic.LL-MAccepted
RISK-043`GET /api/v1/log` exposes recent backend log content — including acquisition/indexer activity and any file paths or third-party hostnames that appear in log message text — to any tailnet-position reader before M8 auth.LMMitigated
RISK-044Unauthenticated `PUT`/`DELETE /api/v1/issues/{issue_id}/collections` (FRG-API-022) let any tailnet-position client declare, replace, or delete trade-containment records (FRG-SER-020) for any trade issue.LLMitigated
RISK-045Humble session cookie (`_simpleauth_sess`) stored at rest in the `sources` table's settings JSON.LHMitigated
RISK-046Cookie theft (OS-clipboard residual during the manual DevTools copy-paste connect flow, a compromised operator machine, or exfiltration of the decrypted value) grants an attacker full access to the operator's Humble Bundle account — order history, entitlements, and download rights — indistinguishable from the operator's own logged-in session.LHAccepted
RISK-047Humble order-API responses (`GET /api/v1/user/order`, `GET /api/v1/order/{gamekey}`) are store-controlled, untrusted JSON parsed server-side; a compromised or malicious response could attempt an oversized body, a malformed shape, or hostile string content.LMMitigated
RISK-048Entitlement download fetches a signed, time-limited URL returned by the Humble order API and streams it into the download-staging area; a compromised/hostile response could point the fetch at an arbitrary host (SSRF) or an oversized/slow payload.LMMitigated
RISK-049Malicious RAR archive (decompression bomb, crafted metadata, symlink/traversal members, encrypted or truncated structure) processed by the CBR page-streaming path.MMMitigated
RISK-050The companion browser extension is self-distributed (not store-reviewed); a tampered build could gain reach beyond its stated permissions or copy the Humble cookie somewhere other than the clipboard.LMMitigated
RISK-051The GitHub Pages deploy workflow is the repository's first CI: a compromised or hijacked third-party action could exfiltrate the job token or publish tampered site content (supply chain).LMMitigated
RISK-052Trusted-proxy misconfiguration: an operator who lists a wrong or reachable-by-others address in `trusted_proxies` lets that peer spoof its scheme (forcing/clearing cookie `Secure`) and its client address (defeating rate-limit keying and audit attribution) via forwarded headers.LMMitigated