- Docs
- Bureau Threat Model
Bureau — Overview
Bureau Threat Model
The Pluck Bureau is a constellation of 11 transparency-log programs (Dragnet / Tripwire / Oath / Fingerprint / Nuclei / SBOM-AI / Rotate / Mole / Whistle / Bounty / Custody) that together publish signed observations about AI vendors to the public Sigstore Rekor log. The threat model below covers the program-class attacks an external researcher should be aware of when reviewing or running a Bureau deployment.
For a per-program operator runbook (compromise response, daily/weekly duties), see Operator Duties. The canonical copy of the threat model lives at pluck/SECURITY.md → "Pluck Bureau threat model".
Identity binding
- Every Bureau artifact is signed with an operator Ed25519 key – no shared secrets, no central CA. The fingerprint is the lowercase 64-hex SPKI sha256.
- Cassettes / dossiers / probe-packs / oaths / canaries / verdicts all carry the signer's full fingerprint inline so verifiers can cross-check against the Rekor entry's
publicKeywithout a directory lookup. - Custody ties operator key + WebAuthn so an operator key compromise alone is not sufficient to forge chain-of-custody bundles for court-admissible AI conversation evidence. Bundles produced before WebAuthn binding lands emit
fre902Compliant: false.
Rekor permanence + redaction obligation
- Every Bureau-emitted Rekor entry is PUBLIC and PERMANENT. The log cannot be redacted. Operators acknowledge this with the
acceptPublic: truegate at everynotarize*call site. - The redactor runs on every program's emit step before Rekor – see
redactBureauPayload()in Bureau Foundations. Default policy: secret-pattern scrub + JSON-key-name scrub.--strict-redactadds PII regex (email/phone/SSN). HIPAA / GDPR-class data MUST NOT ride a Bureau cassette unless the operator has independently confirmed the redactor catches every leak vector for their payload.
Probe-pack supply chain
- Every probe-pack referenced by a Bureau verdict (Dragnet / Nuclei / Mole / Fingerprint) is signed by its publisher. Verifiers REJECT unsigned packs.
- SBOM-AI's roster ties every Bureau program's runtime npm dependency surface to a signed fingerprint. A typosquat / dependency-confusion attack on a Bureau program is detectable via
pluck bureau sbom-ai verifyagainst the published SBOM at the program's release tag.
Sybil defense
- Quorum verifiers (
buildQuorumVote/verifyQuorumVotein Bureau Foundations) require N-of-M signatures from distinct operator fingerprints. A single attacker controlling N+1 keys can still forge consensus, so operators MUST deploy quorum-node identities across distinct trust boundaries – different orgs / clouds / human signers. - Quorum dedup happens by fingerprint string AND by SPKI public-key DER bytes. Two distinct fingerprints registered against the same Ed25519 public key are rejected by
verifyQuorumVote(and bybuildQuorumVotewhen anidentitiesregistry is supplied) – closing the Sybil-with-renamed-fingerprint attack.
Key compromise + race-window
- Rotate publishes
KeyRevocation/v1for compromised keys. The revocation does NOT remove signed Rekor entries (impossible against a public Merkle tree); verifiers MUST consult the compromise ledger before trusting any historical signature from a revoked fingerprint. - Two-phase revoke. Between operator-detected compromise and the multi-second revocation publish, an attacker holding the same key can publish anything. Rotate's two-phase revoke closes the race: any
quorum-nodemay publish a fastKeyFreeze/v1immediately, then the operator publishes the slowKeyRevocation/v1. Verifiers classify entriesduring-freeze(between freeze and revokesince) as untrusted viaclassifyCompromiseWithFreeze.
Mole Rekor-clock gate
- Mole canary
sealedAtis operator-controlled. An attacker could backdate it to fake "memorization predates training cutoff."verifyCanaryAgainstRekorrejects a canary whosesealedAtis in the future relative to Rekor'sintegratedTime(physically impossible) and surfacesdaysAheadOfRekorso journalists can spot suspicious legitimate gaps too.
Oath retraction protocol
- A vendor that drops a claim from oath v2 (relative to v1) MUST publish an
OathRetraction/v1signed by the same fingerprint as the prior oath. Without a retraction,verifyOathHistoryflags the silent removal ANDcontradictAgainstOath(..., {priorClaims})keeps evaluating the dropped claim – the vendor cannot quietly escape a prior commitment. See Oath.
Kill-switch sentinel
A compromised probe-pack mid-hunt can be halted across every long-running Bureau daemon via:
pluck bureau pause # writes ~/.pluck/bureau-paused
pluck bureau pause --program=dragnet
pluck bureau resume # remove the sentinel
Programs poll isBureauPaused() once per iteration. This is the first verb operators reach for in a compromise-response runbook – see Operator Duties → Compromise response.
Operator key threat model
- Operator keys are stored at
~/.pluck/operator.keywith0600mode. Bureau verbs refuse to load a key with looser permissions. - A stolen operator key allows an attacker to publish ANYTHING under the operator's identity. Defense: Rotate + freeze + pause buy hours of containment; the Rekor record of the attacker's payloads remains permanent (transparency log integrity).
- Operators publishing to the Sigstore public-good log MUST acknowledge
acceptPublic: trueon every Bureau notarize verb. Private deployments can override via--rekor-url.
Failure-mode summary
| Attack class | Defense | Residual risk |
|---|---|---|
| Stolen operator key | Rotate freeze + revoke + re-witness; pause sentinel for sub-second daemon halt | Rekor entries signed during the compromise window remain public + permanent – trust is invalidated, data is not |
| Sybil quorum forge | verifyQuorumVote dedup by fingerprint string AND SPKI public-key DER bytes; cross-trust-boundary deployment | A single attacker controlling N+1 keys across distinct identities can forge consensus |
| Probe-pack supply-chain (typosquat / dependency confusion) | SBOM-AI roster + trustTier === "verified" gate at every consumer | TOFU on first-use; operators must obtain author keys out-of-band |
| Backdated Mole canary | Rekor-clock gate; daysAheadOfRekor surfaced for journalist review | Multi-day gap between seal + Rekor inclusion is legal but suspicious |
| Oath silent claim drop | Retraction protocol; verifyOathHistory flags drops without OathRetraction/v1 | Vendors who never published v1 escape the protocol entirely |
| Compromised probe-pack mid-hunt | Pause sentinel; pluck bureau pause halts every daemon sub-second | Daemons that ignore signal.aborted (third-party plugins) require a second Ctrl-C |
| Rekor outage | notarizeWithRetry + per-process circuit breaker; 409 idempotent recovery | Sustained outage halts notarisation but local dossier append continues |
| Cross-program output-dir corruption | acquireOutputDirLock filesystem mutex | Lock holder pid surfaced; cross-process safety is operator's responsibility |
Reporting a Bureau-class vulnerability
Use the same address as the rest of Pluck: security@pluck.run. Include the program name (Dragnet / Oath / etc.) and the Rekor uuid the bug exposes (when applicable) so we can scope the response.
For the canonical threat-model text and version history, see pluck/SECURITY.md.
See also
- Operator Duties – the covenant operators accept by signing.
- Bureau Foundations – primitives, key ceremony, kill-switch, redactor, retry/breaker.
- Rotate – full compromise-response runbook with the two-phase freeze + revoke flow.
- Pluck Security – non-Bureau threat model: browser-agent gate, halt codes, EU AI Act applicability.