Threat model
Who sees what
Section titled “Who sees what”| Party | Sees | Doesn’t see |
|---|---|---|
| BitTorrent swarm, trackers, DHT | The server’s IP address and that it downloaded the torrent | Anything from the server: it never uploads |
| iroh relays / network observers | That two endpoints talked, and roughly how much data moved | Plaintext, file names, the torrent name, the key |
| Someone with the ticket only | The ciphertext, file sizes and file count | Contents, file names, torrent name |
| Someone with the ticket and the key | Everything | — |
| Someone with the ticket and the reset token | Can switch the server to another torrent | The key for the current torrent |
A notifier without include_key |
The ticket, torrent name, size, file count | The key |
| Someone with root on the server during the download | Plaintext on disk | — |
Promises
Section titled “Promises”These are things deaddrop promises. Breaking one is a security bug:
- Confidentiality: no plaintext file contents, file names or torrent name
without the key. The key is never written to the server’s disk or sent to a
notifier without
include_key. - Integrity:
fetchnever accepts tampered or wrong-key data and never writes a partial file under its real name. - Client file system: a malicious server can’t make
fetchwrite outside the output directory. - No seeding: no torrent piece data is uploaded and no incoming BitTorrent connections are accepted.
- Single use: a second client can’t download from a single-use server, and an old ticket stops serving data after a reset.
- Reset protocol: no reset without the right token, and a reset source is never read as a path on the server’s disk.
- Secrets in output: webhook URLs and reset tokens don’t show up in logs,
deaddrop config checkor error messages.
Known limits
Section titled “Known limits”Hardening tips
Section titled “Hardening tips”- Send the ticket and the key over different channels.
- Prefer the config file (
chmod 600) or environment variables over command-line flags for webhook URLs, reset tokens and the key, to keep them out of shell history andps. - Use a long random reset token, e.g.
openssl rand -hex 32. - Only give
include_keyto notifiers you trust with the data. - Don’t send the server’s stderr to a persistent log, or treat that log as a secret.
- Verify release downloads against
SHA256SUMS.