Threat model
What Nullix protects
The content of messages, attachments, voice and video calls, and call setup. It is protected from the server, from network observers and from anyone who gets hold of the server or its data. With sealed sender, the server also doesn’t learn who sent a message.
What stays visible
That a connection exists, the anonymous ID an envelope is addressed to, timing, approximate size, your IP address at the network level while you’re connected, and a push token. Someone running the server who matched up connections in real time could still correlate some traffic, as with any centralized messenger. A proxy hides your IP address from the server.
Messages
- End-to-end encryption. Sessions use the Signal Protocol: X3DH or PQXDH to begin, and the Double Ratchet to move keys forward with every message, so one key can’t unlock earlier or later messages. A tampered message is rejected.
- Post-quantum key agreement. New sessions use PQXDH, which adds a Kyber key encapsulation, so traffic recorded today stays protected against future quantum computers.
- Sealed sender without a certificate authority. Your Nullix ID is the SHA-256 fingerprint of your identity key. Each client issues its own sender certificate, and the recipient checks it against the sender’s ID directly. No server hands out or vouches for identities.
- An anonymous delivery line. Sealed messages travel over a separate connection that is never signed in. The server refuses sealed messages on a signed-in connection, so a client mistake can’t link you to them. Strangers can’t use this line to spam you: it requires an access key that only your accepted contacts receive.
- Padding. Messages are padded to fixed size steps before encryption, so their length doesn’t reveal their content.
- Safety numbers. A number and a visual pattern let two people confirm that nobody is intercepting their messages.
- Message requests. Until you accept someone new, they get no profile, no delivery or read receipts, and their attachments stay closed.
- Delivery queue. Undelivered envelopes are held only until the recipient comes online, then deleted.
On your phone
- Encrypted storage. Chat history is stored in an encrypted database. Private keys are kept in the iOS Keychain or Android Keystore.
- Maximum protection. Keys are sealed with a key derived from your passcode (PBKDF2-SHA512, 600,000 rounds) combined with a secret held by the phone’s security chip, so a full copy of the phone’s memory can’t be decrypted elsewhere. When you leave the app, keys are wiped from memory. You can use a full password instead of six digits.
- Duress password. A second code that either opens an empty session or erases keys, chats and settings, indistinguishable on screen from a normal unlock.
- Erase after wrong attempts. After 3, 5 or 10 wrong passcodes, the app deletes its data.
- Remote erase. If a phone is lost, support can send it an erase command signed with a key that is never stored on the server. The server only relays signed commands and ignores anything else.
- Hidden chats, screenshots, clipboard and keyboard. Hidden chats sit behind Face ID or your passcode with anonymous notifications. Screenshots and screen recordings can be blocked. Copied messages stay on the device and clear after 10 minutes. The keyboard is asked not to learn what you type.
- Notifications without content. By default, notifications don’t include the message text.
- Encrypted backups. A backup file is encrypted with a key derived from your 12-word recovery phrase.
Calls and media
- Calls. WebRTC with media encrypted end to end between devices; call setup travels through the same encrypted channel as messages. Group calls connect up to 8 people directly.
- IP protection. Calls with people you haven’t accepted always go through a relay, so they never learn your IP address.
- Call log. On iPhone, Nullix calls stay out of Recents, which syncs to iCloud, unless you turn that on.
- Media metadata. Location, camera details and dates are removed from photos and videos before sending. If a video can’t be cleaned, it isn’t sent.
- On-device processing. Translation and voice transcription run on the phone. Shared locations are shown without loading maps from third parties.
Connection
- The connection to the server uses TLS with certificate pinning.
- If the direct route is blocked, the app tries backup entries. These carry an encrypted Noise tunnel (Noise_NK_25519_AESGCM_SHA256), checked against the standard’s test vectors.
- The list of backup entries is signed, and the app rejects lists without a valid signature.
- Anyone can run a proxy with a single command and share it as a link. A proxy only relays an encrypted stream and can’t read messages or see who talks to whom.
- App updates are delivered from our own update server and signed. The app refuses update code that isn’t signed by Nullix.
Our server
The server authenticates an anonymous ID by its public key, hands out public prekey bundles, routes encrypted envelopes and holds undelivered ones until the recipient comes online. It has no private keys to decrypt anything.
- Rules such as “Who can message me” are enforced on the server with access keys, so a refused call never wakes the phone.
- Web access logs are off, there is no history of connections, and logs never record who talks to whom. The system journal keeps one day.
- Services run as unprivileged users in a sandbox, each with only the access it needs.
- No message content, phone numbers, emails or contact lists are stored, so there is nothing of that kind to hand over.
Automated checks
| Suite | What it checks |
|---|---|
| Crypto | Encryption, rejection of tampered ciphertext, session recovery and safety numbers. |
| Post-quantum core | PQXDH sessions, key exchange in both directions and replay protection. |
| Sealed sender | Sealing and opening, rejection of forged certificates, and that the server never sees the sender. |
| End to end | Two clients exchanging messages through the server, with no plaintext on the server. |
| Tunnel and entry map | The Noise tunnel against reference vectors, and rejection of unsigned entry lists. |
| Device protection | Maximum protection, certificate pinning, signed updates and message requests. |
You can also run the encryption check on your own phone: Profile → Security & privacy → Diagnostics → Encryption check. It uses throwaway test keys and never touches yours.
Report a vulnerability
Email security@nullix.chat with a description, steps to reproduce and the impact you see. Please don’t access other people’s data or run destructive tests.