Skip to content

Security: ilhankilic/resilland-intelligence

Security

SECURITY.md

Security Policy

Supported versions

The master branch is the only supported version. We ship a continuous release model — there are no long-lived release branches.

Reporting a vulnerability

Please do not open a public GitHub issue for security reports.

Email security@resilland.com with:

  • A clear description of the vulnerability
  • Steps to reproduce (or a proof-of-concept)
  • Affected endpoint / file paths if known
  • Your name + affiliation (optional, but lets us credit you in the changelog)

We aim to:

  • Acknowledge receipt within 3 business days
  • Triage + classify within 7 business days
  • Ship a fix on master within 14 days for critical issues, 30 days otherwise

You'll get a heads-up when a fix lands so you can confirm it from your side.

Scope

In scope Out of scope
Authentication bypass / privilege escalation Self-hosted instances with non-default .env values
API endpoints under /api/* and /v1/public/* Denial-of-service from a single IP
Encryption/storage of credentials in PostgreSQL/MinIO UI/UX issues with no security impact
Multi-tenant isolation (org_id boundary) Outdated dependencies with no known CVE in our usage
MCP server (pip install resilland-intelligence-mcp) Spam from unauthenticated /api/policies reads

Hardening notes for self-hosters

If you run RESILAND Intelligence in production, please:

  • Secrets — required before APP_ENV=production will boot (see backend/app/main.py::_validate_prod_secrets):
    • APP_SECRET_KEY — Fernet AES key used to encrypt provider API keys at rest in Postgres. MUST be a stable, cryptographically-random value (python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"). A regenerated key invalidates every previously-stored ciphertext, so production refuses to boot with an empty one.
    • POSTGRES_PASSWORD and MINIO_ROOT_PASSWORD — set these to strong values in .env. Production validator rejects the resiland_dev_2026 placeholder and the change_me / CHANGE_ME markers.
    • RESILAND_AGENT_HMAC_SECRET — required only when USE_AGENT_PIPELINE=true. 32-byte random hex (python -c "import secrets; print(secrets.token_hex(32))"). Without it the backend refuses to start so the /api/agent/internal/* HMAC-protected endpoints never accept unsigned traffic.
  • Authentication uses Firebase ID tokens verified by the Firebase Admin SDK on the backend — there is no JWT secret of our own. Make sure FIREBASE_PROJECT_ID + the service-account JSON are set.
  • Network:
    • Restrict the PostgreSQL port (5432) to the backend container only.
    • Do not expose the MinIO API port (9000) publicly — proxy through nginx.
  • Third-party key hardening:
    • Restrict your Google Maps JS API key by HTTP referrer in Cloud Console.
    • Restrict your Anthropic key by IP allow-list in the Anthropic console.
    • Enable Firebase App Check (Recaptcha v3) on the frontend Firebase project.
  • Debug surface: keep APP_DEBUG=false in prod — Swagger / ReDoc / OpenAPI endpoints are only served when debug is on, and the production validator refuses to boot with debug enabled.
  • Nginx: the sample infra/nginx/resilland.com.conf ships HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy and Permissions-Policy — copy it rather than crafting your own if unsure.

Bug bounty

We do not currently run a paid bounty programme. We're happy to credit researchers in CHANGELOG.md and provide a confirmation letter for your CV.

Pre-disclosed advisories

None at this time.

There aren’t any published security advisories