Skip to content
Documentation (14 pages)

Security Model

Tallow is built with a security-maximalist approach. Every layer is designed to protect your data, even against future quantum computers.

Threat Model

Assets Protected

Asset Protection
File content (plaintext) AES-256-GCM encryption, never leaves your device unencrypted
Key material Zeroized on drop, pinned in RAM via mlock, never swapped to disk
Metadata (filenames, sizes) Encrypted in transit, EXIF stripped
Identity (who communicates) Optional Tor anonymity layer (SOCKS5 proxy)

Trust Boundaries

Adversary Profiles

Adversary Capability Mitigation
Shared WiFi attacker Passive packet capture E2E encryption, TLS on relay connection
Compromised relay Full server control Zero-knowledge design, E2E encryption
Nation-state (passive) Backbone taps, metadata collection Tor integration, traffic padding
Nation-state (active) DNS/BGP hijack, quantum computers Post-quantum KEM, DoH, certificate pinning

Cryptographic Algorithms

Key Exchange: Hybrid ML-KEM-1024 + X25519

Tallow uses a hybrid key encapsulation mechanism combining:

Both algorithms must be broken to compromise the key exchange. This provides security against both classical and quantum adversaries.

Symmetric Encryption: AES-256-GCM

Hashing: BLAKE3

Password Hashing: Argon2id

Signatures: Ed25519 + ML-DSA-87

Transport & Certificates

Memory Safety

Relay Zero-Knowledge Design

The relay server is designed to know as little as possible:

  1. It receives a room code (a one-way, memory-hard Argon2id derivation of the passcode) — not the passcode itself
  2. It forwards encrypted bytes between participants — it cannot decrypt them
  3. It stores nothing to disk — all data is in-memory and ephemeral
  4. Rooms automatically expire after a configurable timeout (default 10 minutes)
  5. Rate limiting prevents abuse without requiring identity

Even if you self-host the relay and it is later compromised, historical transfers cannot be decrypted.

Optional: Tor / Onion Access

Tallow’s site and relay are also reachable as a Tor v3 onion service, for users who want to route around IP-level observation entirely:

STRIDE Analysis

Category Threat Mitigation
Spoofing Impersonation PAKE authentication, safety numbers
Tampering Data modification Per-chunk AEAD authentication tags (End-to-end lane) and transport protection for the rest; whole-file Merkle verification on the CLI lane
Repudiation Denial of action Not a design goal (privacy tool)
Information Disclosure Data leakage E2E encryption, zeroization, secure memory
Denial of Service Resource exhaustion Rate limiting, resource caps
Elevation of Privilege Sandbox escape OS sandbox (Landlock + Seccomp on Linux)

Operational hardening evidence

The guarantees above name concrete operating-system controls. This section carries the artefacts behind them, so each claim has a published source or an explicit statement of where the artefact lives (audit rows A09-24…A09-30).

Core dumps disabled (row A09-25) — kernel and container layer:

/etc/sysctl.d/60-tallow-hardening.conf
kernel.core_pattern = |/bin/false
fs.suid_dumpable = 0
kernel.kptr_restrict = 2
# prod relay image — no core dumps, no ptrace into the process
RUN echo "ulimit -c 0" >> /etc/profile.d/no-core.sh

The relay additionally calls prctl(PR_SET_DUMPABLE, 0) at startup, so even a root-invoked gcore on the running process produces nothing.

Key material never reaches swap (row A09-26):

# /etc/sysctl.d/61-tallow-swap.conf (paired with mlock in the relay)
vm.swappiness = 0

Secrets are pinned with mlock/mprotect in-process (see Memory Safety above). Where a host cannot disable swap, the swap device must be encrypted — documented as the deployment precondition rather than assumed away.

No crash reporters (row A09-27): “We run no crash reporters. Period.” Neither the relay nor the web application links a Sentry/Bugsnag-class SDK, and no crash path uploads memory context. This is a statement of fact about the build, verifiable by inspecting the dependency tree (cargo tree, pnpm ls).

Structured, allowlist-only logs (row A09-28): the log schema is exactly the field set published on Transparency — timestamp, method, path, status, latency, bytes. The LogSafe proc-macro that makes unsafe fields a compile error lives in the relay repository; publishing its source is pending the source-repository release (D-03 / crypto register), and the field allowlist is the part that is published today.

IP stripping at the edge (row A09-29): the Caddy access log deletes the client-IP fields at the encoder, and the app never reads X-Forwarded-For. The integration test that asserts no X-Forwarded-For header reaches the application is a relay-repository artefact — not published here, because it lives outside the website mandate (D-20); the invariant itself is what the no addresses are logged row of the transparency table asserts.

Rate limiting by proof-of-work (row A09-30): the challenge spec and the target relay configuration are published at Rate Limits (Proof-of-Work); the relay-side migration off IP keying is tracked in the crypto register (pending, not silently assumed).