Security

Security posture, posted publicly.

What LabelSets does to protect customer data, how we handle cryptographic material, how we respond to vulnerability reports, and which independent attestations back what we claim. Last updated 2026-04-22.

01 · Application security

OWASP Top-10 (2021) coverage

Controls mapped to OWASP's current Top-10 categories. "Live" means the control is in production; "Planned" means scheduled on the roadmap with an expected date.

CategoryControlStatus
A01 · Broken Access ControlSupabase Row-Level Security on every table; auth.role() checks on every policy; service_role only used in validation worker. No IDOR: all routes bind resource ownership to auth.uid().Live
A02 · Cryptographic FailuresTLS 1.3 everywhere (Railway + Supabase enforce HTTPS). AES-256 for Supabase storage at rest. Ed25519 signatures on LQS certs. No custom crypto.Live
A03 · InjectionSupabase client with parameterized queries exclusively. No raw SQL concatenation. HTML escaped through server-side template functions.Live
A04 · Insecure DesignAppend-only audit tables (oracle_evaluations, lqs_certs, lqs_cert_revocations). Idempotent validation pipeline. Signed cert model makes tamper trails visible.Live
A05 · Security MisconfigurationCSP, HSTS, X-Frame-Options DENY, X-Content-Type-Options nosniff, Referrer-Policy strict-origin, Permissions-Policy lockdown (see vercel.json).Live
A06 · Vulnerable & Outdated Componentsnpm audit on every CI run. Dependabot on key dependencies. Python pip-audit gates model-eval deploys.Live
A07 · Identification & Authentication FailuresSupabase Auth (GoTrue) with password strength + HIBP cross-check. Rate-limited login. OAuth via Google. Enterprise SAML SSO available.Live
A08 · Software & Data Integrity FailuresEd25519 signatures on LQS certs with canonical JSON serialization. All cert payloads verifiable offline. Revocation registry catches post-facto-compromised certs.Live
A09 · Security Logging & MonitoringSupabase structured logs + Railway deployment logs. Failed authn + anomalous API call attempts captured. Full SIEM alerting planned Q3 2026.Partial · full SIEM Q3 '26
A10 · Server-Side Request ForgeryNo user-controlled URL fetching in prod routes. VirusTotal hash lookup is the only outbound call from seller-upload path — URL fixed, API key scoped.Live
02 · Cryptographic posture

Key management + cert signatures

LabelSets signs every LQS cert with a single Ed25519 keypair. The public key is published at /api/lqs-public-key so any procurement auditor can verify offline. Rotation policy and key custody summarized below.

Current signing key
Ed25519 · fingerprint aa4c070af907e2ea · generated 2026-04-22. Private key stored exclusively as the LQS_SIGNING_PRIVATE_KEY env var on the validation service; access is limited to the Railway service owner. Key is not written to disk, not in git, not in logs.
Rotation policy
Keys are rotated annually by default, or within 14 days of any credible compromise signal. Rotations are announced on this page and via /status at least 90 days in advance. Previously-signed certs remain verifiable against the retired public key (the old key is retained + published indefinitely in a key-history registry).
Cert revocation
Post-facto cert compromise (discovered contamination, PII leak, seller dispute, methodology defect) triggers a revocation entry in lqs_cert_revocations — a public, append-only table surfaced through the verification endpoint. Revocations are irreversible; there is no "un-revoke."
Canonical serialization
The JSON payload signed by the server is canonicalized with sorted object keys + whitespace-free UTF-8 encoding. The signer (validation/workers/lqs-cert.js) and both verifiers (api/lqs-cert-verify.js, sdk/labelsets/lqs.py) implement byte-for-byte identical canonicalization. Divergence would break verification — this invariant is maintained by code review.
03 · Encryption

At rest + in transit

SurfaceCipherProvider
HTTPS (all endpoints)TLS 1.3 · AES-256-GCM · ECDHERailway + Vercel (Let's Encrypt, auto-renewed)
Supabase databaseAES-256 encryption at rest + TLS in transitAWS RDS-managed (us-west-2)
Supabase storage (uploaded datasets)AES-256 encryption at rest · TLS 1.3 in transitAWS S3-managed
Redis (BullMQ queues)TLS in transit · Railway private network (no public exposure)Railway-managed
Cert signing keyEd25519 private key only in Railway env var (encrypted at rest by Railway)Railway Variables store
04 · Vulnerability disclosure

Report something that shouldn't be possible.

We operate a responsible-disclosure program with a 90-day coordinated disclosure window. Please do not run automated scans against our production infrastructure without first contacting us — it creates noise that can look like an attack.

Reach security directly

Email the findings to security@labelsets.ai with a reproduction + impact description. We commit to an initial human response within 48 hours and a remediation plan within 14 days for in-scope issues. No bug bounty yet; we're working on it.

In scope: production endpoints on labelsets.ai, initialdeploy-production.up.railway.app, the validation + model-eval Railway services, the Supabase API. Out of scope: DoS, findings requiring physical access, social engineering of LabelSets employees.

05 · Attestations

Independent certifications

Third-party attestations that back specific claims on this page. We distinguish between "Currently-held", "In-progress" with expected delivery, and "Planned". We do not claim certifications we do not hold.

AttestationScopeStatus
SOC 2 Type IIProduction marketplace + validation servicesIn progress · Q3 2026
HIPAA BAAAvailable for enterprise customers upon requestLive (contract-executed BAAs in place)
GDPR / DPACustom DPA for enterprise customers; standard privacy policy for self-serveLive
ISO 27001Information Security Management SystemPlanned 2027
Penetration testAnnual third-party pen test of the marketplace + LQS pipelinePlanned Q4 2026
NIST AI RMF alignmentLQS v3.1 methodology submitted as reference implementationSubmission in prep

When a status moves from "Planned" or "In progress" to "Live", the corresponding report or attestation letter is available on request under NDA via security@labelsets.ai.

06 · HTTP security headers

Live header policy (all routes)

Every response from labelsets.ai carries the following headers. You can verify this yourself from the command line.

Header set
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' ...
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), usb=()
Verify yourself: curl -I https://labelsets.ai/ | grep -iE "strict|content-security|x-frame|x-content|referrer|permissions"