Skip to main content
Something suggests the platform’s confidentiality, integrity or availability was attacked or broken: a credential seen where it should not be, a node behaving strangely, a tenant seeing another tenant’s data, a tracker file that does not match its hash, an alert nobody can explain. For a vulnerability report or advisory without signs of exploitation, use security-patch.md instead. The threats and what is built against each are in ../security/threat-model.md; this page is what to do.

Roles

One person leads (the first operator on the scene until handed over) and keeps a written timeline in UTC: what was seen, what was done, by whom. Nothing is deleted or rebuilt before its evidence is saved (step 3), unless the damage is ongoing.

Steps

  1. Open a private record. A GitHub security advisory draft on the repository (<input I1>, Security, Advisories, New draft) holds the timeline and stays private. Do not discuss details in public issues.
  2. Decide what is affected, using the threat model’s sections as the checklist:
  3. Save evidence before changing anything on an affected node:
    Copy the files to the controller with scp. Docker keeps container logs with the local driver, which rotates; save them early. For the database, the audit log is append-only for the application roles:
  4. Contain, with the narrowest action that stops the harm. Ingestion keeps running in every case below unless stated, because the edge does not need the core tier. End every console session at once (every user signs in again), on the database leader:
    End every Umami session at once: rotate umami_user_password_key (secret-rotation.md); a changed password invalidates Umami’s tokens.
  5. Eradicate and recover. Fix the cause (patch per security-patch.md), rebuild compromised servers from OpenTofu and Ansible, restore data if it was changed (point-in-time-restore.md), and bring services back.
  6. Notify. The platform processes visitor data for its tenants under the DPA template (../compliance/dpa-template.md): it notifies affected tenants without undue delay after becoming aware of a personal data breach affecting their data, with what the tenant needs for its own obligations. Tell SCF. The wording of these statements is pending legal review (input I10).
  7. Close. Publish the advisory once fixed, with credit to a reporter who wants it (../security/SECURITY.md). Write the timeline, the cause and what changes into the advisory, and update the threat model if a threat was missing.

Exercised

Not yet exercised as a whole. No tabletop or live incident has been run. Parts were rehearsed elsewhere: the patch path on 2026-11-13 (security-patch.md section 7), the tracker revocation on a local gateway on 2026-11-13 (tracker-release.md), operator key revocation through TestMachineAPI on 2026-11-13 (operator-key-revocation.md), and a rotation of the platform role passwords on 2026-11-13 (secret-rotation.md). In phase 19 the remaining steps could not be executed meaningfully on the development stack: evidence collection and containment act on deployed nodes, which do not exist yet. A tabletop exercise on staging is the next step.