PRISM is a self-hosted OSINT platform. Even though every scan it performs is passive, the platform itself processes user inputs, talks to many third-party APIs, and exposes a public-facing dashboard. I take its security posture seriously.
| Version | Supported |
|---|---|
| 2.2.x | Active support |
| 2.1.x | Security fixes only |
| < 2.1 | Unsupported |
Please upgrade to the latest 2.2.x release before reporting any issue.
Please do not open public GitHub issues for security vulnerabilities.
- Email:
security@getprism.su(preferred) - Or: open a private security advisory via GitHub →
Security→Report a vulnerability
Include in your report:
- A clear description of the issue and impact.
- Steps to reproduce (or a minimal proof-of-concept).
- Affected version / commit hash.
- Your assessment of severity (low / medium / high / critical) and any suggested mitigation.
I aim to:
- Acknowledge new reports within 72 hours.
- Provide an initial assessment within 7 days.
- Ship a fix or mitigation for confirmed issues within 30 days for high/critical severity.
If you'd like credit in the changelog, mention how you'd like to be attributed (name, handle, link).
In scope:
- The PRISM backend (
web/app.py,web/security.py, scan modules undermodules/). - The PRISM frontend (
frontend/). - Default Docker / docker-compose deployment artifacts.
- Webhook delivery and signing.
Out of scope:
- Vulnerabilities in third-party services PRISM consults (Shodan, VirusTotal, Censys, etc.) — please report those upstream.
- Issues that require a maliciously modified deployment (e.g. attacker-controlled
.env). - Theoretical issues without a working PoC.
- Rate-limiting or DoS that requires sustained traffic from a privileged network position.
PRISM ships with the following defaults to reduce attack surface:
- Header-only API auth —
X-API-KeyorAuthorization: Bearer …. Query-string keys are rejected. - No anonymous access by default — without configured
API_KEYS, the API responds with503unlessALLOW_ANON_API=trueis explicitly set. - Strict CORS —
ALLOWED_ORIGINSmust be explicitly listed; wildcard is not enabled by default. - Per-principal scan isolation — each scan is owned by a principal derived from the API key; cross-principal reads return
404. - SSRF guards on:
validate_url_not_privatefor user-supplied URLs._resolve_all_publicfor webhook callback hosts (rejects private/loopback/reserved/link-local/multicast/unspecified addresses).
- HMAC-signed webhooks when
WEBHOOK_SECRETis set (X-Prism-Secretheader). - Security response headers —
X-Content-Type-Options,X-Frame-Options,Referrer-Policy,Permissions-Policy. - Rate limiting — global defaults
200/day, 60/hourand per-route limits viaslowapi. - Input validation — target length cap, forbidden shell metacharacters in
validate_target, UUID format check on scan IDs. - Optional
DISABLE_DOCS=trueto hide/docs,/redoc,/openapi.jsonin production.
For production deployments I recommend:
- Generate strong, unique values for
API_KEYS(multiple tenants → comma-separated). - Set
ALLOWED_ORIGINSto the exact frontend origin(s). - Set
WEBHOOK_SECRETand validate theX-Prism-Secretheader on the receiving side. - Set
DISABLE_DOCS=true. - Run behind a reverse proxy (nginx, Caddy, Cloudflare) terminating TLS.
- Restrict outbound network egress where possible (PRISM does call many third-party APIs).
- Mount
scan_data/andmodule_cache/on persistent, access-controlled storage. - Keep your Docker images updated and run
pytest -qafter every dependency upgrade.
PRISM is for lawful, authorized OSINT only. See the Legal Notice in README.md. Reports about the platform being misused for unauthorized surveillance, harassment, or doxxing are welcome and I will act on them.