Skip to content

Threat Model

Draft

The server holds no keys and clients write canonical state, so the design must bound what a client can break.

Invariant: a faulty, malicious, or version-mismatched client MUST NOT cause irreparable damage (lost original bytes, lost audit trail, undetected overwrite of user intent). It may cause only transient damage: a quarantined asset, a rejected write with a clear error, a detected-and-reconciled divergence. Key loss is covered by Cryptography — Failure Modes; this doc covers write-path harm. Primitives and per-structure rules are declared once in their owner docs and only linked here.

Sub-docConcern
ScenariosDamage → defense map, quarantine surfaces, provenance immutability
ValidationServer and client refuse-by-default checks, handshake, idempotency, atomicity
Schema RulesSchema evolution, forbidden client behaviors, deprecation policy

No class is trusted to enforce its own correctness.

ClassHoldsStopped by
HonestSession + access token, device DSK, epoch write-tier keyBaseline.
FaultySame real keys; buggy writesServer structural checks, client verify_asset, quarantine
MaliciousA current DSK and the epoch write-tier keyImmutable provenance chain, soft-delete, per-album/per-event compartments, signed audit trail
OldReal keys; X-Capsule-Protocol below the server windowProtocol handshake: 426 before any state is written
NewReal keys; version/suite/schema above the receiver’s maxRefuse-by-default on unknown enums, schemas and versions (Schema Rules)
Web guestOnly an upload-link capability; no keys, no manifestDrops land only in the owner’s inbox (quarantined by construction) under per-link caps, quota and rate limits; enter the library only via trusted adoption

A malicious key-holder cannot be stopped by confidentiality or authentication, so the goal is that it can do nothing silently: every write is a signed provenance record, deletes are soft by default, history is append-only.

A bug or compromise on one side of a shell cannot cross it.

ShellBoundaryOwner
Per-versionAlbum protocol pinning isolates a buggy v_k from v_{k-1} albumsVersioning
Per-albumMLS group + per-epoch AMK + write-tier keyMLS, Keys
Per-eventEach lifecycle action is its own signed, chained recordProvenance
Per-userOwner Group Key; sponsored-account isolationKeys
Per-peer (federation)Capability tokens, error budgets, new-peer quarantineFederation
Per-device (peering)Device directory enforced in the TLS handshakePeering
Per-link (web upload)Link caps + inbox isolationWeb Upload