The Rust Crates Were Removed in Under Two Hours. The Build Hosts Still Need Incident Response.
The malicious Rust crates were removed from crates.io in less than two hours. That ended the distribution window. It did not end the incident for any developer workstation or CI runner that built them.
The important response question is not whether the packages are still available. It is whether Cargo already executed their build-time code inside an environment that held source code, signing material, cloud credentials or deployment tokens.
For affected organisations, this is a host-compromise investigation, not a dependency-cleanup exercise.
Update, 24 August 2026: Wiz Research has published second-stage malware analysis, quantified the crate’s prevalence and identified infrastructure overlap with earlier North Korean supply-chain campaigns. The new findings and their attribution limits are incorporated below.
Three legitimate crates pulled in the same malicious dependency
On 20 August 2026, an attacker used the publishing access of a legitimate crates.io maintainer to release poisoned versions of three established Rust packages:
arrayref 0.3.10internment 0.8.7append-only-vec 0.1.9
The Rust Security Response Team says it does not believe the maintainer acted maliciously. The team assessed that the maintainer’s computer or publishing credentials were probably compromised and locked the account as a precaution.
Each poisoned release depended on proc-macro1, an attacker-controlled package named to resemble the widely used proc-macro2 crate. The malicious dependency included a build.rs script that downloaded and executed a remote payload.
The legitimate proc-macro2 project was not compromised.
The build was the execution path
Nothing in an application needed to call the affected library. Cargo runs build scripts while compiling dependencies, so resolving and building one of the poisoned versions was enough to execute the downloader.
The original report to the RustSec advisory database described a cross-platform path. On Unix-like systems, the script wrote an executable to /tmp/rust-setup. On Windows, it used PowerShell and VBScript files in the temporary directory. The downloaded program was launched without normal compiler output drawing attention to it.
The malicious package also copied genuine proc-macro2 source and metadata designed to look familiar. A build could finish successfully while the payload ran separately. Green CI status was therefore not evidence that nothing happened.
This is why build infrastructure deserves production-grade security controls. A build system routinely receives code from registries and executes it with access to valuable organisational secrets. Package installation and compilation are code-execution events, even when teams mentally classify them as dependency management.
The second stage was a persistent backdoor
Wiz Research later analysed the binaries retrieved by the build script. The second-stage implant supported x86_64 Linux, Windows and macOS, as well as Apple silicon. It beaconed through HTTPS POST requests, installed user-level persistence and accepted commands to terminate, change its configuration or download and execute additional PowerShell or shell scripts.
On Windows, the malware used a Registry Run key. On macOS, it used a LaunchAgent. On Linux, it installed a systemd user service. If the primary command server became unavailable, the implant could generate ten candidate .com domains every five days.
The browser impact needs precise wording. Wiz initially described credential theft, then corrected its report: the implant queried saved-login records and extension settings in Chrome, Brave and Edge, but did not retrieve the encrypted credential material. That correction narrows one collection claim, but it does not reduce the host-compromise conclusion. The operator still had a remote script-execution capability and a persistence mechanism.
The registry warning became part of the lure
The attacker did more than publish a bad version of arrayref. Shortly after releasing version 0.3.10, the compromised account yanked several recent legitimate versions.
Existing lockfiles could continue using a yanked release, but Cargo would warn that the package had been yanked and suggest updating. The reporter who found the attack said that warning was how the malicious version reached their environment.
A mechanism intended to signal package risk was turned into an upgrade prompt. The apparently responsible response, updating away from a yanked dependency, selected the attacker’s new release.
That detail matters beyond Rust. Security warnings are also user interfaces. Attackers can shape them by controlling package state, version ordering or publisher accounts. Organisations need dependency policies that can pause a new release long enough for independent signals to develop, rather than treating every newest version as the safest version.
The exposure window was short, but precise
The Rust team published exact registry times:
arrayref 0.3.10was available from 07:15:00 to 08:41:40 UTC, an 86-minute window.internment 0.8.7was available from 07:34:07 to 09:04:11 UTC, a 90-minute window.append-only-vec 0.1.9was available from 07:37:49 to 09:25:24 UTC, a 107-minute window.
Download totals for the legitimate projects show ecosystem reach, not the number of compromised systems. The narrower and more useful question is which builds resolved the affected versions during those intervals, and which local caches retained them afterward.
Wiz says arrayref appears in more than 35% of the environments it observes and in three quarters of environments where Rust is present. Those figures measure use of any version of the legitimate crate. They are not an estimate of how many systems fetched version 0.3.10 during the malicious release window.
Deleting a malicious version from a registry does not remove a cached crate, a vendored dependency, a build artefact or a payload already running on a machine. It also does not invalidate credentials that may have been exposed from an ephemeral CI runner before that runner was destroyed.
The infrastructure overlaps with North Korean campaigns
Wiz found substantial overlap between this operation and two earlier software supply-chain campaigns linked to North Korean actors. The Rust payload used the HTTPS path /49890878, which also appeared in the Mastra npm campaign that Microsoft attributes with high confidence to Sapphire Sleet. Wiz also connected a victim-reported command server to infrastructure documented by Google Cloud Threat Intelligence in the Axios npm attack, which Google attributes to the North Korea-nexus group UNC1069. Certificate metadata and repeated use of Hostwinds infrastructure provided additional overlap.
This is meaningful attribution evidence, but it is not proof by itself. Infrastructure can be shared, resold, copied or deliberately reused. BlackTree therefore treats North Korean responsibility as Wiz’s assessment based on infrastructure and tradecraft overlap, not as a confirmed finding by the Rust project.
What Rust users should check
The Rust team recommends checking local Cargo caches for the three poisoned versions and for any version of the attacker-controlled crates proc-macro1, proc-macro-en, aovine, arone, aronenao and tinymember.
Organisations should expand that check across developer endpoints, CI caches, self-hosted runners, build containers, vendored source trees and artefact repositories. Review Cargo.lock files and build logs, but do not rely on the current registry state to prove that a deleted version was never fetched.
If a system built an affected dependency, treat it as potentially compromised:
- Preserve relevant endpoint, process, network and CI audit evidence before rebuilding the host.
- Look for
/tmp/rust-setup,%TEMP%\rust-setup.ps1and%TEMP%\rust-setup-launch.vbs, plus unfamiliar Registry Run entries, LaunchAgents and systemd user services. - Search network telemetry for connections to
23.254.165[.]112on ports 9089 or 443,23.254.167[.]107:443,hwsrv-798836.hostwindsdns[.]comand HTTPS POST requests to/49890878. - Identify every secret available to the build, including registry tokens, repository credentials, cloud keys, signing material and deployment credentials.
- Rotate exposed credentials from a known-clean system and review their use during and after the build window.
- Rebuild affected developer or CI hosts from trusted images rather than assuming removal of the crate removed the payload.
- Recreate software artefacts from a known-clean dependency set and compare provenance before release.
The missing control is often build-time containment
Dependency scanning is useful, but this incident crossed the line between a malicious package record and live execution within minutes. Detection also has to exist at runtime.
Build jobs should have narrowly scoped credentials, short-lived tokens, restricted egress and isolation from production networks. New dependencies and unexpected build scripts deserve review. Lockfiles should be committed and changes inspected. High-value release jobs should not automatically receive every secret available to the wider CI platform.
The Rust response was fast and unusually precise. The malicious releases were removed, legitimate versions were restored and the suspected account was locked.
That response closed crates.io as the delivery route. Every organisation that compiled the code must still close its own incident.
Sources and further reading
- Rust Security Response Team: Supply chain attack on arrayref, published 20 August 2026
- RustSec advisory database: arrayref 0.3.10 executes a remote payload at build time, opened 20 August 2026
- Socket: Popular Rust Crates Compromised in Build-Time Supply Chain Attack, published 20 August 2026
- Aikido Security: Popular Rust crates compromised in supply chain attack, published 20 August 2026
- Wiz Research: Rust Supply Chain Attack on arrayref: Significant Overlap with DPRK Campaigns, published 20 August 2026; publication time not stated
- Microsoft Threat Intelligence: Inside the Mastra npm supply-chain compromise by Sapphire Sleet, published 17 June 2026 and updated 19 June 2026
- Google Threat Intelligence: North Korea-nexus actor compromises Axios npm package, published 31 March 2026


