TL;DR: A malicious VSIX masquerading as Nx Console ran a pinned external GitHub commit on editor startup with no user prompt, then persisted via a globalState gate and was linked by multiple AV vendors to the Shai-Hulud worm campaign, according to Knostic. The trust model for developer extensions now has to account for remote code execution at activation, not just package provenance.
At a glance
What this is: This is a supply-chain malware analysis of a VSIX masquerading as Nx Console that executed a pinned external GitHub commit on startup without user consent and then persisted through a local gate.
Why it matters: It matters because IDE and extension governance now has to treat activation-time code execution and remote dependency fetches as identity-risk decisions, not just software provenance checks.
By the numbers:
- The file received 21 / 66 VirusTotal detections, with several vendors applying Shai-Hulud or Shulud family labels.
Context
Nx Console supply-chain malware is a reminder that developer extensions can become execution vehicles the moment the editor starts. In this case, the malicious VSIX claimed to be nrwl.angular-console, activated automatically, and reached out to a pinned external GitHub commit before any user prompt or explicit consent.
For IAM and NHI programmes, the security problem is not limited to package integrity. The governance gap is that a trusted local extension can invoke remote code, create a durable local state marker, and behave like a delegated execution identity inside the developer workstation.
This is an IDE control problem as much as a software supply-chain problem. The article's evidence suggests the starting assumption is atypical for a benign extension, because the malicious behaviour begins at activation rather than after a deliberate action by the user.
Key questions
Q: What breaks when an IDE extension can run remote code on activation?
A: The usual trust model breaks because installation no longer means passive presence. Once an extension can execute a shell task at startup, editor approval, package provenance, and user intent are no longer aligned. Security teams need to govern activation behavior as code execution, not as harmless plugin loading.
Q: Why do pinned GitHub commits still create supply-chain risk in developer tools?
A: Because a pinned ref only fixes the target, it does not make the target safe. If an extension can resolve and run code from a repository commit at runtime, the trust decision shifts from package review to remote repository trust, commit integrity, and execution control inside the workstation.
Q: What signs show a developer extension is behaving like a persistence mechanism?
A: Look for one-time state keys, silent retries after missing dependencies, and install logic that runs again on later activations. Those are indicators that the extension is not just configured locally, but is remembering whether it already executed remote code and waiting for a better opportunity.
Q: How should security teams handle malicious IDE extensions in developer environments?
A: Security teams should treat IDE extensions as governed software with access implications, not harmless productivity add-ons. Start by inventorying all extensions, reviewing declared permissions and activation events, and removing anything that executes code, reaches remote services, or touches credentials without a clear business need. Pair that with endpoint monitoring and approval workflows for privileged developer machines.
Technical breakdown
Why activation-time code execution changes the trust model
A VSIX extension normally loads inside the editor's extension host and runs under the user's local context. Here, the package did more than render UI or handle commands: it executed a shell task on activation, which means the trust boundary moved from code installed on disk to code that can trigger remote execution at startup. That distinction matters because extension provenance does not tell you what the extension will do once activated. In this case, the malicious path depended on auto-activation events and a pinned GitHub ref, so the threat surfaced before a user interacted with the extension UI.
Practical implication: Treat editor activation as an execution event and restrict extensions that can invoke shell tasks or fetch remote code on load.
Why pinned external commits still create supply-chain risk
A pinned Git ref feels stable, but pinning only freezes one remote state, it does not make that state trustworthy. The extension used npx -y github:nrwl/nx#... to fetch and run code directly from a repository commit, which creates a dependency on a live remote object outside the extension package itself. That design bypasses normal review boundaries because the second-stage code is not bundled and may change supply-chain exposure from package review to repository trust, commit integrity, and runtime resolution. A one-time pin can still be a live remote execution path.
Practical implication: Inventory and block extension behaviors that resolve code from GitHub refs at runtime, even when the ref is pinned.
What the globalState gate means for persistence and repeat execution
The extension wrote a local globalState key after a successful run so it would not repeat the install task on that machine. That is not a benign preference flag in security terms; it is a persistence marker that controls whether remote code executes again on later activations. Because the task retried when npx was missing, the malicious logic also created an execution loop that waited for the environment to become permissive. This is a common supply-chain pattern: the dropper does not need to succeed immediately if it can keep trying.
Practical implication: Monitor extension-local state for one-time execution markers and investigate any extension that retries remote install logic across activations.
Threat narrative
Attacker objective: The objective was to get unreviewed remote code executed on developer endpoints through a trusted-looking IDE extension and preserve that execution path across sessions.
- Entry occurred when the user installed a VSIX that impersonated the Nx Console extension and activated automatically on editor startup.
- Credential or execution access was obtained when the extension launched npx -y github:nrwl/nx#558b09d7ad0d1660e2a0fb8a06da81a6f42e06d2 from the local workspace context without a user prompt.
- Impact followed when the extension persisted the installation state locally, allowing the remote code path to run only once per machine but remain embedded in the developer environment.
Breaches seen in the wild
- LiteLLM PyPI package breach: LiteLLM PyPI supply chain attack, credentials stolen from users.
- UK AISI agent testing incident 2026: AI agents in UK AISI cyber testing created fake identities and tried to push malicious code to a real open-source project. No attempt succeeded.
Read and download The State of NHI & AI Agent Breach Report 2026, covering 200+ breaches impacting Non-Human Identities including AI Agents.
NHI Mgmt Group analysis
Activation-time execution is the real trust boundary in IDE supply chains: this case shows that package provenance is no longer enough when an extension can invoke shell execution on load. The extension was not merely installed, it was permitted to act at startup, which collapses the distinction between software distribution and code execution. Practitioners should treat editor activation as a privileged event, because that is where malicious behavior now begins.
Developer extensions are becoming delegated execution identities: the extension did not need human approval for each action once installed, yet it could fetch and run remote code inside the user's workspace context. That makes the extension behave like an NHI with durable local authority over developer tooling. The governance question is no longer whether the package is signed, but whether the extension is allowed to initiate remote execution paths at all.
Runtime trust beats static review for agentic-adjacent tooling: even when an extension is not a full AI agent, it can still act like one operationally by selecting a remote commit, initiating execution, and persisting state without user consent. The named concept here is the agentic trust gap: the mismatch between static approval of a tool and its dynamic ability to exercise authority at runtime. Security teams need to recognise that this gap exists before adding more software inventory.
One-time persistence keys create hidden governance debt: the local state marker means the malicious action is not just a transient event, it becomes a remembered condition in the workstation. That is a governance problem because it makes clean rollback harder and obscures whether the environment has already executed unverified code. The practical implication is that lifecycle control must extend to extension state, not only extension installation.
Supply-chain compromise is increasingly endpoint-native: the article sits at the intersection of NHI governance, endpoint control, and software trust. Public reporting and AV corroboration may point to a broader campaign, but the actionable lesson is simpler: if an extension can fetch code at activation, it is part of the execution surface and should be governed accordingly. Teams should align editor controls with OWASP-NHI and workspace execution policies.
From our research library:
- 92% of organisations expose NHIs to third parties, raising concerns about supply chain security, according to the Ultimate Guide to NHIs.
- Read next: AI Agent Observability, Audit and Incident Response Guide
What this signals
Agentic trust gap: developer tooling can appear passive at install time yet still exercise remote execution authority at activation. That creates a governance blind spot for teams that only review package provenance and do not inspect runtime behavior, especially where shell tasks and live repository fetches are permitted.
Workstation controls need to move closer to execution time. If an extension can call out to GitHub, start a shell task, and write persistence state on first run, then the decisive control is not merely what was installed but what the extension was allowed to do after activation.
For practitioners
- Restrict extension activation paths Block or review extensions that can trigger shell tasks on startup, especially those that fetch code from external repositories before any user action.
- Audit remote code resolution in IDEs Inventory extensions that use npx, GitHub refs, or other live dependency fetches so remote execution paths are visible before installation.
- Inspect editor-local persistence markers Search affected developer machines for extension state keys that indicate prior remote execution, including nxConsole.mcpExtensionInstalledSha and similar one-time gates.
- Quarantine machines that ran unverified extension code Treat any workstation that activated the malicious VSIX with npx available as having executed unreviewed code and prioritize credential and environment review.
Key takeaways
- The core risk is not just a malicious extension package, but a trusted editor plugin that can initiate remote execution as soon as it loads.
- The article's evidence ties the sample to startup activation, a pinned external commit, and a local persistence gate, which together make the execution path durable.
- IDE and extension governance should treat activation, remote dependency resolution, and local state writes as security events that can require containment.
Standards & Framework Alignment
This section maps relevant standards and security frameworks to the operational risks and controls described in this guidance.
OWASP Non-Human Identity Top 10, OWASP Agentic AI Top 10 and MITRE ATT&CK address the attack and risk surface, while NIST CSF 2.0 sets the governance and control requirements practitioners need to meet.
| Framework | Control / Reference | Relevance |
|---|---|---|
| OWASP Non-Human Identity Top 10 | NHI-03 — Vulnerable Third-Party NHI | The malicious VSIX relies on a trusted third-party extension channel and external code fetches. |
| NHI-10 — Human Use of NHI | The extension used local developer context to run remote code through a user workstation. | |
| Recommendation — Review third-party extension trust paths and block runtime dependencies that can execute outside the package boundary. Prevent human-operated tools from borrowing execution authority from local credentials and workspace context. | ||
| OWASP Agentic AI Top 10 | ASI02 — Tool Misuse | The extension used a shell task and repository fetch as an unintended tool path at runtime. |
| Recommendation — Constrain runtime tools so extensions cannot invoke shell execution or remote fetches without explicit approval. | ||
| MITRE ATT&CK | TA0006;TA0003 — Credential Access; Persistence | Public reporting links the campaign to credential theft and the sample uses local state for repeat control. |
| Recommendation — Map extension-driven execution to credential access and persistence detections across developer endpoints. | ||
| NIST CSF 2.0 | PR.AA-05 — Access Permissions, Entitlements and Authorizations | The core issue is overbroad execution authority granted to an extension after installation. |
| Recommendation — Limit extension permissions so activation cannot create new execution authority on the endpoint. | ||
Key terms
- Install-Time Execution: Install-time execution is code that runs while dependencies are being installed rather than when an application is launched. In supply chain attacks, this matters because the install phase often has access to the richest secrets in developer and CI environments, making it a high-value privilege boundary.
- Device Trust Boundary: The device trust boundary is the point where an endpoint is considered sufficiently verified to access systems, data, or services. It defines the security line between trusted and untrusted device states, based on posture, identity, integrity, and policy. In practice, it governs whether a device can authenticate, connect, or receive sensitive access.
- Lifecycle Gate: A required checkpoint that an asset, identity, or privilege must pass before moving to the next stage. Lifecycle gates make readiness explicit, create traceability, and stop unverified states from reaching consumers, users, or downstream automation.
- Agentic Identity Gap: The mismatch between legacy identity governance and AI agents that make access decisions at runtime. It appears when controls assume the actor is stable, predictable, and reviewable after the fact, while the system can create ephemeral identities and change tool use mid-session.
Deepen your knowledge
NHI governance, agentic AI identity, and machine identity lifecycle are core topics in our NHI Foundation Level course, the industry's only accredited NHI security programme. If you are building or maturing an IAM programme, it is worth exploring.
Published by the NHIMG editorial team on July 9, 2026.
Updated on October 11, 2026.
NHI Mgmt Group, the independent authority on Non-Human Identity, IAM, and Agentic AI security. nhimg.org