On May 14, 2026, three malicious versions of node-ipc9.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

3
Malicious versions published simultaneously
Source: Snyk / Socket, May 2026
822K
Weekly downloads of node-ipc
Source: Socket / Cybersecurity News, May 2026
80 KB
Obfuscated stealer appended to node-ipc.cjs
Source: Datadog Security Labs, May 2026
8,494
npm packages hijackable via expired maintainer domains
Source: "Weak Links in the npm Supply Chain" study

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):

Jan 10, 2025 The domain atlantis-software.net, hosting the maintainer's account email, expires and is never renewed.
May 7, 2026 The attackers re-register the expired domain, stand up a mail server, and recreate the maintainer's exact email address.
May 7–13 A standard npm password reset lands in the attacker-controlled mailbox. Publish rights acquired — no maintainer infrastructure ever touched.
May 14, 2026 Versions 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.
+3 minutes Socket's automated analysis flags the versions as malware roughly three minutes after publication; the versions are subsequently removed from the registry.

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.env files 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

Enforce 2FA on every npm account with publish rights — a password reset via hijacked email cannot bypass a hardware key or TOTP factor
Remove stale co-maintainers — every dormant account with publish rights is an unwatched door; node-ipc had publish rights spread across accounts nobody audited
Use email on a domain you will keep forever — or a major provider; a custom domain is a renewal-failure away from becoming someone else's identity
Add an install cooldown — pnpm 11's minimumReleaseAge (24h default) or equivalent delays would have kept every consumer safe: the malicious versions lived far less than a day
Monitor outbound DNS from build environments — thousands of TXT queries from a Node.js process is this stealer's loudest signal
Watch for publishes after long dormancy — simultaneous patch releases on abandoned release lines, from a project quiet for months, is a red-flag pattern worth alerting on

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 .env on 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 monitoring

Further reading

State of npm Supply Chain Security — H1 2026 Retrospective → npm Maintainer Account Security & 2FA Enforcement in 2026 → Lazarus npm Attack: Fake Rollup Polyfills & npm v12 Bypass → npm Semver Vulnerabilities & Range Exploits in 2026 → pnpm Security & Hardening: the pnpm 11 Supply Chain Defaults → CVE Monitoring — How OptiBot works → npm Vulnerabilities — Threat overview →

Le 14 mai 2026, trois versions malveillantes de node-ipc9.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

3
Versions malveillantes publiées simultanément
Source : Snyk / Socket, mai 2026
822K
Téléchargements hebdomadaires de node-ipc
Source : Socket / Cybersecurity News, mai 2026
80 Ko
Stealer obfusqué ajouté à node-ipc.cjs
Source : Datadog Security Labs, mai 2026
8 494
Packages npm hijackables via domaines expirés
Source : étude « Weak Links in the npm Supply Chain »

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) :

10 jan 2025 Le domaine atlantis-software.net, qui héberge l'email du compte mainteneur, expire sans jamais être renouvelé.
7 mai 2026 Les attaquants réenregistrent le domaine expiré, montent un serveur mail et recréent l'adresse exacte du mainteneur.
7–13 mai Un reset de mot de passe npm standard arrive dans la boîte contrôlée par l'attaquant. Droits de publication acquis — sans toucher à la moindre infrastructure du mainteneur.
14 mai 2026 Les versions 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 ~.
+3 minutes L'analyse automatisée de Socket classe les versions comme malware environ trois minutes après publication ; elles sont ensuite retirées du registre.

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

Imposer la 2FA sur chaque compte npm avec droits de publication — un reset de mot de passe via email hijacké ne contourne ni clé matérielle ni TOTP
Retirer les co-mainteneurs inactifs — chaque compte dormant avec droits de publication est une porte non surveillée
Utiliser un email sur un domaine pérenne — ou un fournisseur majeur ; un domaine personnalisé n'est qu'un oubli de renouvellement avant de devenir l'identité de quelqu'un d'autre
Ajouter un délai d'installation (cooldown) — le minimumReleaseAge de pnpm 11 (24h par défaut) aurait protégé tous les consommateurs : les versions malveillantes ont vécu bien moins d'une journée
Surveiller le DNS sortant des environnements de build — des milliers de requêtes TXT depuis un processus Node.js sont le signal le plus bruyant de ce stealer
Alerter sur les publications après longue dormance — des releases de patch simultanées sur des lignes abandonnées, venant d'un projet silencieux depuis des mois, est un pattern à signaler

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 .env de 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

État de la supply chain npm — Rétrospective H1 2026 → Sécurité des comptes mainteneurs npm & 2FA en 2026 → Attaque Lazarus : faux polyfills Rollup & contournement npm v12 → Vulnérabilités semver npm & exploits de plages en 2026 → pnpm Security & Hardening : les défauts supply chain de pnpm 11 → CVE Monitoring — Comment OptiBot fonctionne → Vulnérabilités npm — Panorama des menaces →