On May 14, 2026, three malicious versions of node-ipc — 9.1.6, 9.2.3, and 12.0.1 — were published simultaneously to the npm registry, each carrying an identical 80 KB obfuscated credential stealer appended to the package's CommonJS bundle (Source: Snyk / Socket, May 2026). The library, a foundational inter-process communication package pulling roughly 822,000 downloads per week, sits deep in the dependency trees of hundreds of downstream packages.
What makes this incident worth a deep dive two months later is the entry vector. Nobody was phished. No CI/CD pipeline was breached. No malware-laced VS Code extension was involved. The attackers simply noticed that the maintainer's email domain — atlantis-software.net — had expired in January 2025, re-registered it for the price of a pizza, recreated the maintainer's mailbox, and clicked "forgot password" on npmjs.com (Source: CSO Online / BleepingComputer, May 2026). This article dissects the full attack chain, the stealer's anatomy, the systemic expired-domain problem affecting thousands of packages, and — most importantly — how to audit your own dependency tree for the same weakness.
The Incident at a Glance
The Takeover: A Password Reset, Not a Hack
The compromised account belonged to atiertant, a long-time co-maintainer of node-ipc. Security researchers reconstructed the timeline (Source: CSO Online / The Hacker News, May 2026):
atlantis-software.net, hosting the maintainer's account email, expires and is never renewed.
9.1.6, 9.2.3, and 12.0.1 ship simultaneously — patch bumps on old release lines, designed to be swallowed silently by ^ and ~ semver ranges.
The version-numbering choice deserves attention. Publishing 9.1.6 and 9.2.3 — patch releases on the widely-pinned 9.x line — meant that any project depending on ^9.1.0 or ~9.2.0 would pull the malicious version on its next fresh install, without any human choosing to upgrade. This is the same semver-range delivery mechanism we analyzed in our semver range exploits guide.
The Stealer: 113+ Credential Paths, Exfiltrated Over DNS
The payload is an obfuscated blob appended to node-ipc.cjs, the package's CommonJS entry bundle — meaning it executes at require time, the moment your application or build tool loads the module. No install script is involved, so npm v12's script-blocking defaults offer no protection here, exactly like the Lazarus Rollup polyfill campaign disclosed in July (Source: Datadog Security Labs / safedep, May 2026).
Once running, the stealer sweeps the machine for an unusually broad set of secrets — 113 targeted file paths on Linux and 127 on macOS (Source: Datadog Security Labs, May 2026):
- Source control & registries —
.npmrc,.git-credentials, GitHub CLI tokens - Cloud providers — AWS credentials and config, Azure profiles, GCP service account JSON
- Infrastructure — Kubernetes kubeconfig files, Docker configs, Terraform state, SSH private keys
- Application secrets —
.envfiles across project directories, database connection files - AI coding agents — configuration and credential files for AI development tools, continuing the 2026 trend of harvesting AI assistant tokens we documented in our AI developer tools supply chain analysis
The exfiltration channel is the most technically interesting part. Instead of an HTTPS POST that an egress firewall would catch, the stealer packs everything into a gzip-compressed tar archive and streams it out as DNS TXT queries to an attacker-controlled resolver (decoded endpoint: sh.azurestaticprovider.net — note the Azure-flavored brandjacking). Socket estimated that exfiltrating a 500 KB archive generates roughly 29,400 DNS TXT requests, traffic that blends into normal DNS noise on most networks (Source: Socket / safedep, May 2026). Very few development environments monitor outbound DNS volume per process; almost none block TXT queries.
Third Strike: node-ipc's Troubled History
If the name node-ipc sounds familiar, it should. In March 2022, the package's own author shipped protestware: versions 10.1.1 and 10.1.2 geolocated users by IP and, on machines in Russia or Belarus, overwrote files with heart emojis. That sabotage was assigned CVE-2022-23812 with a CVSS score of 9.8 (Source: NVD / Snyk / BleepingComputer, March 2022). The follow-up "peacenotwar" module remained embedded in later versions.
The 2026 incident is different in nature — the maintainer was a victim this time, not the actor — but the combined history makes node-ipc a case study in dependency-tree risk: a small, unfunded, largely dormant package with publish rights spread across multiple accounts, embedded under hundreds of downstream projects. Dormancy itself became the vulnerability: a maintainer who had drifted away from the project was no longer watching the domain his account identity depended on.
The Systemic Problem: Thousands of Packages Share This Weakness
The expired-domain vector was documented years before this attack. The academic study "What are Weak Links in the npm Supply Chain?" found 2,818 maintainer email addresses hosted on expired domains, making an estimated 8,494 npm packages directly hijackable through exactly the password-reset flow used against node-ipc (Source: "Weak Links in the npm Supply Chain" study; JFrog Security Research). JFrog's own analysis of the vector concluded that registries cannot fully prevent it as long as account recovery relies on email (Source: JFrog Security Research).
Three properties make this attack class uniquely cheap:
1. It costs almost nothing. A domain registration is $10–20. There is no exploit development, no phishing infrastructure, no zero-day. The "vulnerability" is a WHOIS expiry date, visible to anyone.
2. It is legal until the very last step. Registering an expired domain and running a mail server on it breaks no law and triggers no security alert. The first detectable malicious action is the npm publish itself.
3. It defeats account-centric defenses selectively. If the account has no 2FA — common for dormant co-maintainers who received publish rights a decade ago — email-based password reset is the only gate. The account owner cannot even receive the "your password was changed" notification, because the attacker now owns the mailbox.
How to Audit Your Own Dependency Maintainers
The actionable lesson of node-ipc is not "pin your versions" (though you should). It is that maintainer account hygiene is part of your attack surface, and you can audit it. A practical workflow:
# 1. List maintainer emails for your direct dependencies
npm view node-ipc maintainers --json
# 2. Extract the email domains and check their expiry
whois atlantis-software.net | grep -i 'expir'
# 3. Flag domains that are expired, expiring soon,
# or newly re-registered (registration date < 90 days)
A recently re-registered domain behind a long-dormant maintainer account is precisely the node-ipc signature. For maintainers, the checklist is shorter and stricter:
Defense checklist — maintainers and consumers
If You Installed a Compromised Version
The affected versions are node-ipc@9.1.6, node-ipc@9.2.3, and node-ipc@12.0.1. Check every lockfile in every repository, plus local and CI caches where malicious tarballs may persist. If a match appears, assume the stealer ran (Source: Snyk / StepSecurity, May 2026):
- Rotate everything the stealer targets — SSH keys, npm tokens, cloud provider credentials, Kubernetes tokens, Git credentials, database passwords, and every secret in every
.envon the machine - Pin node-ipc to a known-safe version and refresh lockfiles so the resolved version and integrity hash are explicit
- Clear npm/pnpm/yarn caches locally and in CI runners, then rebuild artifacts from clean dependency trees
- Review DNS logs for bursts of TXT queries from developer workstations and CI runners around and after May 14, 2026
Frequently Asked Questions
Which node-ipc versions are malicious?
Versions 9.1.6, 9.2.3, and 12.0.1, all published on May 14, 2026, and removed from npm shortly after. Every other version published before that date is unaffected by this incident — though versions 10.1.1–10.1.2 from 2022 carry the separate CVE-2022-23812 protestware issue.
How did attackers get publish access without hacking anyone?
The maintainer's npm account email was hosted on atlantis-software.net, a domain that expired in January 2025. Attackers re-registered it on May 7, 2026, recreated the mailbox, and used npm's standard password reset. The account had no second factor to stop them.
Does npm v12 protect against this attack?
No. The stealer was appended to node-ipc.cjs and executes at require time, when your code loads the module — not through an install script. npm v12's script-blocking defaults are irrelevant here. Cooldown-based installs (like pnpm 11's minimumReleaseAge) are the mechanism that would have worked, since the versions were flagged within minutes.
Why is DNS exfiltration harder to detect than HTTP?
Egress controls usually inspect HTTP/HTTPS traffic, but almost every environment allows DNS resolution unconditionally. By encoding stolen archives into ~29,400 TXT queries, the stealer's traffic looks like ordinary name resolution unless you monitor DNS query volume and entropy per process — which very few dev environments do.
How many other packages are exposed to expired-domain takeover?
The "Weak Links in the npm Supply Chain" study identified 2,818 maintainer email addresses on expired domains, putting an estimated 8,494 packages at direct risk — and that count predates the ecosystem's growth. Any package whose maintainer uses a custom email domain inherits the domain's renewal risk.
Monitor your dependencies automatically
CVE OptiBot scans your lockfiles daily and alerts you when a malicious or vulnerable package — like a backdoored node-ipc release — appears in a project you actually ship. No code access required.
Start free monitoringFurther reading
Le 14 mai 2026, trois versions malveillantes de node-ipc — 9.1.6, 9.2.3 et 12.0.1 — ont été publiées simultanément sur le registre npm, chacune embarquant un stealer de credentials obfusqué de 80 Ko ajouté au bundle CommonJS du package (Source : Snyk / Socket, mai 2026). Cette bibliothèque de communication inter-processus, fondation de centaines de packages en aval, totalise environ 822 000 téléchargements par semaine.
Ce qui justifie un deep dive deux mois plus tard, c'est le vecteur d'entrée. Personne n'a été phishé. Aucun pipeline CI/CD n'a été compromis. Aucune extension VS Code piégée. Les attaquants ont simplement remarqué que le domaine email du mainteneur — atlantis-software.net — avait expiré en janvier 2025, l'ont réenregistré pour le prix d'une pizza, ont recréé la boîte mail du mainteneur, et ont cliqué sur « mot de passe oublié » sur npmjs.com (Source : CSO Online / BleepingComputer, mai 2026). Cet article dissèque la chaîne d'attaque complète, l'anatomie du stealer, le problème systémique des domaines expirés qui touche des milliers de packages, et — surtout — comment auditer votre propre arbre de dépendances contre cette même faiblesse.
L'incident en un coup d'œil
La prise de contrôle : un reset de mot de passe, pas un hack
Le compte compromis appartenait à atiertant, co-mainteneur historique de node-ipc. Les chercheurs ont reconstitué la chronologie (Source : CSO Online / The Hacker News, mai 2026) :
atlantis-software.net, qui héberge l'email du compte mainteneur, expire sans jamais être renouvelé.
9.1.6, 9.2.3 et 12.0.1 sortent simultanément — des bumps de patch sur d'anciennes lignes de release, conçus pour être avalés silencieusement par les plages semver ^ et ~.
Le choix des numéros de version mérite l'attention. Publier 9.1.6 et 9.2.3 — des patchs sur la ligne 9.x massivement épinglée — garantissait que tout projet dépendant de ^9.1.0 ou ~9.2.0 tirerait la version malveillante à sa prochaine installation fraîche, sans qu'aucun humain ne choisisse de mettre à jour. C'est exactement le mécanisme de livraison par plage semver que nous avions analysé dans notre guide des exploits de plages semver.
Le stealer : 113+ chemins de credentials, exfiltrés via DNS
Le payload est un blob obfusqué ajouté à node-ipc.cjs, le bundle d'entrée CommonJS du package — il s'exécute donc au require, au moment où votre application ou votre outil de build charge le module. Aucun script d'installation n'est impliqué : les défauts de blocage de scripts de npm v12 n'offrent ici aucune protection, exactement comme dans la campagne Lazarus Rollup polyfill divulguée en juillet (Source : Datadog Security Labs / safedep, mai 2026).
Une fois lancé, le stealer balaie la machine à la recherche d'un ensemble inhabituellement large de secrets — 113 chemins de fichiers ciblés sous Linux et 127 sous macOS (Source : Datadog Security Labs, mai 2026) :
- Contrôle de source & registres —
.npmrc,.git-credentials, tokens GitHub CLI - Fournisseurs cloud — credentials et config AWS, profils Azure, JSON de comptes de service GCP
- Infrastructure — kubeconfig Kubernetes, configs Docker, state Terraform, clés privées SSH
- Secrets applicatifs — fichiers
.envà travers les répertoires projets, fichiers de connexion base de données - Agents de code IA — fichiers de configuration et credentials des outils de développement IA, dans la continuité de la tendance 2026 que nous documentions dans notre analyse supply chain des outils IA
Le canal d'exfiltration est la partie la plus intéressante techniquement. Au lieu d'un POST HTTPS qu'un pare-feu de sortie intercepterait, le stealer compresse tout dans une archive tar gzippée et la fait sortir sous forme de requêtes DNS TXT vers un résolveur contrôlé par l'attaquant (endpoint décodé : sh.azurestaticprovider.net — notez le brandjacking aux couleurs d'Azure). Socket a estimé qu'exfiltrer une archive de 500 Ko génère environ 29 400 requêtes DNS TXT, un trafic qui se fond dans le bruit DNS normal de la plupart des réseaux (Source : Socket / safedep, mai 2026). Très peu d'environnements de développement surveillent le volume DNS sortant par processus ; quasiment aucun ne bloque les requêtes TXT.
Troisième strike : l'histoire mouvementée de node-ipc
Si le nom node-ipc vous dit quelque chose, c'est normal. En mars 2022, l'auteur du package a lui-même livré du protestware : les versions 10.1.1 et 10.1.2 géolocalisaient les utilisateurs par IP et, sur les machines situées en Russie ou en Biélorussie, écrasaient les fichiers avec des emojis cœur. Ce sabotage a reçu la référence CVE-2022-23812 avec un score CVSS de 9.8 (Source : NVD / Snyk / BleepingComputer, mars 2022). Le module « peacenotwar » est resté embarqué dans les versions suivantes.
L'incident de 2026 est de nature différente — le mainteneur est cette fois victime, pas acteur — mais l'historique combiné fait de node-ipc un cas d'école du risque d'arbre de dépendances : un petit package non financé, largement dormant, avec des droits de publication répartis entre plusieurs comptes, enfoui sous des centaines de projets en aval. La dormance elle-même est devenue la vulnérabilité : un mainteneur éloigné du projet ne surveillait plus le domaine dont dépendait l'identité de son compte.
Le problème systémique : des milliers de packages partagent cette faiblesse
Le vecteur du domaine expiré était documenté des années avant cette attaque. L'étude académique « What are Weak Links in the npm Supply Chain? » a recensé 2 818 adresses email de mainteneurs hébergées sur des domaines expirés, rendant environ 8 494 packages npm directement hijackables via exactement le flux de reset de mot de passe utilisé contre node-ipc (Source : étude « Weak Links in the npm Supply Chain » ; JFrog Security Research). L'analyse de JFrog conclut que les registres ne peuvent pas totalement prévenir ce vecteur tant que la récupération de compte repose sur l'email (Source : JFrog Security Research).
Trois propriétés rendent cette classe d'attaque singulièrement bon marché :
1. Elle ne coûte presque rien. Un enregistrement de domaine coûte 10 à 20 $. Pas de développement d'exploit, pas d'infrastructure de phishing, pas de zero-day. La « vulnérabilité » est une date d'expiration WHOIS, visible par tous.
2. Elle est légale jusqu'à la toute dernière étape. Enregistrer un domaine expiré et y faire tourner un serveur mail n'enfreint aucune loi et ne déclenche aucune alerte. La première action malveillante détectable est le publish npm lui-même.
3. Elle contourne sélectivement les défenses centrées sur le compte. Si le compte n'a pas de 2FA — courant chez les co-mainteneurs dormants ayant reçu leurs droits il y a dix ans — le reset par email est la seule barrière. Le propriétaire ne peut même pas recevoir la notification « votre mot de passe a été changé », puisque l'attaquant possède désormais la boîte mail.
Comment auditer les mainteneurs de vos dépendances
La leçon actionnable de node-ipc n'est pas « épinglez vos versions » (même si vous devriez). C'est que l'hygiène des comptes mainteneurs fait partie de votre surface d'attaque, et qu'elle s'audite. Un workflow pratique :
# 1. Lister les emails des mainteneurs de vos dépendances directes
npm view node-ipc maintainers --json
# 2. Extraire les domaines et vérifier leur expiration
whois atlantis-software.net | grep -i 'expir'
# 3. Signaler les domaines expirés, proches de l'expiration,
# ou récemment réenregistrés (date d'enregistrement < 90 jours)
Un domaine récemment réenregistré derrière un compte mainteneur longtemps dormant, c'est précisément la signature node-ipc. Pour les mainteneurs, la checklist est plus courte et plus stricte :
Checklist défense — mainteneurs et consommateurs
Si vous avez installé une version compromise
Les versions affectées sont node-ipc@9.1.6, node-ipc@9.2.3 et node-ipc@12.0.1. Vérifiez chaque lockfile de chaque dépôt, plus les caches locaux et CI où les tarballs malveillants peuvent persister. En cas de correspondance, considérez que le stealer a tourné (Source : Snyk / StepSecurity, mai 2026) :
- Rotation de tout ce que le stealer cible — clés SSH, tokens npm, credentials cloud, tokens Kubernetes, credentials Git, mots de passe base de données, et chaque secret de chaque
.envde la machine - Épingler node-ipc sur une version sûre connue et régénérer les lockfiles pour expliciter version résolue et hash d'intégrité
- Vider les caches npm/pnpm/yarn en local et sur les runners CI, puis reconstruire les artefacts depuis des arbres propres
- Analyser les logs DNS à la recherche de rafales de requêtes TXT depuis les postes développeurs et runners CI autour du 14 mai 2026 et après
Questions fréquentes
Quelles versions de node-ipc sont malveillantes ?
Les versions 9.1.6, 9.2.3 et 12.0.1, toutes publiées le 14 mai 2026 et retirées de npm peu après. Toutes les autres versions antérieures ne sont pas concernées par cet incident — même si les versions 10.1.1–10.1.2 de 2022 portent le problème distinct de protestware CVE-2022-23812.
Comment les attaquants ont-ils obtenu les droits de publication sans hacker personne ?
L'email du compte npm du mainteneur était hébergé sur atlantis-software.net, un domaine expiré depuis janvier 2025. Les attaquants l'ont réenregistré le 7 mai 2026, ont recréé la boîte mail et utilisé le reset de mot de passe standard de npm. Aucun second facteur ne les a arrêtés.
npm v12 protège-t-il contre cette attaque ?
Non. Le stealer était ajouté à node-ipc.cjs et s'exécute au require, quand votre code charge le module — pas via un script d'installation. Les défauts de npm v12 sont ici sans effet. Ce sont les installations avec délai (comme le minimumReleaseAge de pnpm 11) qui auraient fonctionné, les versions ayant été signalées en quelques minutes.
Pourquoi l'exfiltration DNS est-elle plus difficile à détecter que HTTP ?
Les contrôles de sortie inspectent généralement le trafic HTTP/HTTPS, mais presque tous les environnements autorisent la résolution DNS sans condition. En encodant les archives volées dans ~29 400 requêtes TXT, le trafic du stealer ressemble à de la résolution de noms ordinaire — sauf à surveiller le volume et l'entropie des requêtes DNS par processus, ce que très peu d'environnements de dev font.
Combien d'autres packages sont exposés au takeover par domaine expiré ?
L'étude « Weak Links in the npm Supply Chain » a identifié 2 818 adresses email de mainteneurs sur des domaines expirés, exposant environ 8 494 packages — un décompte antérieur à la croissance de l'écosystème. Tout package dont le mainteneur utilise un domaine email personnalisé hérite du risque de renouvellement de ce domaine.
Surveillez vos dépendances automatiquement
CVE OptiBot scanne vos lockfiles chaque jour et vous alerte quand un package malveillant ou vulnérable — comme une release node-ipc backdoorée — apparaît dans un projet que vous livrez réellement. Sans accès à votre code.
Démarrer le monitoring gratuitÀ lire ensuite