Agent
Version 2.1.0
- Released November 8, 2026
Security
- Option to block changes to
PreUp,PostUp,PreDown, andPostDownWireGuard scripts from the C2 (these scripts allow arbitrary shell commands to be run as root). To enable this option, (block changes to scripts) add the following environment variable to the agent:The default value for this environment variable currently isCRUX_ALLOW_PRE_POST_SCRIPTS=falsetrue; we intend to change the default value tofalsefor the July 2027 release.
Added
- Support for C2 batch enrollment.
- Support for SKA-P registration with client credentials.
- New
--reinstalloption for Linuxinstall.shto re-install clean version of all the agent's Python libraries, as well as its service scripts. - CycloneDX SBOM now published with release.
Changed
- Upgraded to Arqit SKA-Platform™ Python SDK version 26.06.
- Python 3.10 is now the minimum required version of Python.
- Linux
install.shautomatically installs and uses Python 3.14 on RHEL 9 and derivatives if still using Python 3.9. - Linux
install.shnow prompts to re-install the agent's Python libraries if run with a newer version of Python than originally installed with (for example, after the OS has been upgraded to a new major release). - Linux
install.shnow prompts to remove tunnels, deregister, and delete all agent config files when run with the--removeoption.
Fixed
- Avoid
Files in usedialog during agent upgrade on Windows by first stopping Crux tunnels and tray before starting upgrade. - Include MSVCP140.dll & VCRUNTIME140.dll on the path of the Windows
tunnel service; on systems without these DLLs installed by other
software the tunnel would fail to start with a generic message like:
The service did not respond to the start control request in a timely fashion. - Maintain calculated IPv4/IPv6 preference when reloading config file.
- Fix boolean coercion for
read_only_cnfconfig property. - Log "request registration config..." only after agent setup.
- Log fatal exceptions in Windows service to main log once the main Python logging system has been initialized.
- Fixed container image to install agent into
/opt/crux-agent/instead of/opt/venvs/crux-agent/. - Fixed container image README to provide correct package-list command.
Version 2.0.4
- Released October 21, 2026
Security
This release resolves the following vulnerability:
-
Compromised eMudhra CA certificate: Starting with release 2.0.0, the Crux agent uses the operating system's trust store to validate the TLS certificates of the Crux C2 and SKA-Platform servers when it connects to them over HTTPS; so therefore, to distrust the compromised eMudhra CA certificate with the standard Linux or Windows version of the agent, you should update the host operating system's trust store (and then restart the agent service).
When run inside a Docker container, however, the agent uses the container image's trust store; the standard agent container image is based on Alpine Linux, which included the compromised CA cert in its trust store from summer 2025 to 20 Oct 2026. The 2.0.4 release of the Crux agent includes a new container image with the updated Alpine Linux trust store, which no longer trusts the compromised CA cert.
Prior to release 2.0.0, all versions of the Crux agent used a trust store bundled with the agent, in the
certifiPython package. To distrust the compromised eMudhra CA certificate with those versions of the agent, manually edit thecertifipackage's trust store, remove the compromised eMudhra CA certificate from it, and then restart the agent service.On Linux, prior to 2.0.0, the agent's
certifitrust store was at/opt/venvs/cruxvpn-agent/lib/python*/site-packages/certifi/cacert.pem. On Windows, the agent'scertifitrust store was located atC:\Program Files\Sirius Computer\Crux VPN Agent\lib\certifi\cacert.pem.This file can be opened with any text editor; search for the string
emSign ECC Root CA - C3inside the file to find the compromised certificate, and delete the certificate block immediately following that string, beginning with and including the-----BEGIN CERTIFICATE-----line, and ending with and including the next-----END CERTIFICATE-----line.Separately from the HTTPS requests made by the Crux agent, on Linux the agent relies on the Python Pip package manager to update the Python packages that comprise the agent. Pip itself should be updated to distrust the compromised eMudhra CA certificate. Run the following command for the Linux agent 2.0.0 or newer to upgrade its copy of Pip:
sudo /opt/crux-agent/bin/pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70"For Crux agent releases prior to 2.0.0, run this command to upgrade Pip:
sudo /opt/venvs/cruxvpn-agent/bin/pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70"
Version 2.0.3
- Released October 9, 2026
Security
This release resolves the following vulnerability:
| Severity | CVE Identifier | Published | Updated | Exploitability | Mitigating Factors |
|---|---|---|---|---|---|
| Medium | CVE-2026-107785 | October 9, 2026 | October 9, 2026 | Low | Only affects agents using SHA-512 for SKA peering |
-
CVE-2026-107785: With agent versions 1.9.0 through 2.0.2, if the initiator of SKA peering was configured to use the
SHA-512hash function for peering (instead of the defaultSHA-256hash function), the agent would fail to apply the secret keys derived from SKA peering to its running Crux tunnels. When this happened, the only indication of a problem would be a cryptic "Found trailing character in key file" warning message written to the agent's local log output.Furthermore, if the organization's "Enforce SKA Use" setting was set to "No", and the agent was configured to use the
SHA-512hash function before its first start-up, the agent would start up with useable Crux tunnels, but no SKA-derived secret keys would ever be applied to the tunnels (and therefore the tunnels would not be quantum safe).This version of the agent is fixed to correctly apply secret keys from SKA peering, regardless of the SKA peering hash function selected. Alternatively, this issue can be fixed by removing any custom "Hash Function" settings applied in the C2 web UI (see the Agent Configuration docs for details).
Changed
- Removed deprecated
secretparameter from API setup request.
Fixed
- Fixed logging initialization to include SKA log entries when a custom logging configuration file is used.
- Fixed openSUSE Leap 16 install error where the install script would not automatically find the default system Python path.
- Fixed Rocky Linux 8 install error due to needing the
expatpackage installed. The error printed by the install script is:RunningError: Command '['/opt/crux-agent/bin/python3', '-m', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1./opt/crux-agent/bin/python3 -m ensurepipwill further reveal this specific error:ImportError: /usr/lib64/python3.12/lib-dynload/pyexpat.cpython-312-x86_64-linux-gnu.so: undefined symbol: XML_SetBillionLaughsAttackProtectionMaximumAmplification
Version 2.0.2
- Released July 29, 2026
Fixed
- Fixed tray start-up failure on Windows 11. Resulted in a dialog box
with a stack trace that ends with following error:
AttributeError: 'NoneType' object has no attribute 'split'
Version 2.0.1
- Released July 27, 2026
Fixed
- Fixed tunnel start-up failure on Ubuntu 25.04 and newer. Resulted in
error message like the following in the
crux-wg@crux0service log:/usr/bin/wg-quick: line 40: /etc/crux/crux0.conf: Permission denied
Version 2.0.0
- Released July 20, 2026
Added
- Windows UI via system tray icon. Icon shows status of Crux tunnels. Right-click icon to show more detailed information, and to start and stop tunnels.
- Windows installer option to automatically copy a downloaded setup file to the Crux configuration directory.
- Linux env vars file at
/etc/default/crux-agent. - NOTICE file in release packages with information about each bundled third-party library and its license.
Changed
- Rebranded from
Crux VPNto justCrux, renaming all files, directories, and services that previously hadcruxvpnin their names tocrux; plus some additional name changes detailed below. The Windows installer and Linux install script will automatically make all necessary name changes when upgrading from 1.x to 2.x. Docker upgrades need to follow steps in the Docker 2.0 Upgrade documentation. - WireGuard tunnel and driver now bundled with the agent on Windows (no longer need to separately install WireGuard for Windows).
- Now uses the system trust store by default (instead of the bundled
Certifi trust store) to verify TLS certificates (except on Python 3.9,
which still uses Certifi). New
CRUX_CA_BUNDLEenvironment variable allows specifying an alternate CA bundle, via one of the following values:system(default): System trust store.certifi: Certifi trust store.- Path to CA cert bundle file (eg
/etc/ssl/cert.pem).
Fixed
- Fixed install script to install the required libsodium package on openSUSE Leap 16.
Renaming Crux VPN to Just Crux
Following are the principal name changes on each platform; see the Upgrade the Agent platform-specific documentation for full details:
- All platforms:
- Agent config file name changed from
cruxvpn.conftocrux-agent.conf - Agent credentials file name changed from
cruxvpn-credentials.conftocrux-credentials.conf - Agent setup file name changed from
cruxvpn-setup.conftocrux-setup.conf - SKA-P registration file name changed from
cruxvpn-registration.conftocrux-registration.conf - Main binary file name changed from
cruxvpn-agenttocrux-agent - SKA-P registration binary file name changed from
cruxvpn-registertocrux-register - Environment variable prefix changed from
CRUXVPN_*toCRUX_*
- Agent config file name changed from
- Docker only:
- Image name changed from
ghcr.io/siriuscomputer/cruxvpn-agenttoghcr.io/siriuscomputer/crux-agent-ska - Image config directory changed from
/etc/cruxvpn/to/etc/crux/
- Image name changed from
- Linux only:
- Agent service name changed from
cruxvpn-agenttocrux-agent - Tunnel service name changed from
cruxvpn-wg@crux0tocrux-wg@crux0 - Config directory changed from
/etc/cruxvpn/to/etc/crux/ - Root program directory changed from
/opt/venvs/cruxvpn-agent/to/opt/crux-agent/
- Agent service name changed from
- Windows only:
- Agent service name changed from
cruxvpn-agent-servicetocrux-agent-service - Tunnel service name changed from
WireGuardTunnel$crux0toCruxTunnel$crux0 - Agent config directory changed from
C:\Program Files\Sirius Computer\Crux VPN Agent\cnf\toC:\ProgramData\Crux\cnf\ - Tunnel config directory changed from
C:\Program Files\WireGuard\Data\configurations\toC:\ProgramData\Crux\cnf\ - Log directory changed from
C:\Program Files\Sirius Computer\Crux VPN Agent\log\toC:\ProgramData\Crux\log\ - Root program directory changed from
C:\Program Files\Sirius Computer\Crux VPN Agent\toC:\Program Files\Crux\
- Agent service name changed from
Version 1.18.0
- Released April 19, 2026
Added
- Added Windows code signing to MSI package (as well as to all EXE, DLL, and PS1 scripts in the MSI package).
- Added Sigstore signatures to artifact downloads.
- Added "inbound" and "all" options to MSS clamping script.
Changed
- Upgraded to Arqit SKA-Platform™ SDK version 26.01.
- Upgraded other dependencies to latest versions (that still support Python 3.9).
- Individual SKA API endpoint settings (such as UserAuth, Dscc, etc) have been completed replaced by Domain and Use TLS settings (configurable via SKA-Platform admin page in Crux web UI).
Fixed
- Fixed a potential race condition when deleting empty deviceMetadata.json files, now deleting them only when more than 2 minutes old. Failed SKA-P device registration can create an empty deviceMetadata.json file; but this file may also be emptied temporarily by the backround SKA authentication thread.
- Prevent connectivity-check pings from keeping a tunnel active when no other traffic has been sent through it for more than 2 minutes.
- Allow agent to start up in reduced-functionality mode when SKA libs are missing.
Version 1.17.0
- Released March 4, 2026
Added
- Collect connectivity issues and send them to Crux API.
- New connectivity checks for individual WireGuard peers, including
attempting to send traffic through connections with a recent
WireGuard handshake (disable by setting
CheckWgPeerPingTimeout = 0in the agent config). - Collect host inventory properties and send them to Crux API.
- Send SKA DUID to Crux API.
Changed
- Now exponentially backs off Crux API requests after encountering 4 consecutive error responses, up to the point of 1 request every 1-2 hours (downside is it may take an hour or two for an agent to start communicating with the Crux API again after a connectivity issue has been fixed). This back-off does not apply to communication with SKA API or peers.
- Changed the formatting of connectivity checks on agent start.
- Changed systemd service to not drop CAP_NET_RAW capability, allowing the agent to make true ICMP ping requests.
- No longer tries to de-register & re-register with SKA-P on terminal authentication failure; instead propagates error as connectivity issue to Crux API, allowing Crux API to factory-reset device (if so configured).
- Handle device-policy verification errors by deleting
devicePolicy.jsonconfig file (which should be replaced on next device-policy update).
Version 1.16.1
- Released February 1, 2026
Changed
- During agent set-up, config settings from cruxvpn-setup.conf now override any settings from an existing cruxvpn.conf file (but settings not overridden by cruxvpn-setup.conf are preserved).
- Allow set-up process to run even when
ReadOnly = truesetting in agent config. - More logging for Crux API calls.
Version 1.16.0
- Released January 17, 2026
Changed
- Agent now pulls its own configuration from Crux API by default, overwriting manual cruxvpn.conf settings (see Agent Configuration documentation for details).
- Agent now pulls SKA-P registration settings from Crux API if available and cruxvpn-registration.conf not supplied (see SKA-P Registration documentation for details).
- Agent now can use use single cruxvpn-setup.conf file for set-up.
Version 1.15.1
- Released December 9, 2025
Fixed
- Fixed Linux install script download of pre-built liboqs when using
older versions of curl; previously would error with this message:
curl: option --no-clobber: is unknown
Version 1.15.0
This release fixes a DNS-resolution issue that will prevent the agent from working properly with its default DNS settings after December 15, due to an incompatibility between its previously default DNS resolver (Quad9, aka 9.9.9.9) and the way it resolves DNS by default (using DNS-over-HTTPS, aka DoH, with HTTP 1.1).
- Released December 7, 2025
Added
- Ability to re-provision device after SKA Device Recovery action is invoked.
Changed
- Made host system's own DNS resolver the default; new default is
the same as this cruxvpn.conf setting:
[Cruxvpn] Dns = off - Updated default settings to use new SKA version 25.9 URLs
and PaaS region as default; new defaults are the same as these
cruxvpn.conf settings:
[SKA] Region = ska Domain = ska.quantum.cloud [SKA.API] UserAuth = https://api.ska.quantum.cloud - Updated default settings for SKA update intervals; new defaults are
the same as these cruxvpn.conf settings (intervals in seconds):
[SKA] HeartbeatInterval = 120 DevicePropertiesInterval = 3600 DevicePolicyInterval = 600 - Enabled cruxvpn.conf file to use
[SKA]and[SKA.API]sections, and enabled cruxvpn-registration.conf file to use[SKA.Registration]section, in place ofPQCprefixed sections (butPQCsections will still work as before for the time being). - Renamed SKA-related modules and logging to use "ska" identifier in place of "pqc".
Fixed
- Fixed DNS errors querying default DNS server after December 15.
- Fixed initiators to not wait until next scheduled interval to agree on new keys after re-registration.
Version 1.14.0
- Released November 11, 2025
Changed
- Upgraded Arqit SDK to version 25.12-alpha1.
- Python 3.9 is now the minimum required version of Python.
Fixed
- Fixed documentation URLs in logging and help files.
Version 1.13.2
- Released November 3, 2025
Fixed
- Avoid skipping some changes when multiple queued changes are applied at the same time.
- Avoid breaking the tunnel for queued changes that include/require a restart of the interface.
Version 1.13.1
- Released October 24, 2025
Changed
- Changed canonical OCI image name from
ghcr.io/crux-comms/cruxvpn-agenttoghcr.io/siriuscomputer/cruxvpn-agent. - Disabled cosign build signing temporarily (until other infrastructure pieces are moved into place).
Version 1.13.0
- Released October 19, 2025
Changed
- Break the tunnel to a device when it is quarantined, de-registered, or removed from all security groups in common (when belonging to an organization that requires a common security group to agree on a key).
- Optionally break the tunnel to a device when the time since its last symmetric key rotation exceeds the configured max TTL.
- Save keys agreed with unknown SKA-P devices.
- Upon learning a WireGuard peer is a SKA-P device, either apply its saved key, or generate a dummy key to prevent the tunnel to it from being used until the first secret key is agreed.
- Start initiating symmetric key agreements right after SKA-P registration, instead of waiting 90 seconds for device UIDs to propagate.
- Pause SKA initiators in a 25-second "blackout" window around the expected WireGuard handshake.
- Enable a "rotate now" command from the web UI to force immediate symmetric key rotation.
Version 1.12.1
- Released September 26, 2025
Fixed
- Fixed missing log output on Windows.
- Avoid doing client-side DNS resolution for API calls when using an HTTP proxy.
Version 1.12.0
- Released August 1, 2025
Changed
- Change the agent's core monitoring logic to:
- Ignore interfaces outside of the configured WireGuard directory (previously would report on all WireGuard interfaces)
- Report on down interfaces (previously would ignore them)
- Flip IPv6/IPv4 preference if connectivity check to API fails, and try it with the other address family.
- Run DNS queries to secondary DNS servers in parallel, if primary takes too long to respond.
- If custom DNS servers specified, query them with UDP by default
(unless the URL or hostname with which they can be queried with DoH
is also specified via the
Dohsetting; or unless the DNS servers are from well-known DoH providers).
Fixed
- Fixed
ReadOnlysetting to block changes from being applied on client.
Version 1.11.2
- Released July 25, 2025
Changed
- Send custom application name, version, and developer name to device properties API (eg "Crux Linux Agent 1.11.2 by Sirius").
Fixed
- Don't automatically retry registration if 1st attempt fails. Now if registration fails, an administrator must correct the issue, and then manually restart the agent.
- Fix registration mode to always use uppercase values (eg
QKEY). - Better error messages when missing required registration config
settings (such as
Realm). - Fixed pre-built liboqs download logic in install.sh script to ignore minor OS versions when checking for available downloads.
- Fixed install.sh to run ldconfig only if a library path was added.
- Don't try to load agent conf files from
/etc/wireguard. - Avoid writing
deviceProperties.jsonwhen no props have changed.
Version 1.11.1
- Released July 6, 2025
Added
- Allow custom SKA-P domain to be configured in agent conf via
Domainsetting, as a shorthand for setting each individual SKA-P API endpoint. - Allow
QKeyandQKeyIdsettings in agent registration conf. - Allow agent conf settings to be specified as base64;
eg:
PasswordBase64 = cGFzc3dvcmQgIyAxMjM=.
Fixed
- Allow
#characters inPasswordsetting of agent registration conf. - Fix startup sequence to not miss DUID updates that occurred while agent was not running.
Version 1.11.0
- Released June 14, 2025
Added
- Connectivity checks for Arqit SKA-Platform™ (SKA-P).
- "Offline" mode for non-essential SKA-P endpoints;
engaged via the following /etc/cruxvpn/cruxvpn.conf settings:
[PQC.API] MonitorHeartbeat = offline MonitorProperties = offline Policy = offline
Changed
- Bundle Arqit SKA-Platform™ SDK into agent tarball.
Fixed
- Enable communication with Crux API even when no SKA-P connectivity; and enable SKA-P peering and communication with SKA-P endpoints even when no Crux API connectivity.
Version 1.10.0
- Released May 30, 2025
Added
- Agent MSI builds via GitHub Actions.
- Liboqs DLL builds via GitHub Actions.
Changed
- Download liboqs.so if pre-built version available (rather than always build it from source) on install.
- Default the location of device*.json files to the same directory as the cruxvpn.conf file (rather than always /etc/cruxvpn) if not explicitly specified.
Version 1.9.3
- Released May 29, 2025
Added
- "Offline" mode for interacting with the API server, where the
agent will not attempt to connect to the API server if you
change its /etc/cruxvpn/cruxvpn.conf
Apisetting to this:Api = offline
Version 1.9.2
- Released May 18, 2025
Added
- Tarball and container image builds via GitHub Actions.
Fixed
- Fixed agent name in crux0.conf comment.
- Fixed install.sh "wg-quick service definition not found" error on Debian Buster.
- Fixed liboqs build on Alpine Linux for 32-bit ARM (eg Raspberry Pi).
Version 1.9.1
- Released May 8, 2025
Added
- Automatically install iptables package (required for packet forwarding).
Changed
- Try to install newer Python on RHEL 8 variants on clean install (RHEL 8 default is Python 3.6; Python 3.8 or newer is required).
Fixed
- Clean up de-register/re-register cycle to avoid this error:
No such file or directory: '/etc/cruxvpn/deviceProperties.json'
Version 1.9.0
- Released May 3, 2025
Added
- Use Arqit SKA-Platform™ to generate WireGuard preshared keys.
- Automatically register device with SKA-Platform if not yet registered.
- Automatically start SKA-Platform peering socket receiver and initiators based on settings in WireGuard config.
- Build and install
liboqsas part of install script. - Option to redact preshared keys only.
Changed
- Use
/etc/cruxvpndirectory to consolidate all config files. - Define and use
cruxvpn-wgsystemd service in place of wg-quick service. - Improve handling of interrupt/terminate signals to shut down faster.
- Use
versioningitplugin to calculate agent version number.
Removed
- Remove support for Python versions older than 3.8.
- Remove old Windows EXE installer (deprecated by new MSI-based installer).
Fixed
- Explicitly set root log level to override log settings from libraries.
Version 1.8.0
- Initial Release