Lattice Lattice

WP-01 — Threat Model.

Roughly 18 minutes to read.

The threat model Lattice is designed against. Three tiers of adversary, with explicit defences and explicit limits at each tier. Includes the out-of-scope cases — every threat model has them, and pretending otherwise damages trust.

Authors: Lattice project · Version: 1.0 (draft) · License: CC-BY-4.0 · Status: draft, will be signed and frozen at v1.0 launch.


1. Scope and assumptions.

1.1 What "Lattice" means in this paper.

The Lattice app installed on an unrooted, unjailbroken iOS or Android phone, with the user's seed phrase generated on-device and stored hardware-protected by the Secure Enclave (iOS) or StrongBox / TEE (Android). The user has set a strong PIN and enrolled biometric unlock. The phone is updated to a current major OS version (iOS 17+ / Android 10+).

1.2 What we assume about the user.

If any of these assumptions fail, the security model degrades in well-defined ways documented per-tier below.

1.3 What we don't assume.


2. Three tiers of adversary.

The threat model is organised into three tiers based on capability. Tier 1 is the most common; tier 3 is the most resourceful. Each subsequent tier inherits the defences of the previous tier and adds more sophisticated attacks.

   T1 — Local passive radio observer
        |
        |  + active manipulation
        v
   T2 — Local active radio adversary
        |
        |  + multiple observation points + traffic confirmation
        v
   T3 — Network-level adversary (state-level resources)

   Out of scope:
        Endpoint compromise (rooted device, OS-level malware)
        Supply-chain compromise of dependencies
        Physical coercion of an unlocked user
        Loss of the seed phrase
  

2.1 T1 — Local passive radio observer.

Capability. An adversary within Bluetooth-LE / Wi-Fi-Aware radio range of the user, capable of capturing every packet transmitted in the air. They cannot inject, modify, or replay packets. They have unlimited storage and computation, including future quantum computation.

Goal. Read message contents, identify communicating parties, infer relationships, build a profile of the user's communications.

Defences.

Limits.

2.2 T2 — Local active radio adversary.

Capability. Same range as T1, plus the ability to inject arbitrary packets, modify packets in transit, replay packets, and selectively drop packets. They have unlimited storage and computation, including future quantum computation.

Goal. Substitute keys (man-in-the-middle), inject false messages, replay legitimate messages, deny service, perform downgrade attacks against the protocol.

Defences.

Limits.

2.3 T3 — Network-level adversary (state-level resources, traffic confirmation).

Capability. An adversary with access to multiple physical observation points across a wide area, capable of doing classical traffic-confirmation analysis: correlating timing, volume, and frequency of transmissions across many points to infer relationships, even without reading content. Resources at the level of a national-scale traffic-tap programme. Same compute assumptions as T1 / T2 (unlimited, including future quantum).

Goal. De-anonymise users, map the social graph, identify relationships even when content is unreadable.

Defences.

Limits.


3. Out of scope.

These categories are explicitly outside Lattice's threat model. We will not defend against them and we will not pretend we do.

3.1 Endpoint compromise.

If the operating system is compromised — rooted Android, jailbroken iOS, or malware running with sufficient privilege — the OS sees what the user sees. Decryption keys are in the OS keystore (which the rooted OS can access). Plaintext is in app memory. The screen renders plaintext to a framebuffer the OS controls.

Lattice's defences end at the application boundary. The Secure Enclave / StrongBox protect the seed key from a rooted-but-otherwise-honest OS, but a sufficiently privileged attacker on the device can extract any plaintext that the user can read. This is a fundamental limit shared by every messenger.

3.2 Supply-chain compromise.

If a transitive dependency in our Cargo / Gradle dependency tree is backdoored, that backdoor lands in our binaries. We mitigate by:

But ultimately, if RustSec misses a backdoor in a transitive dep, we miss it too. We rely on the broader open-source ecosystem here.

3.3 Physical coercion.

Our duress-PIN feature wipes the device on entry of a duress credential rather than unlocking it. Our duress-biometric feature (post-launch) does the same on a configured second biometric. These are intentionally absent until the user explicitly enables them, with educational copy explaining the trade-offs.

However, an adversary with physical control of the user and the phone can extract whatever the user knows by means we cannot mitigate. No software fixes this. We try to make it harder by giving the user destructive options.

3.4 Loss of the seed phrase.

By design. There is no recovery path. If the user loses both the phone and the seed phrase, the identity is gone. The trade-off is real and chosen deliberately: a recovery path is a thing an attacker can attack.


4. Defence-in-depth checklist.

Mapping of every concrete defence to the source file that implements it. This table is the contract: each row is testable, each row is reviewable.

DefenceImplementationTest
ChaCha20-Poly1305 AEAD per packetlattice-crypto/src/noise.rsproperty: round-trip + tamper rejection
Padding to bucket sizeslattice-packet/src/wire.rsproperty: select_bucket monotone
Sealed-sender tagslattice-packet/src/tag.rsproperty: tag determinism + epoch rotation
Hybrid X25519 + ML-KEM-768lattice-crypto/src/{noise,kem}.rsproperty: kem implicit rejection + round-trip
Replay protection (Bloom)lattice-mesh/src/bloom.rsproperty: no false negatives + count tracking
Time-windowed dedupelattice-mesh/src/bloom.rsproperty: hold-within-window + roll-out
Cover traffic (Poisson)lattice-mesh/src/cover.rsproperty: bounded-emission + determinism
Onion wrapping (3-layer)lattice-mesh/src/onion.rsproperty: round-trip arbitrary path
Ed25519 introduction sigslattice-intro/src/lib.rsproperty: tamper rejection + revocation
Lattice Invite four-word phraselattice-invite/src/lib.rsunit: deterministic + diverges on distinct keys
BurnCommand authenticationlattice-burn/src/lib.rsproperty: tampered + stale + version + target
MLS group securitylattice-mls/src/{lib,envelope}.rsunit: 4-member round trip; envelopes signed
Strict wire-format parserlattice-packet/src/wire.rsfuzz: cargo-fuzz at 100 CPU-hours
Constant-time padding checkvia subtle cratereview: documented use of ConstantTimeEq
Hardware-backed key wrapios/Lattice/Identity + android/.../IdentityVault.ktmanual: device test on real Secure Enclave / StrongBox
Burn arsenallattice-burn/src/lib.rsproperty: counter, inactivity, dead-man, shake

5. Where this paper is wrong.

If you find an error here — a defence that doesn't actually defend, a limit that's worse than we describe, a tier we've miscategorised, a citation that doesn't exist — please tell us. our Matrix room, encrypted to our PGP key, or a Matrix message tagged SECURITY.

This paper is the contract. If we publish it and the code disagrees with it, the code is wrong, not the paper. Please call us on it.


References.