SECURITY.md
Rama main · réplica de lectura del repositorio original.
# Security
**English** · [Polski](SECURITY.pl.md) · [Deutsch](SECURITY.de.md) · [Español](SECURITY.es.md)
> [!IMPORTANT]
> The English text is the authoritative one. A translation is a convenience, and
> where the two disagree, report the vulnerability against what this file says.
## Reporting a vulnerability
Email: **kacper.wlodarczyk@vstorm.co** (or open a private security advisory on the repo). Please include:
- Affected version / commit
- Steps to reproduce
- Impact assessment (data exposure / privilege escalation / DoS / …)
We aim to acknowledge within 48h and ship a fix within 7 days for high-severity issues.
---
## Security model
The threat model, the data-flow statement (what leaves the deployment and to
whom), what is encrypted where, and the controls matrix — each control mapped to
the mechanism that satisfies it and the test that holds it true — live in one
copy on the [Security](https://vstorm-co.github.io/agenticos/security/) page
(`docs/security.md`). This file keeps only the two things a repository's
`SECURITY.md` is read for: how to report a vulnerability, above, and the
production hardening checklist, below. Where personal data lives and what a
deletion reaches is [Data protection](docs/data-protection.md); the components
the images ship and their licences are [Licences](docs/licenses.md).
## Hardening checklist for production
- [ ] Rotate `SECRET_KEY` and `API_KEY` from generated defaults.
- [ ] Set `DEBUG=false` and `ENVIRONMENT=production`.
- [ ] Restrict `CORS_ORIGINS` to your domain(s).
- [ ] Tune `RATE_LIMIT_RUN_PER_MINUTE` / `RATE_LIMIT_EMBED_PER_MINUTE` in `.env`.
- [ ] Review the rate limits on every public surface — the embed widget's
messages-per-visitor limit and each channel bot's per-sender
`rate_limit_rpm`. The console's own routes are not metered, except writes to
Virtual Tables, which count against `RATE_LIMIT_TABLE_WRITES_PER_MINUTE`.
- [ ] Review the Virtual Tables limits (`TABLES_MAX_PER_ORGANIZATION`,
`TABLES_MAX_RECORDS_PER_TABLE`, `TABLES_MAX_RECORD_BYTES`) and the retention of
their receipts, outbox and history (`TABLES_RECEIPT_TTL_HOURS`,
`TABLES_OUTBOX_RETENTION_DAYS`, `TABLES_HISTORY_RETENTION_DAYS`).
- [ ] Behind a proxy or CDN, set `RATE_LIMIT_TRUST_FORWARDED_FOR=true` **and**
make sure the API is not also reachable directly — otherwise every
visitor shares one bucket, or the header can be forged. The limiter reads
the rightmost `X-Forwarded-For` hop (the one your proxy appended), so put
exactly one trusted proxy in front; with two, collapse the header to a
single hop at your edge.
- [ ] Enforce HTTPS at the proxy layer.
- [ ] Run `pip-audit` / `bun audit` in CI for dependency vulnerabilities.
- [ ] Configure database backups + restore test schedule.
## Known limitations
- **No 2FA / MFA** out of the box.
- **No SAML / OIDC** beyond Google OAuth. Enterprise SSO needs custom IdP integration.
- **No automatic PII redaction** in logs — be careful what you log.