Skip to content

Damage Scenarios and Quarantine

Draft

One vector per row; each defense has one owner doc.

#ScenarioDefenseOwner
1Old client strips unknown sidecar fieldsSignature covers _unknown; newer schema never writtenMetadata
2Bytes mismatch declared content typecontent_type allow-list + sandboxed decoderValidation
3Chunk retried at a conflicting rangeWholly committed → duplicate, nothing written; partial overlap → reject; changed bytes stopped by the client’s chunk-tag guardUpload
4Old manifest replayed to revive a deleteprior_provenance_hash advance check, both sidesProvenance
5Re-sign under a weaker suiteSignature covers suite and protocol versionKeys
6Concurrent captionsLWW + superseded_captions surfaces the loserMetadata
7OR-set remove of an unobserved addRemoves target a known add_idMetadata
8Corrupt thumbnail overwrites a good oneSigned DerivativeManifest chainProvenance
9Fake timestamp distorts auditAudit-only; server received_at authoritativeKeys
10Dedup TOCTOU duplicates a blobCheck + pending insert in one transactionFilesystem
11Upload exceeds declared sizeRange end checked against the declared size before writingUpload
12Unknown crypto_suite_id400 at handshake, before any sessionValidation
13Peer floods the rejected-hash tablePer-peer quota, bounded LRUFederation
14Model swap invalidates AI tagsModel id+version per entry; no cross-model compareMetadata
15Leaked session revokes the restrevoke_all_sessions needs master-key proofAuthentication
16Holder of all current keys rewrites historyHash chain signed by past (retired) devicesProvenance
17Random amk_version skips MLSMonotonic, server-known amk_versionValidation
18v_old client writes to an upgraded albumStale intent_id → 409Versioning
19Malformed sidecar after crashQuarantined, never skippedRepair
20Manifest names an unlisted devicecreated_by_device must be in the directoryValidation
21Hand-crafted metadata blob envelopeByte-exact wire format, checked at decodeEncryption
22Retried delete double-decrementsManifest idempotency on prior_provenance_hashValidation
23Old backup overwrites current stateChain reconciliation; newer local wins; divergence quarantinedBackup
24Device predates its enrollmentIK-signed added_at must precede the manifestKeys
25Peer floods hintsAdvisory; pulls fully validatedFederation
26Peer TLS key silently changesTOFU pin; rotation needs multi-vantage corroborationFederation
27Partial stack editBundle-atomic .tmp staging and renameFilesystem
28Revoked capability still servedTTL ≤ 24h; revocations polled ≤ 15 minFederation
29Embeddings from an unknown modelVector index refuses unknown model_idAI
30Client forges server-derived fieldsServer recomputes; ignores client valuesUpload
31Stale directory undoes a revocationMaster-signed monotonic directory_version; reader high-water markKeys
32Server fabricates or rewinds an epochCeiling from signed MLS commits; in-flight key → pendingKeys
33Share link enumerated≥128-bit id, rate limits, indistinguishable 404Shares
34Peer mass-reports a userSigned, rate-limited; never server-wideModeration
35Federated pulls exhaust storageCharged to receiver, capped per source peerQuota
36Leaked upload link floods ownerLink caps, quota at creation, rate limits, revocationDrops
37Hostile file via upload linkInbox only; sandboxed review before adoptionDrops
38Server swaps the drop encapsulation keyDrop public key travels only in the URL fragmentDrops
39Guest drop passed off as user-authoredNo manifest; adoption mints an adopter-signed createDrops
40Upload-link passphrase brute forceArgon2id verifier, rate limits, capsDrops
41Doctored capability min_protocol_versionSigned claim; handshake and album pin still applyFederation
42Offline share passphrase brute forceArgon2id per guess; rate-limited fetch; fragment secretShares
43Server loses bytes, denies accepting themSigned CustodyReceipt; loss is provableCustody
44Client claims custody it never hadNo receipt, no claimCustody
45Receipt replayed elsewhere / stale attestationServer id signed in; attestations echo a client nonceCustody
46Wake flood drains batteryContentless, coalesced; degrades to pollingNotifications
47Wake timing leaks activityContentless, coalesced, jittered; self-hostable transportsNotifications

Every “don’t apply, surface it” path. A quarantined item is never silently dropped or applied; a human inspects, repairs, or discards it.

Policy over the provenance chain:

  • No path (API, filesystem, federation) overwrites or deletes an entry; append-only by construction.
  • Hard-delete removes ciphertext and metadata; the chain stays as a tombstone.
  • Backups carry the full chain; restore reconciles.
  • Current-key compromise can only append: past signers stay in the device directory forever (revoked_at, never pruned).