// threat brief

CVE-2026-48027Actively exploited

Nx Console 18.95.0 trojanized: a VS Code extension update that stole developer credentials

CVSS
9.8 CRITICAL
CISA KEV
2026-05-27
Weakness
CWE-506

PlainCVE Team · Published 2026-09-29 · AI-assisted · Press brief ↓

AI review 2026-09-29 (not human-reviewed)Command tests: none yetReproduced: not yetVerification record ↓

Attackers published a trojanized Nx Console 18.95.0 VS Code extension that stole developer credentials on startup. Exploited in the wild.

Who is affectedAnyone who had Nx Console (nrwl.angular-console) installed in VS Code or a fork such as Cursor with auto-update on between about 12:30 and 13:09 UTC on 2026-05-18, or who installed 18.95.0 by hand.
What happensThe malware collected GitHub, npm, cloud (AWS/GCP), Kubernetes, Vault and SSH private-key credentials, plus 1Password CLI (op) vault contents if an op session was signed in at the time, and sent them out; on Linux it also tried to add itself to sudoers to stay around. A GitHub employee's device was hit; the attacker claims about 3,800 internal GitHub repositories were taken, which GitHub called "directionally consistent" with its still-ongoing investigation.
What to do nowUpdate to 18.100.0 or later. If you used it during the exposure window, stop the malware and delete its persistence files first, then rotate every credential that machine could reach, and consider rebuilding it.
Affected versions18.95.0 only (VS Code extension, distributed via Visual Studio Marketplace and Open VSX)
Fixed versions18.100.0 or later (last clean version before the attack: 18.94.0)
CVSS vector
Show full vectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Timeline
  • Introduced 2026-05-18 · Malicious v18.95.0 published 12:30 UTC source
  • First public 2026-05-18
  • First attacks 2026-05-18 · GitHub employee device compromised via extension source
CISA KEVListed (2026-05-27): attacks have been seen in the wild

Blue team playbook

Check, fix / mitigate, respond, harden. Matching the affected versions does not mean you were compromised, and a check that finds nothing does not prove you are safe; each item says what it can and cannot show. Tagged steps point to where the attack flow below can be stopped.

DETECTCheckAm I affected? Any signs of compromise?
  1. 01Check whether 18.95.0 was installed

    The vendor suggests listing installed extensions with versions and looking for angular-console at 18.95.0. If auto-update was on between about 12:30 and 13:09 UTC on 2026-05-18, treat the machine as possibly compromised even if it now shows a newer version.

    Read-only check
    code --list-extensions --show-versions | grep -i angular-console
  2. 02Look for the vendor-published persistence files (macOS/Linux)

    Vendor-listed files: ~/.local/share/kitty/cat.py, ~/Library/LaunchAgents/com.user.kitty-monitor.plist, /var/tmp/.gh_update_state, /tmp/kitty-*. The command has two parts: ls checks the three fixed paths, and find looks separately for kitty-* staging directories under /tmp (no shell wildcard, so zsh does not abort the whole line when nothing matches); no output means nothing was found. On Windows check %USERPROFILE%\.local\share\kitty\cat.py, %TEMP%\kitty-*, %TEMP%\.gh_update_state and %USERPROFILE%\.bun\bin\bun.exe.

    Read-only check
    ls -la ~/.local/share/kitty/cat.py ~/Library/LaunchAgents/com.user.kitty-monitor.plist /var/tmp/.gh_update_state 2>/dev/null; find /tmp/ -maxdepth 1 -name 'kitty-*' 2>/dev/null
  3. 03Find malicious processes still running

    Vendor indicators: a Python process running cat.py, or any process with __DAEMONIZED=1 in its environment. The ps part works on macOS and Linux; the /proc/*/environ part is Linux only (macOS has no /proc, and zsh prints "no matches found", which does not mean no such process exists).

    Read-only check
    ps aux | grep '[c]at\.py'; sudo grep -l '__DAEMONIZED=1' /proc/*/environ 2>/dev/null
  4. 04Linux: check sudoers for changes

    The malware tries to modify sudoers to persist; the vendor's indicator is unexpected entries in /etc/sudoers or /etc/sudoers.d/. The command only reads, listing every non-blank, non-comment line in both places (it keeps directives such as

    Read-only check
    sudo grep -rvE '^[[:space:]]*(#[[:space:]]|#$|$)' /etc/sudoers /etc/sudoers.d/
