SkillAgentSearch skills...

Mullvadvpn App

The Mullvad VPN client app for desktop and mobile

Install / Use

npx skills add mullvad/mullvadvpn-app

Installs into whichever agent you are using.

About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Mullvad VPN desktop and mobile app

Welcome to the Mullvad VPN client app source code repository. This is the VPN client software for the Mullvad VPN service. For more information about the service, please visit our website, mullvad.net (Also accessible via Tor on our onion service).

This repository contains all the source code for the desktop and mobile versions of the app. For desktop this includes the system service/daemon (mullvad-daemon), a graphical user interface (GUI) and a command line interface (CLI). The Android app uses the same backing system service for the tunnel and security but has a dedicated frontend in android/. iOS consists of a completely standalone implementation that resides in ios/.

Releases

There are built and signed releases for macOS, Windows, Linux and Android available on our website and on GitHub. The Android app is also available on Google Play and F-Droid and the iOS version on App Store.

You can find our code signing keys as well as instructions for how to cryptographically verify your download on [Mullvad's Open Source page].

Platform/OS support

See Supported Platforms for details on which operating systems, versions and architectures are supported, and which ones are covered by our automated test suite.

Features

Here is a table containing the features of the app across platforms. This is intended to reflect the current state of the latest code in git, not necessarily any existing release.

| | Windows | Linux | macOS | Android | iOS | |-----------------------------------------|:-------:|:-----:|:-----:|:-------:|:---:| | WireGuard | ✓ | ✓ | ✓ | ✓ | ✓ | | Quantum-resistant tunnels | ✓ | ✓ | ✓ | ✓ | ✓ | | DAITA | ✓ | ✓ | ✓ | ✓ | ✓ | | WireGuard multihop | ✓ | ✓ | ✓ | ✓ | ✓ | | WireGuard over TCP | ✓ | ✓ | ✓ | ✓ | ✓ | | WireGuard over Shadowsocks | ✓ | ✓ | ✓ | ✓ | ✓ | | WireGuard over QUIC | ✓ | ✓ | ✓ | ✓ | ✓ | | Lightweight WireGuard Obfuscation (LWO) | ✓ | ✓ | ✓ | ✓ | ✓ | | Split tunneling | ✓ | ✓ | ✓ | ✓ | | | Custom DNS server | ✓ | ✓ | ✓ | ✓ | ✓ | | Content blockers (Ads etc) | ✓ | ✓ | ✓ | ✓ | ✓ | | Optional local network access | ✓ | ✓ | ✓ | ✓ | ✓* | | Externally audited | ✓ | ✓ | ✓ | ✓ | ✓ |

* The local network is always accessible on iOS with the current implementation

User security, privacy and anonymity

This app is a privacy preserving VPN client. As such it goes to great lengths to stop traffic leaks. And basically all settings default to the more secure/private option. The user has to explicitly allow more loose rules if desired. See the dedicated security document for details on what the app blocks and allows, as well as how it does it.

Secure development

Since the security of the users of the app is a top priority, by extension the security of the development and release process also becomes a top priority. This is something we work actively on.

OpenSSF Best Practices

Git signatures

All merge commits to the main branch must be PGP (gpg) signed in git. This signs off the entire feature branch. The individual commits in the feature branch do not need to be signed, unless they change one or more of the files deemed extra important.

The list of files requiring signatures to every commit that change them is defined in the verify-locked-down-signatures workflow.

Audits, pentests and external security reviews

This app is audited by external security experts and penetration testers every second year. We also carry out feature specific audits for certain security critical features and changes.

The results of these audits are always made public in their unredacted original form, for full transparency towards the users. See the audits readme for this.

Moreover, we welcome any individual to review the security of this app and submit any found issue to us. See SECURITY.md for more.

Checking out the code

This repository contains submodules needed for building the app. However, some of those submodules also have further submodules that are quite large and not needed to build the app. So unless you want the source code for all submodules you should avoid a recursive clone of the repository. Instead clone the repository normally and then get one level of submodules:

git clone https://github.com/mullvad/mullvadvpn-app.git
cd mullvadvpn-app
git submodule update --init

We sign every merge commit to the main branch as well as our release tags. If you would like to verify your checkout, you can find our developer keys on [Mullvad's Open Source page].

Binaries submodule

This repository has a git submodule at dist-assets/binaries. This submodule contains binaries and build scripts for third party code we need to bundle with the app, such as Wintun.

This submodule conforms to the same integrity/security standards as this repository. Every merge commit should be signed. And this main repository should only ever point to a signed merge commit of the binaries submodule.

See the binaries submodule's README for more details about that repository.

Building the app

See the build instructions for help building the app on desktop platforms.

For building the Android app, see the instructions for Android.

For building the iOS app, see the instructions for iOS.

Releasing the app

See this for instructions on how to make a new release.

Environment variables used by the service

  • TALPID_FIREWALL_DEBUG - Helps debugging the firewall. Does different things depending on platform:

    • Linux: Set to "1" to add packet counters to all firewall rules.
    • macOS: Makes rules log the packets they match to the pflog0 interface.
      • Set to "all" to add logging to all rules.
      • Set to "pass" to add logging to rules allowing packets.
      • Set to "drop" to add logging to rules blocking packets.
  • TALPID_FIREWALL_DONT_SET_SRC_VALID_MARK - Set this variable to 1 to stop the daemon from setting the net.ipv4.conf.all.src_valid_mark kernel parameter to 1 on Linux when a tunnel is established. The kernel config parameter is set by default, because otherwise strict reverse path filtering may prevent relay traffic from reaching the daemon. If rp_filter is set to 1 on the interface that will be receiving relay traffic, and src_valid_mark is not set to 1, the daemon will not be able to receive relay traffic.

  • TALPID_FIREWALL_DONT_SET_ARP_IGNORE - Set this variable to 1 to stop the daemon from setting the net.ipv4.conf.all.arp_ignore kernel parameter to 2 on Linux when a tunnel is established. The kernel config parameter is set by default, because otherwise an attacker who can send ARP requests to the device running Mullvad can figure out the in-tunnel IP.

  • TALPID_DNS_MODULE - Allows changing the method that will be used for DNS configuration. By default this is automatically detected, but you can set it to one of the options below to choose a specific method.

    • Linux

      • "static-file": change the /etc/resolv.conf file directly
      • "resolvconf": use the resolvconf program
      • "systemd": use systemd's resolved service through DBus
      • "network-manager": use NetworkManager service through DBus
    • Windows

      • iphlpapi: use the IP helper API
      • netsh: use the netsh program
      • tcpip: set TCP/IP parameters in the registry
  • TALPID_DISABLE_LOCAL_DNS_RESOLVER - Set this variable to 1 to disable the local DNS resolver (macOS only).

  • TALPID_NEVER_FILTER_AAAA_QUERIES - Set this variable to 1 to never ignore DNS AAAA queries (macOS only).

  • TALPID_FORCE_USERSPACE_WIREGUARD - Forces the daemon to use the userspace implementation of WireGuard.

  • TALPID_DISABLE_OFFLINE_MONITOR - Forces the daemon to always assume the host is online.

  • TALPID_CGROUP2_FS - On Linux, forces the daemon to look for the cgroup2 filesystem at the specified path, instead of /sys/fs/cgroup. The cgroup2 used for split tunneling will be created in this directory.

  • TALPID_NET_CLS_MOUNT_DIR - On Linux, forces the daemon to mount the net_cls controller in the specified directory if it isn't mounted already. This will only have an effect on older systems where cgroup v1 is used for split tunneling.

  • MULLVAD_MANAGEMENT_SOCKET_GROUP - On Linux and macOS, this restricts access to the management interface UDS socket to users in the specified grou

Related Skills

View on GitHub
GitHub Stars7.4k
CategoryDevelopment
Updated2h ago
Forks507

Languages

Rust

Security Score

100/100

Audited on Aug 8, 2026

No findings