Reporting a vulnerability
If you’ve found a security issue in Riftmap, please disclose it privately rather than posting it publicly. Email hello@riftmap.dev with reproduction steps and any relevant version, request, or environment info. We aim to acknowledge within two business days.Email security disclosures
Goes straight to maintainers. Please use this channel rather than opening a public issue anywhere.
What’s in scope
- The hosted product at
app.riftmap.dev, its API atapi.riftmap.dev, and the marketing site atriftmap.dev - The static schema and docs at
docs.riftmap.devandapp.riftmap.dev/openapi.json
What’s out of scope
- Reports based purely on automated scanner output without a working proof‑of‑concept
- Volumetric DoS / brute-force findings against the hosted product (we have rate limits; please don’t try to find their thresholds)
- Issues that require a privileged position the attacker shouldn’t have (e.g. “if I steal an owner’s API key, I can act as that owner”)
- Social engineering of staff or customers
What we’ll do
- Acknowledge the report.
- Triage and confirm the issue, or push back with reasoning.
- Develop and ship a fix; coordinate disclosure timing with you.
- Credit you in release notes if you’d like (and if the fix is shipped).
What Riftmap does with your data
Short version:- Source code is never stored. Repos are shallow-cloned (depth=1) into a per-scan temporary directory at
0700permissions, parsed for dependency manifests, andrmtree’d in atry/finally. Only the dependency graph metadata persists in the database. - Scanned repos are treated as hostile input. Clones run with symlinks disabled (
core.symlinks=false) and the file walks skip symlinks and never read outside the clone tree — a malicious repo can’t point the scanner at/etc/passwdor the worker’s environment. Working trees above a total size cap are rejected before parsing. - The scan worker can’t be aimed at internal networks. Every organisation URL and clone URL must be public
https://— hosts resolving to private, loopback, link-local, or cloud-metadata addresses are rejected at registration (422) and re-checked at connect time. Upstream error bodies are never echoed into scan results. - Contributor data is opt-in. The ownership / bus-factor signal is off by default. When a workspace enables it, Riftmap extracts contributor names and emails from git author metadata only (no commit messages, diffs, or file blobs) to compute a per-repo bus factor. This personal data is workspace-scoped and cascade-deleted on workspace deletion and the 30-day GDPR purge; the API ever returns contributor names only, never emails.
- Tokens are encrypted at rest with Fernet. The encryption key lives in env (
ENCRYPTION_KEY) and is required at startup outside dev mode. - Cross-workspace isolation is enforced at every endpoint: workspace API keys can’t reach another workspace’s data, and foreign-workspace requests return 404 (not 403, to avoid leaking existence).
- GDPR data export is available at
GET /workspaces/{id}/export(owner/admin only). Account deletion is atPOST /auth/account/deletewith a 30-day grace period.
Auth design (one-pager)
Mutations are rate-limited per identity. Cross-workspace access returns 404. Configuration mutations — registering a connected org, triggering a scan, creating or rotating API keys — require the Owner or Admin role for session users (workspace API keys are owner-equivalent by design). Password-reset links are single-use, and login timing is constant for unknown emails. See Authentication for the header conventions and limit specifics.
Responsible exposure decisions
We deliberately:- Disable live
/openapi.jsonand/docsin production — agents read the static schema published from CI atapp.riftmap.dev/openapi.json, which is reviewed and exported deliberately rather than auto-introspected from a running prod server. - Return 404, not 403, for cross-workspace requests — so attackers can’t enumerate which workspace IDs are real.
- Return rate-limit errors with a precise
Retry-Afterrather than silently dropping requests — predictable behaviour beats opaque failure.
Audit history
Riftmap goes through recurring full-codebase security audits — most recently April 2026 and July 2026 — covering the backend, the scanner pipeline (untrusted repository content), the frontend, dependencies, and infrastructure. Every finding is remediated with an accompanying regression test, and the complete remediation records are public:- July 2026 audit & remediation record — no critical findings; all findings fixed before publication.
- Verified controls table — every documented control cross-checked against the code, including what we deliberately risk-accept. This is also where the user-facing security summary on the marketing site is sourced from.
