website/content/docs/threat-model.mdx
--- title: 'Threat model' description: 'What Birdbrain''s chain-of-custody controls defend against, what they deliberately do not, and why the default timestamp authority is DigiCert.' --- This document states plainly what Birdbrain's chain-of-custody controls defend against, what they deliberately do **not**, and why the default trusted-timestamp authority is DigiCert. It is the reference a brief or an expert declaration can cite. Scope: the on-disk audit manifest (hash chain + signatures, #115/#117) and RFC 3161 trusted timestamping (#120). ## The two independent axes Birdbrain reports integrity and trusted time as **separate, orthogonal axes**. Conflating them is the usual way a custody argument gets muddied; keeping them apart is deliberate. | Axis | Question it answers | Mechanism | | --- | --- | --- | | **Integrity** | Have the captured bytes and the manifest chain survived intact? | SHA-256 content hash + hash-linked, per-entry-signed manifest (#115/#117) | | **Trusted time** | Did this content provably exist no later than time *T*, per a third party? | RFC 3161 token from an external TSA, anchored in the manifest (#120) | A byte-perfect capture is **integrity-verified** whether or not it carries a trusted timestamp. Lacking a timestamp is *not* an integrity failure — it is an empty (or pending) trusted-time axis. The trusted-time axis has three states: `rfc3161` (a TSA token attests the content hash), `pending` (an eligible capture awaiting its token), and `none` (a grandfathered legacy capture that predates timestamping). ## What the manifest signature defends against — and what it does not The per-entry signature over each manifest `entryHash` (#117) raises the bar against **casual tampering**: copying the case directory elsewhere and editing a capture, a hash, or a chain link with ordinary tools will fail verification, because the forged entry no longer carries a signature that validates against the installation's public key, and re-hashing one entry breaks every downstream link. It does **not** defend against a determined operator running Birdbrain's own code as themselves. The signing key is wrapped at rest with the OS credential store (DPAPI / Keychain via Electron `safeStorage`), but an operator who controls the running process controls the key and can, in principle, mint a fresh internally consistent chain. This is an inherent limit of any locally-held signing key and is stated here so no one over-claims it in a brief. **The RFC 3161 token is the independent anchor that closes this gap.** Because the timestamp is issued by an external TSA over the content hash, it establishes that the captured bytes existed no later than the stamped time — a fact the operator cannot back-date or forge, regardless of their control over the local machine. Integrity proves the bytes are unchanged; trusted time proves *when* they existed; together they are far harder to dispute than either alone. ## Why DigiCert is the default TSA (decision D6 / #112) The default RFC 3161 endpoint is DigiCert's unauthenticated service `http://timestamp.digicert.com`. The legal-defense rationale: - **Ubiquitous trust anchor.** The DigiCert Trusted Root G4 (and the Assured ID root that cross-signs it) is present out of the box in essentially every OS, browser, and document-verification trust store an opposing expert or a court is likely to use. Verification with stock `openssl ts -verify` succeeds offline against a root the verifier already trusts — no special configuration, no "trust us" step. (Confirmed: see `tests/fixtures/timestamp/README.md`, where a real DigiCert token returns `Verification: OK` against only the bundled root.) - **No account, no key, works out of the box.** The endpoint is unauthenticated, so timestamping functions on first run with nothing to provision and no credential that could be argued to compromise independence. - **De-facto forensic / Authenticode default.** DigiCert is the timestamp authority behind a large share of Authenticode-signed software and is a routine choice in forensic tooling. "We used the same trusted-timestamp authority that underpins code-signing across the industry" is the strongest *defensible in a brief* story available without a paid relationship. The endpoint is configurable in Settings for jurisdictions or engagements that require a specific TSA. Free/hobbyist authorities (e.g. `freetsa.org`) are a documented **development/test fallback only** — their roots are not in common trust stores and should not anchor evidence. ## Canonical verification path In-app trusted-time display performs **structural** parsing only — it confirms the token's message imprint matches the capture's content hash and surfaces the TSA identity and stamped time. The **canonical**, court-facing verification is stock `openssl ts -verify` against the TSA chain (decision D5 / #113); Birdbrain never hand-rolls CMS signature cryptography. This keeps the authoritative check in a ubiquitous, independently-audited tool rather than in Birdbrain's own code.