Do not open a public issue. Email security@leonyx-ai.com with:
- affected version / commit
- a minimal repro (steps, payloads, screenshots)
- impact assessment if known
You should receive a reply within 48h. For critical issues (RCE, auth bypass, token exposure) we will coordinate a release and disclosure window.
| Version | Supported |
|---|---|
| main branch | ✅ |
| tagged releases | ✅ latest only |
| older tags | ❌ |
Leonyx Flow is a self-hosted multi-tenant web app that stores long-lived social-platform tokens. The highest-value targets are:
- Provider tokens at rest → AES-256-GCM with
ENCRYPTION_KEY; decrypted only inside the worker/app process; never sent to the browser. - Cross-tenant access (IDOR) → every workspace-scoped query passes
getMembership/requireWorkspaceRole; workspaces are isolated by row-levelworkspaceIdfilters. - Inbound webhook spoofing →
X-Hub-Signature-256verified withMETA_APP_SECRET; verification failures return 401 and are logged. - Outbound webhook / link destinations (SSRF & open redirects) → only public http(s) destinations; private/loopback/link-local IPs, credential-bearing URLs,
javascript:/data:schemes rejected. - Session theft → opaque bearer tokens stored hashed (SHA-256), httpOnly+SameSite=Lax cookies, absolute 30-day expiry.
- CSRF → per-session random token in an httpOnly cookie echoed in the
x-csrf-tokenheader for every state-changing request. - Replay of events → executions keyed on
(provider, providerEventId); a redelivered webhook is a no-op. - Log leakage → the structured logger redacts token/secret/password-shaped fields by key name.
- Magic-link login only (single-use, hashed, 15-minute expiry, rate-limited by IP).
- OAuth (Google) and passwords are roadmap items — do not assume multi-factor protection exists yet.
# secrets (32 bytes each)
openssl rand -base64 32 # SESSION_SECRET
openssl rand -base64 32 # ENCRYPTION_KEYNODE_ENV=production, TLS termination,APP_URLset to the public origin.- Keep
DEMO_MODE=false; disable the test-webhook endpoint in prod (it is already gated to development/demo). - Encrypt
ENCRYPTION_KEYper-instance; rotating it invalidates stored tokens (reconnect accounts afterwards). - Back up Postgres; keep Redis durable (the compose file uses appendonly).
- Restrict the dashboard to a private network or VPN if you self-host for a single team.
DEMO_MODE=trueexposes the demo login and seeded data — never enable it on a public production instance.