AltsManager is designed to be self-hosted and handles sensitive financial and tax data (ownership records, transactions, K-1s and other tax documents). We take security issues seriously and appreciate responsible disclosure.
Please do not open a public GitHub issue for security vulnerabilities. Instead, report them privately using GitHub Security Advisories for this repository, or by emailing info@altsmanager.com.
Include as much detail as you can:
- A description of the vulnerability and its potential impact
- Steps to reproduce (a minimal repro is ideal)
- Any relevant logs, screenshots, or proof-of-concept code
We'll acknowledge your report, investigate, and keep you updated as we work toward a fix. Once a fix is released, we'll credit you (unless you'd prefer otherwise) in the release notes.
This project is pre-1.0 and under active development. Only the main branch
receives security fixes; there are no maintained release branches yet.
This is a good-faith summary of the current design, intended to help self-hosters make informed decisions — not a guarantee of fitness for any particular threat model.
- Single-tenant authorization. Any authenticated user can read all
entities, investments, transactions, and documents in the instance; write
access is gated by role (
ADMIN/STAFF), not by per-user data ownership. This matches the intended self-hosted, single-household/single-organization use case. If you add multiple unrelated users to one instance expecting per-user data isolation, that isolation does not currently exist. - No signup endpoint by design. The first admin is bootstrapped via
scripts/create_admin.py; additional users are created by an existing admin. - Sessions are stateless JWTs in an httpOnly,
SameSite=Laxcookie with a short default expiry (60 minutes). There is no server-side revocation list, so a stolen token remains valid until it expires or theSECRET_KEYis rotated. SECRET_KEYmust be a unique, random value in production — the app refuses to start with the placeholder default whenENVIRONMENT=production. Rotating it invalidates all existing sessions.- Login attempts are rate-limited per-process, not across a multi-worker or multi-instance deployment. If you run several API workers behind a load balancer, consider pairing this with rate limiting at the edge (reverse proxy/WAF).
