What Happened
Version 18.95.0 of the Nx Console extension for Visual Studio Code was published with malicious code designed to steal developer credentials. This compromised version contained a 498 KB obfuscated payload executing from a dangling orphan commit in the nrwl/nx GitHub repository. With over 2.2 million installations, the extension remained available until StepSecurity identified and reported the breach. The root cause was a compromised developer's machine with publishing rights to the extension marketplace.
Timeline
The attack sequence unfolded as follows:
- Initial compromise: Attacker gained access to a developer's machine with marketplace publishing credentials.
- Malicious payload creation: 498 KB obfuscated code prepared and hosted on a dangling orphan commit in the nrwl/nx repository.
- Version 18.95.0 published: Compromised extension released to Visual Studio Code marketplace.
- Discovery: StepSecurity detected the malicious behavior.
- Response: Compromised version removed from the marketplace.
The gap between publication and detection remains unclear.
Which Controls Failed or Were Missing
This incident reveals failures across multiple control layers:
Publishing credential security: The developer's machine lacked sufficient protection to prevent credential theft, allowing direct publishing access without additional verification.
Code signing and verification: The malicious version passed through automated checks without human review catching the payload addition or unusual external code execution.
Multi-factor authentication on publishing actions: If MFA was required, it either failed or wasn't implemented. The attacker published using stolen credentials alone.
Anomaly detection: A 498 KB payload addition should trigger automated alerts. The orphan commit execution pattern went undetected.
Developer environment hardening: The compromised machine lacked adequate segmentation. Publishing credentials should not reside on a standard development workstation.
What the Relevant Standards Require
The NIST Cybersecurity Framework addresses supply chain security. The GOVERN function requires supply chain risk management processes, while the IDENTIFY function calls for cataloging external dependencies. This incident shows the risk of relying solely on the extension marketplace for these functions.
ISO/IEC 27001:2022 Annex A Control 5.19 requires security requirements in supplier agreements. Control 8.32 demands formal procedures for changes to information processing facilities, such as publishing a new extension version.
PCI DSS Requirement 8.3.2 mandates strong authentication, with 8.3.6 specifically requiring MFA for remote access to the cardholder data environment. Organizations using Nx Console learned their development environment connects directly to their CDE through compromised tooling.
NIST SP 800-53 Rev 5 Control SA-15 requires documenting and monitoring the security of development tools. Control SR-3 demands identifying and documenting supply chain elements, including IDE extensions. Control SR-11 requires mechanisms to detect counterfeit components, such as a malicious extension version.
The gap: most security teams apply these controls to production dependencies but not to developer tooling. Your IDE extensions have the same access to credentials and code as your CI/CD pipeline.
Lessons and Action Items for Your Team
Separate publishing credentials from development machines. Use dedicated, hardened systems for publishing actions affecting external users. Implement a workflow requiring code review, automated scanning, and MFA on a separate system.
Inventory your development tool supply chain. Document every IDE extension, CLI tool, and development dependency. For each, note who maintains it, how it's updated, what permissions it requires, and who can install it.
Monitor extension permission changes. Set up alerts for permission escalations in your approved tooling. The Nx Console payload required execution permissions that the legitimate extension didn't need.
Implement credential rotation triggered by tool updates. Rotate any credentials that a tool could access when it updates unexpectedly. This prevents prolonged exposure from stolen credentials.
Baseline your extension behavior. Document normal network activity, file access patterns, and system calls for approved extensions. Use detection tools to alert on deviations.
Require code signing for internal tool distribution. Implement code signing for custom extensions, scripts, or tooling shared internally. Prevent distribution of unsigned tools.
Test your incident response for developer tooling. Conduct exercises to prepare for potential compromises in your development tools. Ensure your team knows how to respond to malicious updates.
The Nx Console incident highlights the need to treat your development environment as part of your attack surface. A compromised developer machine with publishing credentials can affect millions of installations. Apply existing controls to your tooling, not just your production code.



