Star now comes with 50 GB instead of 15, and the price is the same. Use code for 30% off your first 3 months - limited to the first 10 people. Get started

Our code audit, and the fixes

Our code audit, and the fixes

Recently someone went through our source code in the open and published a list of the problems they found, and they were right about most of what they wrote. We told everyone we would come back with a full account of every issue and what we did about each one. We also want to say clearly at the start that we did not sit on any of this, because every one of the critical issues was patched and deployed to production within 24 hours of the report going up, and the rest followed shortly after. This post is the detailed version, going through the findings one by one.

Post-quantum encryption

The finding that got the most attention was about our post-quantum encryption. Our site said your messages were protected with post-quantum cryptography using ML-KEM-768, and the code as it shipped did not actually do that, because it generated the keys and uploaded the public half to the server but discarded the secret half before saving it, so the post-quantum layer sat in the project without ever being connected to anything that encrypted your mail. Your messages were still being encrypted the entire time with ECDH P-256 and the Double Ratchet, which is strong and verifiable, but it is not post-quantum. We took the claim down within hours, and then we did the work for real by wiring ML-KEM-768 into our X3DH and Double Ratchet for Aster-to-Aster messages, and it now passes our full post-quantum test suite.

Email password recovery

When you turned on email based password recovery, the client was sending up the encrypted vault and the key that decrypts it together in the same request. We turned the feature off on the server within hours of confirming it, and we contacted every account that had ever enabled it to recommend they rotate their password.

Tor failing open

If Tor failed to start, the request would go out over the normal internet without warning you. It now fails closed, so if Tor is not running the request does not leave your device and you are told why.

Password hashing

Our documentation said we used Argon2id for password hashing while the code was actually using PBKDF2 with a high iteration count. We moved the code over to Argon2id so that what runs on your account matches what we tell you.

The protocol fixes

Several of the remaining issues were in the messaging protocol. Our Double Ratchet implementation was skipping an authentication step that the specification requires, and that step is in place now so that message headers are authenticated the way they should be. Signatures on inbound encrypted mail were not being verified, and they are verified now with the result shown to you. Our signed prekey was built on an RSA-4096 key where an elliptic curve key belongs, and moving it to an elliptic curve key corrected that and made registration fast again at the same time. One clarification, since this is the part that gets mixed up the most, is that this only applied to the messaging prekey, and our OpenPGP email layer still uses RSA-4096 on purpose, because those keys are portable and work with any standard PGP client you bring.

The app fixes

Another set of issues was in the apps rather than the cryptography. The desktop app had given the part that renders web content the ability to make any network request, and we removed that ability, limited what the renderer is allowed to talk to, and tightened the content security policy so that inline scripts are no longer allowed at all. The tokens that let you switch between accounts had been protected with a key kept in plaintext right beside them, and those are stored properly now. The biometric lock on mobile was just a switch in the interface with no key tied to your fingerprint or your face, and that is handled in the native mobile app, where unlocking is bound to a key held in the device keystore. The check that was meant to block cleartext connections over Tor was matching on a substring instead of the real hostname, and it reads the real hostname now.

All of these are fixed and deployed, and because our code is open under AGPL you can read the commits and see exactly what changed and when.

Share:

Related posts

Hi, we're Aster. Here's what we care about.
Company News

Hi, we're Aster. Here's what we care about.

Aster's mission and the five values we won't trade away: privacy as a right, security that's easy, full open source, no lock-in, and answering to users, not investors. With receipts.

How Aster encrypts your email
Engineering

How Aster encrypts your email

A complete, honest look at how Aster encrypts your email — from key derivation and post-quantum protection to the metadata we store in plaintext and why.

What does "end-to-end encrypted" really mean
Engineering

What does "end-to-end encrypted" really mean

An exact list of what Aster Mail encrypts on your device, what our servers can still see, and an honest explanation of why each piece of metadata exists.