- Overview
- Deployment Security
- Environment Variables
- SSRF Protection
- Rate Limiting
- Sandbox Security
- Security Headers
- Incident Response
Liminal implements multiple security layers to protect against common web application vulnerabilities.
Before deploying to production, ensure:
-
NODE_ENV=productionis set -
LIMINAL_DISABLE_SANDBOXisfalse(or unset) - Rate limiting is configured appropriately
- HTTPS is enabled
- Security headers are active (verify with
curl -I) - CSRF tokens are required for state-changing operations
docker run \
--security-opt seccomp=docker/seccomp-chrome.json \
--cap-drop=ALL \
--cap-add=SYS_ADMIN \
--read-only \
--tmpfs /tmp \
liminal| Variable | Description | Default | Security Impact |
|---|---|---|---|
LIMINAL_DISABLE_SANDBOX |
Disable Chrome sandbox | false |
π΄ High - Only in containers |
LIMINAL_LLM_BASE_URL |
LLM API endpoint | (provider) | π‘ Medium - Validated against whitelist |
LIMINAL_ALLOWED_HOSTS |
Additional allowed hosts | (none) | π’ Low - Extends whitelist |
LIMINAL_ALLOW_LOCALHOST_LLM |
Allow localhost LLM | true |
π‘ Medium |
LIMINAL_ALLOW_PRIVATE_IP_LLM |
Allow private IPs | false |
π΄ High |
LIMINAL_RATE_LIMIT_GENERAL |
API rate limit | 100 |
π’ Low |
LIMINAL_RATE_LIMIT_EXPORT |
Export rate limit | 10 |
π’ Low |
LIMINAL_RATE_LIMIT_SANDBOX |
Sandbox rate limit | 30 |
π’ Low |
Liminal validates all LLM URLs to prevent Server-Side Request Forgery:
- Cloud metadata endpoints (169.254.169.254)
- Private IP ranges (10.x.x.x, 172.16-31.x.x, 192.168.x.x)
- Link-local addresses
Allowed hosts include:
- api.openai.com
- api.minimax.io
- api.z.ai
- openrouter.ai
- api.kimi.com
- api.moonshot.ai
- localhost (configurable)
Default limits per IP:
- General API: 100 requests per 15 minutes
- Export operations: 10 requests per hour
- Sandbox operations: 30 requests per 15 minutes
Chrome sandbox is enabled by default. Only disable when:
- Running in a Docker container
- With proper seccomp/AppArmor profile
- After understanding the risks
Liminal uses route-specific security headers instead of one universal header claim:
PreviewServerresponses includeContent-Security-Policy,X-Frame-Options: DENY,X-Content-Type-Options: nosniff,Strict-Transport-Security, andReferrer-Policy.- Studio GUI/API/SSE responses include
X-Content-Type-Options: nosniff,Strict-Transport-Security,Referrer-Policy, andX-Frame-Options: SAMEORIGIN. - Studio
/previewresponses include the Studio common headers plus a sandbox previewContent-Security-Policywithframe-ancestors 'self'. The route must remain same-origin iframe compatible for the live preview surface.
If you discover a security vulnerability:
- Do NOT open a public issue
- Email security@liminal-ai.dev with details
- Include reproduction steps
- Allow 90 days for disclosure
Subscribe to security advisories:
- Watch the GitHub repository
- Join the security mailing list