Evidence Integrity Mismatch Runbook
|
|
| Trigger |
The scheduler's hash-chain verification fails (a critical log line and the SIEM event evidence.integrity_failure), a record disagrees with an external checkpoint, or a file's SHA-256 disagrees with the ledger. |
| Severity |
P1 platform incident until shown to be a benign defect |
| Related |
ADR-016, Incident response |
- Page platform on-call and inform the AppSec lead and the SOC.
- Freeze: stop the workers and the webhook receiver (
worker.replicas: 0 and hook.enabled: false in the chart, or stop those Compose services). Nothing is ingested, evaluated or snapshotted on top of a suspect ledger; the API stays up, read-only in effect.
- Preserve: note the current time as a point-in-time recovery marker. Keep the worker logs with the verification failure. If a SIEM receives the daily checkpoint events, export the relevant ones: they are the external anchor.
- Tell users that assurance data is under investigation and figures may change.
2. Diagnose
| Check |
How |
Interpretation |
| Which record? |
The worker log: "evidence hash chain broken at index N of M" for the current month's chain |
Localises the problem |
| Compare with the external anchor |
The SIEM's checkpoint.daily event for that chain and date vs the database |
The database disagrees with the checkpoint → DB tampered or corrupted after the checkpoint |
| Recompute the record hash with an independent implementation |
Offline script on an exported row (JCS canonicalisation) |
Distinguishes a code bug (canonicalisation change) from data change |
| DB audit |
PostgreSQL logs and your database provider's alerts: superuser sessions, ALTER TABLE … DISABLE TRIGGER |
Indicates deliberate tampering |
| Recent deployments |
Did a release change hashing or serialisation? |
Benign-defect candidate |
| Blob mismatch |
Compare blob version history (immutable versions) with the ledger digest |
Storage corruption vs wrong digest recorded at ingestion |
3. Resolve
| Finding |
Action |
| Code defect (e.g. canonicalisation changed) |
Fix the code. Do not rewrite hashes. Append a chain_annotation record documenting the defect and the affected range. Re-verify. Unfreeze. |
| Corruption (no malicious indicator) |
PITR restore to a new server at a verified point. Missing evidence comes back as connector runs fetch it again from GitHub or GitLab. Promote. Re-verify against Sentinel checkpoints. |
| Tampering |
Treat as a security incident (incident response): identify the actor, revoke access, restore from a verified point, re-derive projections, revoke any evidence inserted in the window, notify leadership and audit. |
4. Close-out
Start the workers and the webhook receiver again · let connector runs catch up · confirm the next scheduler sweep verifies the chain · post-incident review · decision-log entry if any data could not be restored (with the affected applications and controls listed).