MITIGATEFix / mitigatePatch; block it if you cannot patch yet
  1. 01Update to 18.100.0 or later

    18.95.0 has been pulled from both marketplaces; 18.100.0 and later are safe. Note that updating only replaces the extension; it does not remove malware already running or persisting on the machine.

    Read-only check
    code --list-extensions --show-versions | grep -i angular-console
RESPONDRespondIf you find signs of compromise
  1. 01Remove persistence first, then rotate

    Vendor steps: stop processes with __DAEMONIZED=1 and Python processes running cat.py; delete the persistence files, unloading the LaunchAgent first on macOS. If the same machine was also hit by the TanStack (Mini Shai-Hulud) package, that payload is reported to wipe the home directory when its token is revoked, so the order matters even more.

    Read-only check
    ls -la ~/Library/LaunchAgents/com.user.kitty-monitor.plist 2>/dev/null
  2. 02Rotate every credential the machine could reach

    Including GitHub and npm tokens, SSH keys, AWS/GCP/Azure/Kubernetes credentials, Vault tokens and .env contents.

  3. 03Audit access logs and consider a rebuild

    Check whether the old credentials were used before rotation; the vendor says to treat the machine as possibly still infected and consider rebuilding it after rotating.

HARDENHardenPrevent the next one
  1. 01Require two-person approval for releases

    Nx now uses a GitHub environment with required reviewers, where the approver can't be the person who triggered the run.

  2. 02Make sure your new-package delay actually works

    The minimum-release-age setting needs pnpm 10.16 or later; older versions silently ignore it. Nx's postmortem recommends pinning the packageManager field to pnpm 10.16 or later and adding a CI check that fails the build if the pnpm version is below that.

    Read-only check
    pnpm --version
  3. 03Don't keep long-lived tokens in plain files

    Keep long-lived tokens such as GitHub CLI tokens in a secret manager so arbitrary local processes can't read them.

  4. 04Monitor audit logs and pin Actions

    Alert on events such as deleted workflow runs; pin GitHub Actions to exact commit SHAs.

Full remediation steps and notes
  1. Update. Move Nx Console to 18.100.0 or later. Check with code --list-extensions --show-versions | grep -i angular-console.
  2. Decide whether you were hit. If auto-update was on during the window, or you installed 18.95.0 by hand, the vendor says to treat the machine as compromised. Vendor-published indicators:
    • macOS/Linux files: ~/.local/share/kitty/cat.py, ~/Library/LaunchAgents/com.user.kitty-monitor.plist, /var/tmp/.gh_update_state, /tmp/kitty-*
    • Windows files: %USERPROFILE%\.local\share\kitty\cat.py, %TEMP%\kitty-*, %TEMP%\.gh_update_state, %USERPROFILE%\.bun\bin\bun.exe
    • Processes: Python running cat.py, or any process with __DAEMONIZED=1 in its environment
    • Linux: unexpected entries in /etc/sudoers or /etc/sudoers.d/
    • StepSecurity (third party) also published hashes for the malicious VSIX and related files; see its write-up.
  3. Clean up first, then rotate. Stop those processes and delete the persistence files, unloading the LaunchAgent first on macOS. Then rotate every credential the machine could reach: GitHub and npm tokens, SSH keys, AWS/GCP/Azure/Kubernetes credentials, Vault tokens and .env contents.
  4. Audit and rebuild. Review access logs. The vendor says to treat the machine as possibly still infected and consider rebuilding it after rotating.
  5. If the same machine also installed a malicious TanStack package. That is a different payload (Mini Shai-Hulud). Snyk and Tenable report it may wipe the home directory when its stolen token is revoked. Keep the two apart, but the “remove persistence first, then rotate” order matters even more here.
  6. Long term. Require two-person approval for releases; alert on audit-log events such as deleted workflow runs; pin GitHub Actions to commit SHAs; if you use a minimum release age, pin pnpm to 10.16 or later and check the version in CI so the setting is actually enforced; keep long-lived CLI tokens in a secret manager.

