Migrating compression

(and other updates)

Table of contents

  1. Updates
  2. New alternative payment methods
  3. Token deliveries
  4. Website changes
  5. Verifying OpenVPN server certificates
  6. Compression migration
  7. Conclusion

Updates

This blog post is a brief summary of what's new with cryptostorm, for those of you not following our Twitter. TLDR: Yes, we're still here. No, we're not going anywhere anytime soon.

Firstly, apologies for the radio silence. I (df) was working on other projects for most of 2023, so it was just Fermi running things. I'm back at CS full time though, and not planning on doing anything else for the foreseeable future. In my absence, about 18% of the network was down thanks to a few data centers deciding to arbitrarily migrate server IPs with poor notification. So naturally, the first thing I did when I returned about 2 months ago was fix or replace those dead servers. Now https://cryptostorm.is/uptime shows the network's back up to 99% or so. I also upgraded everything that needed upgrading, and bought a Singapore server. The web chat thing on the main website is fixed too (the IRC server behind it was fine, only the web interface was broken).

The forum's domain (cryptostorm.ch) also died while I was gone (new ID requirements at that particular domain registrar that we didn't respond to quickly enough), but I've decided to leave it dead. The forum was a mess of ancient posts from over a decade ago (some containing obsolete instructions that people would still attempt), and a horde of spambots. It took a lot of time and energy to maintain, and since it was powered by the elderly monstrosity that is phpBB, we kept it isolated in it's own little corner away from any of the other servers to minimize the damage if it was ever compromised by some zero-day. If you want to read any of the old posts, most of the archive sites have it saved (archive.is, archive.org, etc.).

