CI / lint (push) Successful in 3s
CI / extension-version (push) Successful in 2s
Build images / build-agent (push) Successful in 7s
CI / frontend-build (push) Successful in 24s
CI / backend-lint-and-test (push) Failing after 53s
extension / lint (push) Successful in 22s
Build images / build-ml (push) Successful in 2m10s
CI / integration (push) Failing after 2m33s
Build images / sign-extension (push) Successful in 5m33s
Build images / build-web (push) Successful in 1m7s
Build images / smoke-web (push) Skipped
Build images / promote (push) Skipped
Ships with the switch-off rather than with the code removal: a doc that promises a platform the product refuses is the Install and Public Surface area's characteristic defect. pixiv comes out of README (twice), SECURITY.md (twice), .env.example and the compose header. The stored-credential warnings now name Patreon and SubscribeStar - the accounts that usually carry a payment method. One correction beyond pixiv. README said FabledCurator follows creators on Patreon, SubscribeStar, Pixiv "and anything gallery-dl supports". That was already false: a platform not in the registry is rejected, however capable gallery-dl is. It now names the real set, which rule 171 records: Patreon, SubscribeStar, Discord and HentaiFoundry. The 3422 docs guards still hold - the key path and bootstrap variable are untouched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SHQB1YukL3VyvMK8rcbmV9
78 lines
3.9 KiB
Markdown
78 lines
3.9 KiB
Markdown
# Security Policy
|
|
|
|
## Reporting a vulnerability
|
|
|
|
**Please do not put vulnerability details in a public issue.**
|
|
|
|
This project has no private disclosure channel yet. Until it does, open an
|
|
issue on the repository that says only that you have a security report — no
|
|
reproduction steps, no affected endpoint, no payload — and a maintainer will
|
|
reply with a private contact to send the details to.
|
|
|
|
That is a deliberately awkward first step, and it exists because the
|
|
alternative is worse: an issue tracker is public the moment it is written to,
|
|
and every self-hosted instance stays vulnerable until its operator has had a
|
|
chance to update.
|
|
|
|
Please include, once you have a private channel:
|
|
|
|
- what an attacker can do, and what access they need to start
|
|
- the version or commit you tested
|
|
- reproduction steps
|
|
|
|
## Scope — what this software actually handles
|
|
|
|
FabledCurator is self-hosted and holds things worth stating plainly, because
|
|
they shape what counts as a serious bug here:
|
|
|
|
- **Platform credentials.** The app captures and stores session cookies for
|
|
third-party subscription sites (Patreon, SubscribeStar) so it can
|
|
download on the operator's behalf. These are live credentials for accounts
|
|
that usually carry a payment method. Anything that discloses them, decrypts
|
|
them, or lets one user of a shared instance read another's is high severity.
|
|
- **An extension API key.** The Firefox extension authenticates to the backend
|
|
with a shared key. Anything that leaks it or lets it be bypassed is a way in.
|
|
- **No authentication of its own.** This is the most important thing on this
|
|
page. FabledCurator has no login, no user accounts and no permission model —
|
|
there is no `User` table and no session auth anywhere in the backend. Every
|
|
HTTP client that can reach the port is the administrator, with full read and
|
|
write access to everything above, including the stored platform credentials.
|
|
Access control is entirely the operator's job, done at the network layer.
|
|
Reports that an unauthenticated caller can reach an endpoint are therefore
|
|
describing the design; reports that something *crosses the network boundary
|
|
the operator drew* — an SSRF, a request forgery that rides a browser the
|
|
operator already has open, a path that leaks state to an origin the operator
|
|
did not authorise — are in scope and are serious.
|
|
- **Arbitrary media from the internet.** Downloaded files are decoded, hashed,
|
|
thumbnailed and fed to ML models. Anything that turns a hostile file into
|
|
code execution is in scope.
|
|
|
|
## Deployment posture — read this before reporting
|
|
|
|
FabledCurator is designed to run **inside a private network, over plain HTTP,
|
|
reachable only by its operator**. It does not terminate TLS, redirect to
|
|
HTTPS, or set HSTS; if you want transport security, terminate it at your
|
|
reverse proxy. It also does not authenticate anyone — see above. These are
|
|
documented design decisions, not oversights.
|
|
|
|
Putting this on the public internet, with or without TLS, hands whoever finds
|
|
it your Patreon and SubscribeStar sessions. A reverse proxy that adds
|
|
TLS but not an authentication layer does not change that.
|
|
|
|
Reports that reduce to "the application is served over HTTP", "there is no
|
|
HSTS header", or "the API needs no credentials" describe those decisions
|
|
rather than vulnerabilities. Reports that the operator can cause the software
|
|
to do something destructive are usually also by design — the operator is the
|
|
administrator of their own instance.
|
|
|
|
What remains in scope is everything that crosses a boundary the software is
|
|
actually supposed to hold: between untrusted downloaded content and the host,
|
|
between a third-party origin and an operator's open browser session, and
|
|
between the credentials at rest and anything that is not the operator.
|
|
|
|
## Supported versions
|
|
|
|
Fixes land on the `main` branch and reach the `:latest` image. There are no
|
|
maintained release branches — the supported version is the current one, and
|
|
the remedy for a security issue is to update.
|