No automated tool caught this. The Marketplace emails the publisher on every upload, and a maintainer noticed the unexpected release within about 6 minutes.

Attack flow

Read left to right: this is the order the attack happens in. A blue shield means the step can be stopped; the earlier, the better. Click an icon for details.

Read top to bottom: this is the order the attack happens in. A blue shield means the step can be stopped; the earlier, the better. Tap an icon for details.

Nx Console 18.95.0 trojanized: a VS Code extension update that stole developer credentials: 1. A compromised upstream TanStack package steals an Nx contributor's GitHub CLI token → 2. The attacker publishes malicious 18.95.0 as that contributor → 3. Developers' editors auto-update to 18.95.0 → 4. On startup, the extension downloads and runs an obfuscated payload → 5. Credentials are harvested, sent out, and the malware tries to persist → 6. A GitHub employee's device is compromised and internal repositories are exfiltratedCVE-2026-48027 · Nx Console 18.95.0 trojanized: a VS Code extension update that stole developer credentialsAttackerYour systemA compromised upstream TanStack package steals an Nx contributor's GitHub CLI token — On 2026-05-11 an Nx contributor ran a routine install in another project and pulled in a malicious TanStack version that was only 77 minutes old. The project had a 7-day minimum-release-age delay, but its pinned pnpm 10.14 didn't support that setting and silently ignored it. The token sat in a config file any local process could read. 1A compromisedupstream TanStackpackage steals anNx contributor'…The attacker publishes malicious 18.95.0 as that contributor — Between May 11 and 16 the attacker used this access to push commits and delete workflow runs. On May 18 the bad version went up on the VS Code Marketplace and Open VSX. At the time, one person could publish Nx Console with no second approver. The vendor has not said exactly which credential or path was used to publish. 2The attackerpublishesmalicious 18.95.0as that contributorDevelopers' editors auto-update to 18.95.0 — No user action is needed. Official counts: 28 installs from the Microsoft Marketplace and 41 downloads from Open VSX; Nx's own analytics recorded about 6,000 activations. 3Developers'editorsauto-update to18.95.0On startup, the extension downloads and runs an obfuscated payload — According to StepSecurity, a small loader was injected into the main file. It fetched a package from an "orphan" commit (not on any branch) that the attacker had pushed into the official nrwl/nx repository, then installed the Bun runtime to run the payload. The code came from the project's own trusted repository, not an obviously suspicious domain. 4On startup, theextensiondownloads and runsan obfuscate…Credentials are harvested, sent out, and the malware tries to persist — Targets included Vault, Kubernetes, AWS, npm, GitHub tokens and Actions secrets, 1Password CLI contents (only if an op session was signed in), private keys, and GCP and Docker credentials, sent out over HTTPS, the GitHub API and DNS. On Linux it tried to edit sudoers; on macOS it left a LaunchAgent. 5Credentials areharvested, sentout, and themalware tries t…A GitHub employee's device is compromised and internal repositories are exfiltrated — GitHub disclosed that an employee's device was infected by a poisoned VS Code extension (linking the Nx advisory); the attacker claims about 3,800 internal repositories were taken, which GitHub called "directionally consistent" with its investigation so far; GitHub said it found no evidence of impact on customer data outside internal repositories. 6A GitHubemployee's deviceis compromised andinterna…Attack pathCan be stopped herePlainCVE · plaincve.date/en/vulns/cve-2026-48027-nx-console-malicious-extension · CC BY 4.0
Nx Console 18.95.0 trojanized: a VS Code extension update that stole developer credentials: 1. A compromised upstream TanStack package steals an Nx contributor's GitHub CLI token → 2. The attacker publishes malicious 18.95.0 as that contributor → 3. Developers' editors auto-update to 18.95.0 → 4. On startup, the extension downloads and runs an obfuscated payload → 5. Credentials are harvested, sent out, and the malware tries to persist → 6. A GitHub employee's device is compromised and internal repositories are exfiltratedCVE-2026-48027 · Nx Console 18.95.0trojanized: a VS Code extension updatethat stole developer credentialsA compromised upstream TanStack package steals an Nx contributor's GitHub CLI token — On 2026-05-11 an Nx contributor ran a routine install in another project and pulled in a malicious TanStack version that was only 77 minutes old. The project had a 7-day minimum-release-age delay, but its pinned pnpm 10.14 didn't support that setting and silently ignored it. The token sat in a config file any local process could read. 1AttackerA compromised upstream TanStackpackage steals an Nxcontributor's GitHub CLI tokenThe attacker publishes malicious 18.95.0 as that contributor — Between May 11 and 16 the attacker used this access to push commits and delete workflow runs. On May 18 the bad version went up on the VS Code Marketplace and Open VSX. At the time, one person could publish Nx Console with no second approver. The vendor has not said exactly which credential or path was used to publish. 2AttackerThe attacker publishesmalicious 18.95.0 as thatcontributorDevelopers' editors auto-update to 18.95.0 — No user action is needed. Official counts: 28 installs from the Microsoft Marketplace and 41 downloads from Open VSX; Nx's own analytics recorded about 6,000 activations. 3Your systemDevelopers' editors auto-updateto 18.95.0On startup, the extension downloads and runs an obfuscated payload — According to StepSecurity, a small loader was injected into the main file. It fetched a package from an "orphan" commit (not on any branch) that the attacker had pushed into the official nrwl/nx repository, then installed the Bun runtime to run the payload. The code came from the project's own trusted repository, not an obviously suspicious domain. 4Your systemOn startup, the extensiondownloads and runs anobfuscated payloadCredentials are harvested, sent out, and the malware tries to persist — Targets included Vault, Kubernetes, AWS, npm, GitHub tokens and Actions secrets, 1Password CLI contents (only if an op session was signed in), private keys, and GCP and Docker credentials, sent out over HTTPS, the GitHub API and DNS. On Linux it tried to edit sudoers; on macOS it left a LaunchAgent. 5Your systemCredentials are harvested, sentout, and the malware tries topersistA GitHub employee's device is compromised and internal repositories are exfiltrated — GitHub disclosed that an employee's device was infected by a poisoned VS Code extension (linking the Nx advisory); the attacker claims about 3,800 internal repositories were taken, which GitHub called "directionally consistent" with its investigation so far; GitHub said it found no evidence of impact on customer data outside internal repositories. 6AttackerA GitHub employee's device iscompromised and internalrepositories are exfiltratedAttack pathCan be stopped herePlainCVE · CC BY 4.0plaincve.date/en/vulns/cve-2026-48027-nx-console-malicious-extension
Free to use in reporting and teaching under CC BY 4.0. Attribution is already on the image.
  1. Attacker

    A compromised upstream TanStack package steals an Nx contributor's GitHub CLI token

    On 2026-05-11 an Nx contributor ran a routine install in another project and pulled in a malicious TanStack version that was only 77 minutes old. The project had a 7-day minimum-release-age delay, but its pinned pnpm 10.14 didn't support that setting and silently ignored it. The token sat in a config file any local process could read.

    Defense: Check that security settings are actually supported by your tool version (this one needs pnpm 10.16+); keep long-lived CLI tokens in a secret manager, not plain files.

  2. Attacker

    The attacker publishes malicious 18.95.0 as that contributor

    Between May 11 and 16 the attacker used this access to push commits and delete workflow runs. On May 18 the bad version went up on the VS Code Marketplace and Open VSX. At the time, one person could publish Nx Console with no second approver. The vendor has not said exactly which credential or path was used to publish.

    Defense: Require two administrators to approve releases (the approver can't be the person who triggered the run); monitor audit logs for events such as workflow deletion.

  3. Your system

    Developers' editors auto-update to 18.95.0

    No user action is needed. Official counts: 28 installs from the Microsoft Marketplace and 41 downloads from Open VSX; Nx's own analytics recorded about 6,000 activations.

    Defense: Update to 18.100.0 or later; list installed extensions with versions to check for 18.95.0.

  4. Your system

    On startup, the extension downloads and runs an obfuscated payload

    According to StepSecurity, a small loader was injected into the main file. It fetched a package from an "orphan" commit (not on any branch) that the attacker had pushed into the official nrwl/nx repository, then installed the Bun runtime to run the payload. The code came from the project's own trusted repository, not an obviously suspicious domain.

    Defense: StepSecurity suggests watching for unexpected connections from developer machines to cloud metadata addresses or Sigstore endpoints.

  5. Your system

    Credentials are harvested, sent out, and the malware tries to persist

    Targets included Vault, Kubernetes, AWS, npm, GitHub tokens and Actions secrets, 1Password CLI contents (only if an op session was signed in), private keys, and GCP and Docker credentials, sent out over HTTPS, the GitHub API and DNS. On Linux it tried to edit sudoers; on macOS it left a LaunchAgent.

    Defense: Stop the malicious processes and delete persistence files first, then rotate every credential.

  6. Attacker

    A GitHub employee's device is compromised and internal repositories are exfiltrated

    GitHub disclosed that an employee's device was infected by a poisoned VS Code extension (linking the Nx advisory); the attacker claims about 3,800 internal repositories were taken, which GitHub called "directionally consistent" with its investigation so far; GitHub said it found no evidence of impact on customer data outside internal repositories.

    Defense: Audit access logs; treat an affected machine as possibly still infected and consider rebuilding it after rotation.

Who is affected

This is not a coding mistake. Someone got hold of publishing access and deliberately shipped a booby-trapped version. CWE-506 (Embedded Malicious Code) is the category for exactly that.

ConditionAffected?
Nx Console (nrwl.angular-console) installed in VS Code or a fork such as Cursor, with auto-update on between about 12:30 and 13:09 UTC on 2026-05-18Possibly compromised; the vendor says to treat the machine as compromised
Installed 18.95.0 by handPossibly compromised
18.94.0 or earlier, with no update during the windowNot affected
18.100.0 or laterSafe version; but if 18.95.0 was ever installed, updating does not remove malware already on the machine
Nx Console’s JetBrains pluginNot mentioned by any source; the postmortem covers only the VS Code extension, and there is no evidence it was affected

Time on each marketplace: VS Code Marketplace about 12:30–12:48 UTC, Open VSX about 12:33–13:09 UTC. The official counts are 28 installs from the Microsoft Marketplace and 41 downloads from Open VSX (21 unique IPs), but Nx’s own analytics recorded about 6,000 activations. The vendor explains that the numbers measure different things (installs versus activations).

How it works

Nx’s postmortem breaks the incident into four linked failures:

  1. An upstream package was compromised first. On 2026-05-11 attackers published malicious versions of 42 @tanstack/* npm packages (CVE-2026-45321).
  2. A safety setting silently did nothing. An Nx contributor ran a routine install in another project. That project had a 7-day “minimum release age” rule that should have skipped very new packages, but the rule needs pnpm 10.16 or later and the project was pinned to pnpm 10.14, which quietly ignores settings it doesn’t know. A malicious TanStack version only 77 minutes old got installed.
  3. An unprotected CLI token. The contributor’s GitHub CLI token was within reach of local programs: the config file ~/.config/gh/hosts.yml, the gh auth token command, or the memory of a running gh process. The post-mortem says it has not established which path the malware took, only that it obtained and used the token within 74 seconds of running. The attacker used it from May 11 to May 16, pushing commits and deleting workflow runs.
  4. One person could publish. Unlike Nx’s other products, publishing Nx Console needed no second approver.

On May 18 the malicious 18.95.0 was uploaded, and the Marketplace recorded the upload as coming from the compromised contributor. The advisory says the stolen credentials let the attacker run workflows as a contributor, but the vendor has not said exactly which token or path was used.

According to StepSecurity’s analysis, a small loader was injected into the extension’s main file. As soon as the extension started (for example, when a workspace was opened), the loader fetched a package from an “orphan” commit the attacker had pushed into the official nrwl/nx repository, installed the Bun runtime, and ran a heavily obfuscated payload. The key point: the malware was served from the project’s own trusted repository, not an obviously suspicious domain.

Behaviour confirmed by the vendor: it harvested Vault tokens, Kubernetes and AWS IAM auth, npm .npmrc tokens and npm OIDC token exchange, AWS instance metadata, Secrets Manager, SSM and Web Identity tokens, GitHub tokens and Actions secrets, process memory, 1Password CLI content (only if an op CLI session was signed in at the time), private keys, connection strings, and GCP and Docker credentials; sent them out over HTTPS, the GitHub API and DNS; and on Linux tried to add itself to sudoers to persist.

Behaviour reported only by StepSecurity (third party): reading the Claude Code settings file ~/.claude/settings.json, scanning process memory on Linux, encrypting data before sending it, installing an hourly Python backdoor on macOS that took signed commands via GitHub search, and generating Sigstore/SLSA provenance so stolen npm tokens could publish packages with valid-looking signatures.

The flawed release setup (conceptual illustration, not Nx’s actual configuration):

Show code example(yaml)
# Any contributor with write access can trigger a direct publish to the marketplace
publish:
  steps:
    - run: publish-extension   # no second approver

The fixed approach:

Show code example(yaml)
# The publish job is bound to an environment that needs review
publish:
  environment: release        # two admins must approve; the approver can't be the person who triggered it
  steps:
    - uses: some/action@<full commit SHA>   # Actions pinned to an exact SHA
    - run: publish-extension

A second lesson is that “configured” is not the same as “enforced”: protections like a minimum release age only work if the tool version you actually run supports them; otherwise they may be silently ignored.

Timeline

Date / time (UTC)Event
2026-05-11 19:20–19:2684 malicious TanStack versions published
2026-05-11 20:43An Nx contributor’s machine runs the malicious TanStack package; GitHub CLI token stolen
2026-05-11 → 05-16 00:04Attacker uses the token (commits, workflow-run deletion)
2026-05-18 12:30Malicious 18.95.0 uploaded to the VS Code Marketplace
12:33Open VSX publish completes
12:36Maintainer receives the publisher email and spots the unexpected release
12:47–12:48Removed from the VS Code Marketplace
13:09Removed from Open VSX
13:58Incident response starts; the compromised engineer’s access revoked
2026-05-18 17:01GHSA-c9j4-9m59-847w published (time per the post-mortem; GitHub’s API published_at is 17:03:43 UTC)
2026-05-1818.100.0 released (release notes list features only, nothing about security)
2026-05-20GitHub discloses an employee device hit by a poisoned VS Code extension; internal repositories taken (the attacker claims about 3,800)
2026-05-21Nx publishes its postmortem
2026-05-27CVE-2026-48027 published; added to CISA KEV (due 2026-06-10)
2026-05-28CISA alert on Nx Console and GitHub repository supply-chain compromises, as reported by SANS

Further reading

  • Scoring differences: the 9.8 shown on this page is NVD’s CVSS 3.1 score; GitHub (the CNA) scores it 9.3 under CVSS 4.0. Both mark it as needing no user action, which fits the fact that auto-update alone delivered it. The GitHub advisory page showed no CWE or score when viewed, but the CVE record GitHub published carries CWE-506 and 9.3.
  • Dates and durations disagree: the CVE/NVD description says May 19; every other source says May 18, which this page uses. Accounts of how long it stayed on the VS Code Marketplace also differ: the GHSA advisory and CVE record say 12:30 to 12:48, about 18 minutes. Nx’s postmortem timeline says it was unpublished at 12:47, about 17 minutes after upload and about 11 minutes after the 12:36 notification email, yet the same post’s opening summary says the package was “live ~11 minutes”, and StepSecurity, citing the official advisory, also says about 11. The sources don’t explain the gap (for example, whether upload time equals the time it became downloadable), so this page lists both.
  • Ransomware flag: the CISA KEV record marks known ransomware campaign use as “Known”. This page reports that as CISA’s classification. None of the sources we read connects ransomware directly to the Nx Console incident. The only link is a group-level claim, relayed by Tenable and Snyk (Snyk attributes it to Unit 42, based on a BreachForums announcement), of a partnership between TeamPCP and the Vect ransomware group, and SANS reports the Vect leak site was still inactive in early June.
  • The GitHub breach: GitHub called the attacker’s claims “directionally consistent” with its investigation and found no evidence that customer data outside internal repositories was affected. It rotated its secrets and its GitHub Enterprise Server signing key; GHES administrators must rotate the GPG key so future updates install. GitHub made no attribution.
  • The wider campaign: security vendors call the upstream TanStack wave “Mini Shai-Hulud” and attribute it to TeamPCP. The TanStack advisory itself names no campaign, Unit 42 notes the worm’s source code went public on May 12, and SANS calls attribution for later waves ambiguous. Vendors also count the waves differently. No source says the Nx Console malware itself spread like a worm.
  • Signed isn’t safe: the upstream TanStack packages carried valid SLSA Build Level 3 provenance. A valid signature proves which pipeline built a package, not that the code is harmless.
  • AI angle: StepSecurity reports the payload read Claude Code’s settings file; the Nx postmortem does not mention AI at all.
  • StepSecurity calls this the second supply-chain attack on Nx in under a year, after an npm incident in August 2025; we have not checked that against a primary source.
  • Unconfirmed: why versions 18.96 to 18.99 were skipped, and whether the JetBrains plugin was affected.

Verification Checked item by item against sources by AI under our review rules, all passed; not human-reviewed and not yet reproduced in our lab

AI review2026-09-29 · review rules

Verification records describe the environment and the result only, never reproduction steps or code that could attack other people’s systems. See our policy.

Sources

  1. AdvisoryCompromised Nx Console version 18.95.0 (GHSA-c9j4-9m59-847w) · Nx (nrwl) via GitHub, 2026-05-18 · accessed 2026-09-23
  2. VendorPostmortem: Nx Console v18.95.0 supply-chain compromise · Nx, 2026-05-21 · accessed 2026-09-23
  3. Patch / releaseReleases · nrwl/nx-console · Nx (nrwl) via GitHub, 2026-05-18 · accessed 2026-09-23
  4. OtherWhy Nx Console is removed from VSCode Marketplace? (issue #3139) · GitHub (nrwl/nx-console), 2026-05-18 · accessed 2026-09-23
  5. AdvisoryCVE-2026-48027 record · CVE Program / GitHub (CNA), 2026-05-27 · accessed 2026-09-23
  6. CVE / NVD / OSVCVE-2026-48027 · NIST NVD, 2026-05-27 · accessed 2026-09-23
  7. CVE / NVD / OSVCVE-2026-45321 · NIST NVD, 2026-05-12 · accessed 2026-09-23
  8. AdvisoryMalware in 42 @tanstack/* packages exfiltrates cloud credentials, GitHub tokens, and SSH keys · TanStack via GitHub, 2026-05-11 · accessed 2026-09-23
  9. VendorInvestigating unauthorized access to GitHub's internal repositories · GitHub, 2026-05-20 · accessed 2026-09-23
  10. ResearchNx Console VS Code extension compromised · StepSecurity, 2026-05-18 · accessed 2026-09-23
  11. ResearchTanStack npm Packages Hit by Mini Shai-Hulud · Snyk, 2026-05-11 · accessed 2026-09-23
  12. ResearchMini Shai-Hulud Supply Chain Attack CVE-2026-45321 FAQ · Tenable, 2026-05-21 · accessed 2026-09-23
  13. ResearchTeamPCP Supply Chain Campaign: Activity Through 2026-06-07 · SANS Internet Storm Center, 2026-06-08 · accessed 2026-09-23
  14. ResearchThe npm Threat Landscape: Attack Surface and Mitigations · Palo Alto Networks Unit 42, 2026-07-15 · accessed 2026-09-23
  15. NewsGitHub Internal Repositories Breached via Malicious Nx Console VS Code Extension · The Hacker News, 2026-05-21 · accessed 2026-09-23

Press brief

In one sentence

Nx Console is a popular VS Code extension for developers. On May 18, 2026, attackers used access stolen from a contributor in an earlier package compromise to publish a booby-trapped version 18.95.0; users with auto-update on were hit without doing anything, and credentials for cloud and code platforms on their machines were stolen. GitHub said an employee's device was infected this way; the attacker claims about 3,800 internal repositories were taken, and GitHub said that was directionally consistent with its investigation so far. The US agency CISA added the flaw to its Known Exploited Vulnerabilities catalog on May 27.

Key facts

Affected version
18.95.0 only; 18.100.0 or later is safe cveawg.mitre.org
Severity
CVSS 3.1 9.8 (NVD, the score this page shows); CVSS 4.0 9.3 (GitHub, the CNA) services.nvd.nist.gov
Exposure window
2026-05-18, about 12:30–13:09 UTC nx.dev
Added to CISA KEV
2026-05-27 (due 2026-06-10) services.nvd.nist.gov
Downstream impact
Attacker claims about 3,800 GitHub internal repositories taken (GitHub says directionally consistent; investigation ongoing) github.blog

Confirmed

  • Attackers published a malicious Nx Console 18.95.0 that stole many kinds of credentials on startup (vendor advisory and postmortem).
  • It started when a contributor's GitHub CLI token was stolen in the TanStack package compromise (CVE-2026-45321).
  • GitHub confirmed an employee's device was infected by a poisoned VS Code extension and internal repositories were taken; the attacker claims about 3,800, which GitHub called "directionally consistent" with its investigation so far.
  • CISA has added the flaw to its Known Exploited Vulnerabilities catalog.

Unconfirmed / disputed

  • Incident date: the CVE/NVD text says May 19; the vendor, StepSecurity and GitHub all say May 18.
  • KEV marks ransomware campaign use as "Known", but no source ties ransomware directly to this Nx Console incident.
  • The vendor has not said exactly which credential or pipeline the attacker used to publish.
  • How long it was on the VS Code Marketplace: the GHSA advisory and CVE record say it went up at 12:30 and came down at 12:48, about 18 minutes. The Nx postmortem timeline says it was unpublished at 12:47, about 17 minutes after upload and about 11 minutes after the notification email, but the same post's summary says the package was "live ~11 minutes", and StepSecurity, citing the official advisory, also says about 11 minutes. The sources do not explain the gap.

Quotable line

The malware didn't come from a shady website; it came from the project's own official repository, delivered by the automatic updates users trusted.

Images

Download the share image (PNG) · Attack flow diagram (downloadable)

Please credit "PlainCVE" and link to this page. Full citation format is under "How to cite" below. Found a factual error? Report it.

How to cite this page

This article is CC BY 4.0. Please keep the attribution and link when republishing.

PlainCVE Team (2026). "Nx Console 18.95.0 trojanized: a VS Code extension update that stole developer credentials". PlainCVE. https://plaincve.date/en/vulns/cve-2026-48027-nx-console-malicious-extension (accessed YYYY-MM-DD)
BibTeX
@misc{cve202648027nxconsolemaliciousextension2026,
  title  = {Nx Console 18.95.0 trojanized: a VS Code extension update that stole developer credentials},
  author = {PlainCVE Team},
  year   = {2026},
  howpublished = {PlainCVE},
  url    = {https://plaincve.date/en/vulns/cve-2026-48027-nx-console-malicious-extension},
  note   = {Updated 2026-09-29}
}