Skip to main content

Security

Production-grade
from day one.

Only features are MVP-limited. Observability, secrets management, backups, audit logging, row-level security, and isolation for candidate sandboxes are all present at launch. This page documents the controls we run and the safe way to report a vulnerability.

Platform

Controls running in production.

Identity and access

  • Multi-factor authentication required for admins and for recruiters before first purchase.
  • Optional TOTP and WebAuthn for candidates; Cloudflare Turnstile plus non-VoIP phone verification at signup.
  • Short-lived, Vault-issued service tokens for internal APIs; mTLS between services.
  • Row-level security on every user-data table, covered by integration tests.

Secrets

  • HashiCorp Vault self-hosted (3-replica Raft cluster in production).
  • Kubernetes auth method with per-workload ServiceAccount policies.
  • External Secrets Operator syncs Vault into Kubernetes Secrets; nothing reaches a ConfigMap, an env file outside local dev, or a git repo.
  • Nightly Raft snapshots shipped to immutable offsite object storage.

Candidate sandboxes

  • All candidate pods run under the gVisor runtime on a separate Execution Cluster with no public ingress.
  • Namespaces are ephemeral, no persistent volumes, torn down after every session.
  • Default-deny egress; pods cannot reach internal services or arbitrary internet hosts.
  • Pod Security Standards enforced at the “restricted” level.

Data handling

  • Encryption at rest across Postgres, Vault, and object storage.
  • TLS 1.3 in transit on all external endpoints.
  • PII scrubbed at ingestion before logs reach Loki. Session replays mask form inputs by default and opt out of assessment screens entirely.
  • Administrative actions recorded in an append-only audit log with an immutable offsite copy.

Supply chain

  • Software bill of materials generated per build.
  • Exact-version dependency pinning; Renovate proposes controlled updates.
  • Container images scanned with Trivy; static analysis via Semgrep; secret scanning via Gitleaks on every pull request and pre-commit.
  • Signed container images with provenance metadata published to GHCR.

Fraud resistance

  • Separate Claude API calls for generation versus scoring; no circular signals.
  • Process-intelligence telemetry, timing distributions, paste detection, and focus events flagged to the agent for probing.
  • Follow-up probes tied to candidate-specific answers catch prepared scripts.
  • One account per verified non-VoIP phone number.

Programme

How we test ourselves.

  • Continuous automation

    Semgrep (SAST), Trivy (containers), Gitleaks (secrets), axe-core (accessibility), and k6 (load and performance budgets) run on every pull request. Build fails on regressions, no exceptions.

  • External penetration testing

    First external engagement scheduled at month 3 of the operational timeline, with a defined budget and formal scope. Subsequent tests run at least annually and after any material architecture change.

  • Private bug bounty via HackerOne

    Invite-only from month 3. Programme scope and rewards published on the HackerOne page when it opens. Researchers acting in good faith under this policy will not be pursued legally.

  • Dynamic testing (OWASP ZAP)

    Monthly authenticated DAST runs against our pre-production surface. Findings feed our triage queue with the same severity ladder as bounty reports.

  • Incident response

    Top-seven incident types have runbooks maintained in the repository. Alertmanager routes severity-1 pages to Discord with bypass-DnD. A personal data breach triggers UK ICO notification within 72 hours and user notification when the risk is high. Blameless post-mortems are published for any user-impacting incident.

SOC 2 Type 2 is a year-two target. We do not claim compliance we have not yet evidenced.

Responsible disclosure

Found something? Tell us first.

Email security@skillbricks.ai. We acknowledge within 48 hours, triage within five working days, and work with you toward a fix. We will credit you in any published advisory when you want to be named.

In scope

  • skillbricks.ai and its subdomains, including status.skillbricks.ai.
  • The Next.js application, API routes, and Server Actions.
  • The assessment gateway, session agent, worker pool, and Vault integration.
  • Candidate sandbox isolation on the Execution Cluster.
  • Container images published under our GitHub Container Registry namespace.

Out of scope

  • Third-party services (Supabase, Stripe, Anthropic, etc.). Report to them directly.
  • Social engineering of staff, candidates, or recruiters.
  • Physical attacks against Mockif LTD or Hetzner facilities.
  • Denial of service that requires coordinated external resources or that disrupts other users.
  • Self-XSS, missing security headers on pages that set no cookies, or best-practice reports without a demonstrable impact.

Safe harbour

We will not pursue legal action against researchers who act in good faith under this policy: avoid privacy violations, do not access or modify data beyond what is necessary to demonstrate the issue, do not degrade service for other users, and give us a reasonable time to remediate before public disclosure.

Questions

Security, in detail.

Where is our data hosted?
The database and our self-hosted services run on Hetzner infrastructure in Germany. Some subprocessors (Supabase, Stripe, Anthropic, Resend, Twilio, Cloudflare) host in the US; those transfers rely on the UK International Data Transfer Addendum and Standard Contractual Clauses. Details on the data-processing page.
How are candidate sandboxes isolated?
Every candidate pod runs under the gVisor runtime on a separate Execution Cluster that has no public ingress. Network egress is denied by default. Pods are ephemeral, have no persistent volumes, and are torn down after every session.
How are secrets managed?
HashiCorp Vault, self-hosted, with Kubernetes authentication and per-workload ServiceAccount policies. External Secrets Operator syncs Vault values into Kubernetes Secrets at runtime. No secrets ever touch a ConfigMap, an env file outside local dev, or a git repo.
What do you log and for how long?
Access logs run through a PII scrubber before they reach Loki. Hot retention is 30 days, cold retention is 90. Administrative actions are logged to an append-only table with an immutable offsite copy on Hetzner Object Storage. Retention windows are pulled from a single config module.
How often do you run security testing?
Static analysis (Semgrep), container scanning (Trivy), secret scanning (Gitleaks), and dependency scanning run on every pull request. Accessibility tests run via axe-core in end-to-end. An external penetration test is scheduled for month 3 of the operational timeline and recurs at least annually.
Do you offer a bug bounty?
Yes, invite-only on HackerOne from month 3. Researchers already in good standing elsewhere in the industry can request an invite via security@skillbricks.ai; we will expand the program as volume allows.
What about AI-assisted cheating?
Fraud-resistance is a first-class concern. We use process-intelligence signals, paste detection, timing distributions, follow-up probes tied to candidate-specific answers, and a separate Claude call for generation versus scoring. No single actor can both propose and accept a score.

Privacy and data handling

What we collect, why, and how long we keep it. Retention windows pulled from the runtime configuration.

Privacy policy

Subprocessors and DPA

The full list of third parties that touch user data, their purpose, and their hosting region.

Data processing