The ioctl.fail analysis is worth reading the whole way through — atomic-lockfile@1.4.2 ships a stripped Rust ELF at src/hooks/deps, wired up via npm's preinstall lifecycle, and once it lands it goes after Slack/Teams/Discord/GitHub/npm/Vault/Docker/SSH/VPN material plus shell history and, if it has root, drops an eBPF rootkit to hide its own sockets and processes. The C2 is hardcoded as an onion address invoked over a loopback SOCKS shim, so a host-level firewall blocking outbound clearnet doesn't help — Tor is the transport.
Two things worth taking away as a builder:
The "adopt an unmaintained package" attack surface isn't unique to AUR. PyPI, npm, RubyGems, crates.io, and even Solidity dependency trees via npm-imported OpenZeppelin/Uniswap forks all have the same shape: an attacker waits for a maintainer to go quiet, then takes over the namespace and ships a patch version that current build pipelines silently consume. The exact same playbook hit event-stream (npm, 2018) and ctx/PyKafka more recently. AUR just made it cheaper because adoption is automated and reviewer-free.
The interesting defense is to pin by hash, not name+version. npm ci with a committed lockfile + --ignore-scripts would have blunted this specific payload (no preinstall execution). For AUR specifically, install with paru -S --review (or aurutils + a manual diff) so the PKGBUILD diff is in your face every time. None of those are sexy, but they're the actual fix — the registry can't be the trust root.
The eBPF rootkit bit is what makes this generation of malware scary on dev boxes specifically: it can hide from ps, ss, and lsof from any unprivileged tool you'd normally use to look around. If you ran a compromised package as root, bpftool prog list + a fresh boot from rescue media is the only honest IR path.
The ioctl.fail analysis is worth reading the whole way through —
atomic-lockfile@1.4.2ships a stripped Rust ELF atsrc/hooks/deps, wired up via npm'spreinstalllifecycle, and once it lands it goes after Slack/Teams/Discord/GitHub/npm/Vault/Docker/SSH/VPN material plus shell history and, if it has root, drops an eBPF rootkit to hide its own sockets and processes. The C2 is hardcoded as an onion address invoked over a loopback SOCKS shim, so a host-level firewall blocking outbound clearnet doesn't help — Tor is the transport.Two things worth taking away as a builder:
event-stream(npm, 2018) andctx/PyKafkamore recently. AUR just made it cheaper because adoption is automated and reviewer-free.npm ciwith a committed lockfile +--ignore-scriptswould have blunted this specific payload (no preinstall execution). For AUR specifically, install withparu -S --review(oraurutils+ a manual diff) so the PKGBUILD diff is in your face every time. None of those are sexy, but they're the actual fix — the registry can't be the trust root.The eBPF rootkit bit is what makes this generation of malware scary on dev boxes specifically: it can hide from
ps,ss, andlsoffrom any unprivileged tool you'd normally use to look around. If you ran a compromised package as root,bpftool prog list+ a fresh boot from rescue media is the only honest IR path.