Your RSA-2048 keys break in 2030. Find every one of them before attackers do.
Malicious package

@goodjavascript/dotenvnpm

@goodjavascript/dotenv is a confirmed malicious npm package (MAL-2026-11212) that steals credentials and exfiltrates sensitive data (malicious version 1.0.0). Do not install it — remove it immediately and rotate any exposed credentials.

Malicious code in @goodjavascript/dotenv (npm)

MAL-2026-11212
Immediate action
Remove the package, then rotate any secrets the build/runtime could reach.
npm uninstall @goodjavascript/dotenv

What this malware does

@goodjavascript/[email protected] (published 2025-03-22T09:05:32Z, replaced by an npm 0.0.1-security holding stub 2026-07-30T22:47:55Z — approximately 16 months live) is a two-file package that impersonates the API of the widely used dotenv configuration loader while running a command-and-control implant.

The published tarball contains only package.json (164 bytes) and index.js (840 bytes); unpacked size 1004 bytes. There is no scripts block, so there is no install hook — the implant is triggered at runtime, when the module is imported. The package declares a single runtime dependency, systeminformation@^5.25.11.

index.js exports { config: () => {} }, a no-op stub matching real dotenv's config() entry point, so a caller doing require('@goodjavascript/dotenv').config() observes no error and no effect.

At module load the file registers setInterval(..., 10000).unref(). The .unref() prevents the timer from holding the Node event loop open, so a host process still exits normally and the implant does not hang builds or short-lived scripts.

The beacon uses a bare global fetch and the package declares no engines constraint, so the network activity below occurs on Node runtimes that expose a global fetch (Node 18 and later). On each 10-second tick:

  1. systeminformation.getStaticData() collects a full static host profile (OS, hardware, network, UUIDs).
  2. The entire profile is POSTed as JSON to http://45.9.148.93/get/<system.uuid.os> — plain HTTP, hardcoded IPv4, no TLS. The OS UUID in the path serves as a per-host identifier.
  3. The response is parsed as JSON. If the field res.cute is present, it is treated as JavaScript source and executed: vm.createContext(ctx) followed by new vm.Script(res.cute).runInContext(ctx), where ctx is { res: <callback>, ...global }. Spreading global into the context gives the delivered code access to the host's Node globals. This is arbitrary remote code execution under the operator's control.
  4. Delivered code may call res(data) — the callback exposed as the context's res property — to POST results back to http://45.9.148.93/re/<system.uuid.os> with body { re: res.cuteId, data }, where res.cuteId correlates the result to the issued task.

Classification: remote access trojan / staged remote-code-execution loader with host reconnaissance exfiltration. Trigger: runtime, on import — there is no install script. The code is not obfuscated.

The registry has since stripped the package metadata and replaced all content with an 0.0.1-security holding stub, so the tarball is no longer retrievable from npm or from the common mirrors (npmmirror, unpkg, yarn, Skypack, esm.sh, jspm, or jsDelivr file bodies). The analysed bytes were recovered from Software Heritage, which archived the package on 2025-11-04 while it was still published, and were verified independently: the recovered index.js has sha256 a5666532c367714568c5d112300e41d3c3fd6b8665c94f2bb98f5d74fc4d2d6c, matching the per-file sha256 recorded in jsDelivr's flat manifest for 1.0.0. Both sources are linked below.

At the time of writing, the address 45.9.148.93 does not appear in any other report in this repository.

Any computer that has this package installed or running should be considered fully compromised. All secrets and keys stored on that computer should be rotated immediately from a different computer. The package should be removed, but as full control of the computer may have been given to an outside entity, there is no guarantee that removing the package will remove all malicious software resulting from installing it.

Malicious versions

1 flagged
1.0.0

Indicators of compromise (SHA-256)

27bc0fba7c8305959e897341bc7487fdeb7cd478f89f715f2a36c98a9cdd12ba

Detection & response playbook

Credential / info stealer
  1. Find it

    Scan your lockfiles (package-lock.json, pnpm-lock.yaml, yarn.lock, requirements.txt, poetry.lock, etc.) and build artifacts for @goodjavascript/dotenv (version 1.0.0). O3 Security's supply-chain scanner checks every dependency against known-malicious package intelligence at install time and in CI, flagging @goodjavascript/dotenv across your stack and pipelines.

  2. If you installed it — respond

    @goodjavascript/dotenv is built to steal secrets, so assume every credential the build or runtime could read is compromised. Remove it from your project and lockfile, then rotate ALL exposed secrets — npm/registry tokens, cloud keys, CI/CD secrets, SSH keys, and any .env values — from a known-clean machine. Audit logs for unauthorized use of those credentials.

  3. Did it already run?

    If @goodjavascript/dotenv was ever installed, its post-install/runtime payload may have already executed. O3's L7 egress monitoring and runtime eBPF sensors detect the credential exfiltration or command-and-control callback after install and block the malicious outbound channel, so you catch and contain the actual compromise — not just the presence of the package.

  4. How O3 protects you

    O3 blocks @goodjavascript/dotenv before install through its supply-chain scanner, and if it has already run, detects and severs the exfiltration or C2 callback at runtime through L7 egress monitoring and eBPF.

Frequently asked questions

No. @goodjavascript/dotenv on npm has been identified as a malicious package (version 1.0.0 flagged). It should be removed immediately — do not install or keep it in your dependency tree.

Campaign

GHSA-c5ch-4w75-vcw7

References

Credits

  • r-bedekar · analyst

Detect & block this

O3 blocks @goodjavascript/dotenv-class packages before install and in CI — and if it already ran, its runtime egress monitoring catches the credential exfiltration and severs the channel.

Explore

@goodjavascript/dotenv (npm) malicious package — MAL-2026-11212 | O3 Security