If you discover a security vulnerability in Secret, please report it privately via GitHub Security Advisories.
Do not open a public issue for security vulnerabilities.
We will acknowledge your report within 48 hours and aim to release a fix within 7 days for critical issues.
The following are in scope:
- Authentication bypass (PoW, API keys)
- Encryption/decryption flaws (key leakage, nonce reuse, plaintext exposure)
- Server-side access to plaintext content (zero-knowledge violation)
- SQL injection, path traversal, SSRF
- XSS, CSRF, header injection
- Rate limit bypass
- Information disclosure via error messages or timing side-channels
Secret uses a double-encryption model:
- Client-side: XChaCha20-Poly1305 (libsodium) with keys derived via Argon2id
- Server-side: AES-256-GCM (Node.js crypto) as defense-in-depth
The decryption key is stored in the URL fragment (#key), which browsers never send to the server. The server never has access to plaintext content.
- Timing-safe token comparison (
crypto.timingSafeEqual) - Key memory zeroing after use (
sodium.memzero) - Strict Content Security Policy (CSP)
- Per-IP rate limiting on all endpoints
- Zod validation on all inputs with max length constraints
- SQLite
secure_deleteand WAL mode - Non-root Docker container with read-only filesystem
- No logging of note content, IPs, or user data
Only the latest version is supported with security updates.