MAL-2026-15547 Malicious code in 2fa-secretkey (npm)
Malicious package
Published
MAL-2026-15547 is a malicious package: 2fa-secretkey (npm). Every version was published to cause harm.
Task:
1. Search this repository's dependency manifests and lockfiles for the package, including transitive dependencies.
2. If it is present, remove it, regenerate the lockfile with the project's package manager, and replace whatever it was used for.
3. List any CI runners, developer machines or containers that installed it, so their secrets can be rotated.
4. If the package is not used anywhere, say so and change nothing.
Reference: https://insights.sbomify.com/MAL-2026-15547/ (Markdown: https://insights.sbomify.com/MAL-2026-15547/index.md)
- Package
- 2fa-secretkey
- Registry
- npm
What is MAL-2026-15547?
MAL-2026-15547 is a malicious package in 2fa-secretkey, published on 29 Aug 2026.
Official description
The package advertises itself as a TOTP/2FA helper but its package.json postinstall spawns lib/core.js as a detached, stdio-ignored child of the node runtime, so the payload runs automatically on
npm install and outlives npm exit. lib/core.js hides its strings behind an XOR 0x3F char-code decoder that reconstructs a hardcoded discord.com/api/webhooks/… URL, a DPAPI class name, powershell.exe, AppData paths, and cmd tokens at runtime. Before running, _env() exits when CI, CONTINUOUS_INTEGRATION, JEST_WORKER_ID or npm_config_global are set, when APPDATA/USERPROFILE/USERNAME/COMPUTERNAME are missing, when the lifecycle script name contains 'audit' or 'pack', or when %USERPROFILE%/Documents is absent, gating execution to real Windows user machines. On Windows the payload shells out to powershell.exe with an inline C# Add-Type that P/Invokes advapi32 CredEnumerate/CredRead to dump 'MCL||Xal.' entries from Windows Credential Manager, extracts Microsoft refresh tokens and JWT access tokens, and trades them via login.live.com, XBL, XSTS and api.minecraftservices.com to mint Minecraft session IDs. It additionally reads the Chromium Local State encrypted_key, strips the DPAPI prefix, calls System.Security.Cryptography.ProtectedData::Unprotect through PowerShell to recover the browser master key, and AES-256-GCM-decrypts cookies and stored credentials. The collected material is POSTed as JSON and multipart uploads (tagged with the OS username and '@everyone') to the XOR-decoded Discord webhook endpoint, which is unrelated to the package's advertised TOTP purpose and is not caller-configurable.What should I do about MAL-2026-15547?
Remove the package from your dependencies and lockfiles, then rotate any secrets on machines where it was installed.