We also had to abruptly stop using CoinPayments.net as a crypto payment processor, something to do with a 3rd party crypto wallet hosting service they were using going under. Fermi was manually processing XMR orders during that period, but it left only BitPay for BTC/ETH orders, and BitPay has gotten very... KYCey in recent years. Kinda goes against the whole point of using cryptocurrencies to regain some degree of anonymity. We'll keep BitPay for those who already use them, but I've also implemented an alternative to it (and CoinPayments.net's replacement), described below.

The free service (cryptofree) has also been discontinued. Details are at https://cryptostorm.is/cryptofree

New alternative payment methods

We decided to replace CoinPayments with the cryptocurrency payment processor NOWPayments.io, who supports around 200 different coins/tokens (including the ones BitPay supports) without all the KYC nonsense. Instead of using their checkout interface, I wrote up a custom one that runs on our side and talks to their API, mainly to minimize the amount of customer data sent to them. Our side connects to them, spits out the receiving wallet address, you send the crypto to it, then once our side confirms receipt through their API, you get redirected to a page where your CS access token is delivered. No email necessary, and just to make it easier on Tor Browser users who have the 'Safest' security level set, no JavaScript is used either. 

I've also replaced the manual XMR (Monero) processing we were doing with an automated setup. NOWPayments supports XMR too, but if you don't like the idea of sending crypto payments to a third party processor, you can use our XMR/Monero checkout option. It uses a private Monero node we're running on an dedicated server, and it also doesn't require email or JavaScript.

A few days ago, I also set up renewing subscriptions through our CCBill payment processor, for people who wanted a renewing subscription but didn't want to use PayPal for whatever reason.

Token deliveries

One common complaint we've heard over the years is how the VPN access token is delivered by email in plaintext. The email does use encryption, but that's only between our mail server and your mail server. Usually, I would respond by explaining how the VPN access token is only used for authentication, not encryption. The worse someone reading your emails would be able to do is perform a DoS attack by accessing our service with your token and hitting the device limit.

The template we've been using for email deliveries did look a bit dated, so while I was modifying everything for the new payment methods, I decided to rewrite the code behind the old payment processing backends. Now when you order using a payment method that requires email delivery (PayPal or CCBill subscriptions), you'll receive a short email that looks like:

When you click the button, you'll get sent to a link that looks like:
https://cryptostorm.is/token?[random_encrypted_data]
On that page will be your VPN access token, along with instructions needed to connect to the VPN. For people who have HTML rendering disabled in their email client, a plaintext version of the email will show instead.

Also on that /token? page, at the very bottom, is a small  button. If you click that, it will remove the only copy of your plaintext token from our database (after confirmation that you understand that we can't recover your token if you lose it after doing this). Now, if someone ever got access to your inbox, they wouldn't be able to steal your access token anymore (if you've deleted it). Payment methods that don't do email delivery (everything besides recurring PayPal/CCBill subscriptions) will also use the same /token? page format, so everyone will have access to this "delete token" feature.

Website changes

Most people won't notice the difference, but while I was editing the main page to add the new payment methods, I also addressed something that's been on my todo list for ages. We were loading a custom font for things like the text in the logo and section headers, but Tor Browser refused to load it because fonts not included with the browser could be used to identify individual devices. It seemed silly loading an entire font when we're only using it for a couple of things, so instead I converted all of the section headers and the logo (and the Font Awesome icons) into PNG images. Now the website looks the same in Tor Browser with the highest security setting as it does in any other browser. There's still some JavaScript, but if you've got that disabled the site will load correctly, with only a couple of payment methods disabled (the ones that require JS), and that smooth scrolling thing that happens on the main page will also be turned off.

Verifying OpenVPN server certificates

We've also added --verify-x509-name to all of the client-side OpenVPN configs. Before, the server-side TLS certificates had a CN (common name) of "cryptostorm server". The problem with using the same CN for every server is that if the server-side private key was ever compromised, an adversary could impersonate any of our servers, if they also had the ability to manipulate your traffic or ours. The key can't be used to decrypt previous traffic (those keys are ephemeral, and rotated every 20 minutes), but it could still be useful in a MiTM attack. Now, each server uses a CN specific to that server's location. That means if an attacker was somehow able to steal our server-side private key, they would now be limited to only impersonating that individual server and not any other one. 

Keep in mind, our OpenVPN private keys aren't permanently stored on the server's hard drive. Once OpenVPN is up and running, the keys are securely deleted since OpenVPN will have them in memory and can access them from there. The addition of --verify-x509-name is mainly to minimize the damage if someone with physical access to the server successfully performs a cold boot attack where the private key is taken directly from RAM.

And as for WireGuard, it doesn't do X.509/TLS, but something like --verify-x509-name isn't necessary since the public key (listed on https://cryptostorm.is/wireguard) essentially does the same thing. The client will only connect to a server matching that public key, so if one of our server-side WireGuard private keys were ever compromised, the attacker would be limited to impersonating that specific server and not the others. But we're also securely deleting the server-side WireGuard private key once the WireGuard interface is up and running, just to be safe.

Compression migration

In 2018, the VORACLE vulnerability was disclosed, and we changed our setup to accommodate for it. We kept --compress in our ECC configs to enable compression framing, which allows people who don't care about VORACLE to continue using compression, while essentially disabling it for everyone else. OpenVPN has said that they eventually plan to ditch compression entirely, so we're going to start migrating away from it. The problem is that we can't just remove it entirely because then the people who aren't using the latest configs won't be able to connect. Luckily, with OpenVPN 2.6 came a new --compress migrate option, which we've already started using server-side. Relevant bits from the manual:

--compress algorithm 

Using migrate as compression algorithm enables a special migration mode. It allows migration away from the --compress/--comp-lzo options to no compression. This option sets the server to no compression mode and the server behaves identical to a server without a compression option for all clients without a compression in their config. However, if a client is detected that indicates that compression is used (via OCC), the server will automatically add --push compress stub-v2 to the client specific configuration if supported by the client and otherwise switch to comp-lzo no and add --push comp-lzo to the client specific configuration.

Essentially, this means compression is disabled for everyone. People connecting with the latest configs won't be using any compression at all, and people connecting with the old configs that still have --compress in them will be switched over to stub-v2, which in this context is the same as no compression. Also from the manual:

stub-v2 is essentially identical to no compression and no compression framing as its header indicates IP version 5 in a tun setup and can (ab)used to complete disable compression to clients.

Doing it this way should give everyone still using the old configs time to switch over to the latest. 

Conclusion

Again, sorry for the lack of posts. I'll start testing the best ways to multihop with WireGuard since people keep asking for a blog post explaining how to do that. Most of the tutorials I've seen are more for LAN VPNs and not commercial VPN services. It's tricky in our setup because the 1 week/month token customers are limited to 1 WireGuard key, which also restricts them to one 10.10.x.x IP, and most systems won't let you have two network interfaces with the same IP. I'm pretty sure it's doable with Linux namespaces though. For people with a token > 1 month, they can just create two WireGuard keys and use something like this.

Posted on