crates.io dependency-confusion burst — 9 Rust crates targeting AWS, Mysten Labs, Replit, Proton, plus 4 generic-name typosquats, all flagged by OpenSSF Package Analysis on 2026-07-18
On 2026-07-18 the OpenSSF Package Analysis project flagged 9 Rust crates as malware — all yanked from crates.io within hours and mirrored into the GitHub Advisory Database as CWE-506 records. The 99.x.x version pins on mysten-metrics, amzn-codewhisperer-streaming-client, amzn-consolas-client, replit_ruspty, semantic-search-client, supertag, proton-pfff, and lsh are classic dep-confusion telltales. Every crate communicates with an attacker-controlled domain and executes commands on install.
- Detected by
- OpenSSF Package Analysis · GitHub Advisory Database
- Also known as
- 2026-07-18 crates.io OpenSSF sweep · AWS + Mysten + Replit + Proton crates.io dep-confusion burst
- Ecosystems
- crates.io
- Packages tracked
- 9
What happened
On 2026-07-18 the OpenSSF Package Analysis project — the automated malware-detection pipeline that watches every new crates.io / npm / PyPI / RubyGems / NuGet publish for behavioral signals — flagged 9 Rust crates as malware and pushed advisories through to the GitHub Advisory Database. Every advisory uses the same CWE-506 (Embedded Malicious Code) classification with the two OpenSSF signal boilerplates: "The package communicates with a domain associated with malicious activity" and "The package executes one or more commands associated with malicious behavior." crates.io yanked every listed crate; no patched version exists.
Cluster 1 — Enterprise dependency-confusion pins (5 packages)
| Crate | Versions | GHSA | Target | |---|---|---|---| | mysten-metrics | 9.0.0, 9.0.3 | GHSA-4vwj-fpjf-wmmg | Mysten Labs / Sui blockchain internal instrumentation crate | | amzn-codewhisperer-streaming-client | 99.0.1 | GHSA-92vh-m3v8-jv6h | Amazon proprietary — AWS CodeWhisperer streaming client | | amzn-consolas-client | 99.0.1 | GHSA-7jx2-pf66-g5qj | Amazon proprietary — AWS Consolas internal service client | | replit_ruspty | 1.0.0 | GHSA-943g-w75h-8v9h | Replit's Rust PTY utility (name uses underscore; canonical is ruspty) | | proton-pfff | 99.99.5 | GHSA-2c45-qvwj-8jfx | Proton internal utility (naming shape matches Proton Mail / VPN Rust codebase) |
The 99.x.x and 9.0.x version numbers are the fingerprint of a dependency-confusion pin: pick a version number higher than any plausible internal semver so cargo with a misconfigured registry order picks the public crates.io tarball over the private registry. The mysten-metrics 9.0.x pin is unusual for the pattern (real Mysten internal instrumentation runs at much lower version numbers) — the operator here either knew the internal semver was ~8.x or is running a narrower catchment. For the amzn-* and proton-* crates, the 99.x.x catch-all approach is the standard dep-confusion default.
The presence of two Amazon proprietary internal crate names (amzn-codewhisperer-streaming-client, amzn-consolas-client) targeted in the same burst suggests the operator has visibility into Amazon's internal Rust dependency graph — a leaked internal package list, an OSS build log, or a former employee. The precision of the naming (not "amzn-codewhisperer" but the exact -streaming-client suffix that matches Amazon's internal crate) is inconsistent with a random dictionary attack.
Cluster 2 — Generic-name typosquats (4 packages)
| Crate | Versions | GHSA | |---|---|---| | semantic-search-client | 99.0.1 | GHSA-jfw2-4jxj-8f9c | | supertag | 99.1.1 | GHSA-ppxc-v5qv-9fm6 | | lsh | 99.0.1, 99.1.0 | GHSA-ffmx-5mf5-q3hc | | littest | 0.3.1 | GHSA-9cpx-g2hc-4j42 |
semantic-search-client and supertag follow the same 99.x.x dep-confusion pattern targeting whichever internal package matches the name — the operator is casting a wider net here, hoping a random enterprise has an internal crate under one of these generic slugs. lsh and littest do not use the 99.x.x pattern; both use normal-looking version numbers, which fits a classical name-collision typosquat rather than a dep-confusion race. lsh in particular has legitimate benign homonyms (a small utility crate for list-set operations) — an operator picking this exact name is trying to catch developers who search for the benign crate by memory.
Attack signature — OpenSSF Package Analysis behavioral flags
Every advisory in this burst was flagged by the OpenSSF Package Analysis pipeline, not by a security-vendor blog post. The two behavioral signals reported are:
- "The package communicates with a domain associated with malicious activity" — the crate's
build.rs(or a runtime dependency's) opens a network connection to a domain on the OpenSSF known-bad list within seconds of installation. - "The package executes one or more commands associated with malicious behavior" — the crate spawns a shell subprocess (or invokes a syscall pattern that matches a known malware fingerprint) during install or first-use.
OpenSSF Package Analysis does not publish per-crate technical breakdowns (no C2 domain, no command line) in the GHSA record. The raw analysis output is in the OpenSSF malicious-packages repository under the corresponding crate name, but detail depth varies. For any concrete impact investigation, defenders should treat every crate in this burst as a full RCE payload and rotate any credential the build host could reach.
Registry state
All 9 crates have been yanked from crates.io. cargo treats yanked crates as unresolvable for new builds but WILL keep resolving them for lockfiles that were generated before the yank — so a Cargo.lock from 2026-07-18 or earlier that pins any of these names will still download the malicious tarball if the local ~/.cargo/registry/cache was cleared. Private registry mirrors (Artifactory, Nexus, Sonatype) do NOT propagate crates.io yanks and will keep serving the tarballs until you explicitly evict them.
Comparison to earlier crates.io incidents
This is the third major crates.io malware burst of 2026 after the Polymarket SDK typosquats in February and the time utility typosquats later that month. Unlike those earlier campaigns — which targeted specific ecosystem clients — this July burst is a mixed portfolio: 5 enterprise dep-confusion pins against Amazon / Mysten / Replit / Proton internal names, plus 4 generic-name catchments. The operator appears to be running a broader reconnaissance sweep rather than aiming at a single ecosystem's users.
Affected packages (9)
- crates.io
amzn-codewhisperer-streaming-client99.0.1 - crates.io
amzn-consolas-client99.0.1 - crates.io
littest0.3.1 - crates.io
lsh99.0.199.1.0 - crates.io
mysten-metrics9.0.09.0.3 - crates.io
proton-pfff99.99.5 - crates.io
replit_ruspty1.0.0 - crates.io
semantic-search-client99.0.1 - crates.io
supertag99.1.1
Impact
- Any host that installed any of the 9 Rust crates below should be treated as fully compromised — every GHSA record flags OpenSSF Package Analysis signals
communicates with a domain associated with malicious activityandexecutes one or more commands associated with malicious behavior, no patched version exists, and the crates are unrecoverable (crates.io yanks are permanent — the tarballs are gone from the public registry but private mirrors may still cache them) - Enterprise dependency-confusion pins (5 packages):
mysten-metrics@9.0.0,9.0.3(Mysten Labs / Sui blockchain internal utility),amzn-codewhisperer-streaming-client@99.0.1(AWS CodeWhisperer client — Amazon proprietary internal crate),amzn-consolas-client@99.0.1(AWS Consolas internal service client),replit_ruspty@1.0.0(Replit's Rust PTY tool),proton-pfff@99.99.5(Proton internal utility). The99.x.xand9.0.xversion numbers are the fingerprint of a dependency-confusion pin: pick a version higher than any plausible internal semver so acargobuild with a misconfigured registry order picks the public crates.io tarball over the private registry's - Generic-name typosquats (4 packages):
semantic-search-client@99.0.1,supertag@99.1.1,lsh@99.0.1,99.1.0,littest@0.3.1.semantic-search-clientandsupertagfollow the same99.x.xdep-confusion pattern targeting whichever internal package matches the name;lsh(name collision with a real, benign crate that provides list-set utilities) andlittestare more classical name-collision typosquats - Every impacted host has already executed the malicious payload — the OpenSSF Package Analysis findings ("communicates with a domain associated with malicious activity") indicate the crate contacted attacker infrastructure the first time
cargo buildresolved it. A build cache (~/.cargo/registry/cache) holding a downloaded tarball is a strong indicator that install-time execution completed - Amazon proprietary internal crate names (
amzn-codewhisperer-streaming-client,amzn-consolas-client) being targeted this specifically indicates the operator has visibility into Amazon's internal Rust dependency graph — a leaked internal package list, an OSS build log, or a former employee is the most likely source - The Mysten Labs
mysten-metricsname matches the real internal instrumentation crate used across the Sui blockchain codebase — any Sui-adjacent Rust project resolvingmysten-metricsfrom crates.io instead of from Mysten Labs' internal registry has now installed the payload
What to do
- 1Grep every
Cargo.tomlandCargo.lockfor each name in the packages map below. Any match is a supply-chain incident: rotate every credential the build runner could reach and re-image the build host - 2If you had
mysten-metricsin a Cargo.lock: this indicates a misconfigured internal-registry resolver for a Mysten Labs / Sui integration. Audit your.cargo/config.tomlto ensure[source.crates-io]is not preferred over your private registry for Mysten Labs' internal crate names. Rotate any Sui / Mysten API keys the build environment could reach - 3If you had
amzn-codewhisperer-streaming-clientoramzn-consolas-clientin a Cargo.lock: these are Amazon proprietary internal crate names — the presence of a public crates.io resolution for either is definitionally a dep-confusion compromise. Escalate to Amazon Security and rotate any AWS credentials, IAM roles, and CodeWhisperer / Consolas API keys the affected host had access to - 4If you had
replit_rusptyin a Cargo.lock: replace with the canonicalrusptyupstream, review your build host for shell activity during the compromise window, and rotate every credential the Replit workspace could reach - 5If you had
proton-pfffin a Cargo.lock: this maps to a Proton (Proton Mail / Proton VPN) internal crate name. Escalate to Proton Security if you were doing an integration; rotate any Proton API keys the build environment could reach - 6For any of the generic-name crates (
semantic-search-client,supertag,lsh,littest): remove the dependency, audit for legitimate first-party parents (lshin particular has legitimate benign homonyms — verify you were not targeting one of them), and rotate every credential the CI environment could reach - 7Verify none of the 9 listed crates still resolves via your private mirror — internal Artifactory / Nexus / Sonatype instances routinely cache crates.io tarballs and will keep serving the malicious versions after the public yank. Cargo does not honor crates.io yanks against a private mirror
- 8Run
cargo auditin CI against the RustSec advisory database — the OpenSSF Package Analysis feed and GHSA records feed into RustSec within 24-48 hours
References
- GitHubGitHub Advisory Database — recent Rust malware advisoriesgithub.com
- GitHubGHSA-4vwj-fpjf-wmmg — mysten-metrics malware advisorygithub.com
- GitHubGHSA-92vh-m3v8-jv6h — amzn-codewhisperer-streaming-client malware advisorygithub.com
- GitHubGHSA-7jx2-pf66-g5qj — amzn-consolas-client malware advisorygithub.com
- GitHubGHSA-943g-w75h-8v9h — replit_ruspty malware advisorygithub.com
- GitHubGHSA-2c45-qvwj-8jfx — proton-pfff malware advisorygithub.com
- GitHubGHSA-jfw2-4jxj-8f9c — semantic-search-client malware advisorygithub.com
- GitHubGHSA-ppxc-v5qv-9fm6 — supertag malware advisorygithub.com
- GitHubGHSA-ffmx-5mf5-q3hc — lsh malware advisorygithub.com
- GitHubGHSA-9cpx-g2hc-4j42 — littest malware advisorygithub.com
- OpenSSFOpenSSF Malicious Packages repositorygithub.com