Skip to content

Security: shuv-amp/Equividence

SECURITY.md

Security

Equividence is a public demonstration tool. It accepts bounded SQL text, but it does not connect to production databases and does not accept database credentials.

Report a vulnerability

Please use GitHub private vulnerability reporting. Do not open a public issue for an unpatched vulnerability or include API keys, SQL containing private data, or deployment credentials in a report.

Include:

  • the affected commit;
  • a short reproduction;
  • the expected and observed behavior;
  • whether the issue affects the browser, API, Worker, generated artifacts, or deployment image.

Trust boundaries

flowchart TB
    U["Developer browser"] -->|"bounded analysis input"| A["Express API"]
    A -->|"structured evidence only"| M["GPT-5.6"]
    M -->|"typed proposal"| A
    A -->|"validated proposal"| U
    U -->|"human-authorized contract"| W["Ephemeral SQLite Worker"]
    W -->|"witness + replay record"| U

    P["Production database"] -. "never connected" .- U
    K["API key"] -. "server-side only" .- A
Loading

Existing controls

  • OpenAI credentials remain server-side and are never exposed through Vite variables.
  • Production startup requires an EQUIVIDENCE_SAFETY_SALT of at least 32 characters.
  • The API rejects cross-site analysis requests and disables x-powered-by.
  • Analysis bodies are limited to 96 KB.
  • Public analysis is limited to five requests per minute per hashed client identifier.
  • Concurrent model calls are bounded per process.
  • Model output is validated against a strict schema and then checked against server-extracted spans, IDs, roles, and relationships.
  • SQL execution occurs only in a fresh browser Worker using in-memory SQLite WASM.
  • The Worker uses defensive mode, an authorizer, progress deadlines, and hard termination.
  • Unsupported constructs fail closed before analysis or execution.
  • The product does not persist SQL, witness rows, or model responses on the server.
  • Security headers restrict scripts, frames, forms, permissions, and cross-origin resources.
  • The Docker runtime uses an unprivileged user and excludes local .env files from its build context.

Deployment requirements

Set secrets in the deployment platform, not in source control:

OPENAI_API_KEY=...
EQUIVIDENCE_SAFETY_SALT=at-least-32-random-characters

Generate a salt with:

openssl rand -hex 32

The live Express deployment should preserve these defense-in-depth response headers:

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

Set EQUIVIDENCE_TRUST_PROXY=1 only when exactly one trusted reverse proxy supplies the forwarded client address.

The GitHub Pages walkthrough cannot set these headers. It ships no key, accepts recorded analysis only for unchanged fixtures, disables OPFS, and keeps SQLite in memory. Use the live server deployment when the full response-header posture or live GPT-5.6 analysis is required.

Known boundaries

  • In-memory rate and concurrency limits are per process. A multi-replica deployment needs shared or edge enforcement.
  • Evidence fingerprints detect accidental mismatch; they are not signatures or proof of origin.
  • Generated replay SQL and tests are artifacts for review. Run them in an isolated development environment.
  • The supported SQL contract is intentionally narrow and is not a general SQL sandbox.
  • A reproduced counterexample proves one broken invariant. It does not prove the absence of other failures.

There aren't any published security advisories