Ride the Worm: The Latest Compromised NPM Packages and Mastering Supply Chain Attack Response

Blog September 16, 2025
Rohan Parakh, Director of Product Management, ArmorCode
Director of Product Management, ArmorCode Inc.
Jeremy Benensohn - Senior Brand & Content Manager, ArmorCode
Senior Brand & Content Manager, ArmorCode Inc.
Ride the Worm: The Latest Compromised NPM Packages and Mastering Supply Chain Attack Response

Just days after our deep dive into the September 2025 NPM supply chain attack, the JavaScript ecosystem faces an even more dangerous threat. The Shai-Hulud worm represents a fundamental shift from targeted attacks to autonomous, self-propagating malware that doesn’t need human operators to spread.

The Next Evolution of Supply Chain Attacks

While September’s attack required ongoing phishing operations to compromise each maintainer account, Shai-Hulud operates as a true worm—automatically spreading through compromised NPM tokens to infect every accessible package. This isn’t just another supply chain compromise; it’s the first documented case of supply chain malware that recruits its own victims to become attackers.

What Makes This Different:

  • Autonomous Propagation: Spreads automatically without operator involvement
  • Credential Harvesting at Scale: Uses open source secret scanners to target GitHub, AWS, GCP, Azure, and NPM tokens
  • Persistent Infrastructure: Creates lasting backdoors via GitHub Actions workflows
  • 200+ Packages Infected: Including popular libraries like @ctrl/tinycolor (2M+ weekly downloads) and packages from CrowdStrike

The Security Challenge: Visibility When Dependencies Turn Malicious

This attack exposes a critical challenge for application security: how do you track compromise across your entire application landscape when packages can be dynamically weaponized?

Unlike static vulnerabilities, Shai-Hulud demonstrates how legitimate packages can be transformed into attack vectors without changing their core functionality—making traditional scanning insufficient.

Why Visibility Becomes Critical for Supply Chain Incident Response

When self-replicating attacks hit the software supply chain, organizations face two immediate challenges: knowing what’s infected and understanding the blast radius. Traditional ad-hoc dependency tracking fails catastrophically when packages can be compromised after they’re already deployed.

Complete Supply Chain Visibility

Effective incident response requires comprehensive inventory capabilities across your entire organization. You need to instantly identify every instance of affected packages, map their dependency relationships to understand downstream impact, and correlate package versions with attack timelines. Without this visibility, organizations spend critical hours just figuring out what they’re running.

Proactive Risk Assessment

Beyond reactive incident response, supply chain security demands proactive assessment of package health and maintainer practices. Integrating supply chain risk signals—like maintenance activity, security practices, and community trust indicators—enables teams to identify packages with similar risk profiles to those already compromised and prioritize updates based on combined vulnerability and supply chain risk factors.

How ArmorCode ASPM is Helping its Customers

The ArmorCode team is already working with our customers to correlate finding data with open-source package information and identify if the infected packages exist. 

Organizations using our Software Supply Chain Module are finding themselves ahead of the curve as they have full visibility into the entire open-source package landscape (vulnerable or otherwise).

Centralized Package Inventory: Visibility across all applications ensures no dependency goes unnoticed, even in shadow IT or forgotten projects. ArmorCode provides the flexibility to capture this data through SBOM and SCA tools, offering out-of-the-box integrations.

Risk Context Enrichment: Open-source Insights and OpenSSF Scorecard data help identify packages with risky characteristics—poor maintenance, low activity, or suspicious update patterns.

Cross-Application Impact Analysis: When a worm spreads through multiple package versions, ArmorCode’s component tracking shows exactly which applications are affected and need immediate attention.

The New Reality for Supply Chain Security

Traditional approaches assume packages are either compromised or safe. Shai-Hulud proves packages can become compromised and spread that compromise autonomously. This demands a shift from point-in-time scanning to continuous supply chain monitoring.

Why SBOM Visibility Matters More Than Ever:

  • Worms can infect packages you’ve already vetted as “safe”
  • Application landscapes become attack propagation paths
  • Response speed depends on knowing exactly what you’re running

Critical Questions for Your Security Strategy:

  • Do you have complete visibility into every NPM package across your organization?
  • Can you quickly identify which applications are affected when a package turns malicious?
  • How quickly can you identify new supply chain threats and correlate them with your existing dependencies?

The era of “set-and-forget” dependency management is over. Organizations need security platforms that provide complete visibility into their software supply chain, because the next worm might already be in their dependency tree.

Compromised NPM Packages

This is an ongoing situation, and the list below reflects the >200 impacted packages and versions known at the time of this blog’s writing:

PackageVersions
@ahmedhfarag/ngx-perfect-scrollbar20.0.20
@ahmedhfarag/ngx-virtual-scroller4.0.4
@art-ws/common2.0.28, 2.0.22
@art-ws/config-eslint2.0.4, 2.0.5
@art-ws/config-ts2.0.7, 2.0.8
@art-ws/db-context2.0.24, 2.0.21
@art-ws/di2.0.28, 2.0.32
@art-ws/di-node2.0.13
@art-ws/eslint1.0.5, 1.0.6
@art-ws/fastify-http-server2.0.24, 2.0.27
@art-ws/http-server2.0.21, 2.0.25
@art-ws/openapi0.1.9, 0.1.12
@art-ws/package-base1.0.5, 1.0.6
@art-ws/prettier1.0.5, 1.0.6
@art-ws/slf2.0.15, 2.0.22
@art-ws/ssl-info1.0.9, 1.0.10
@art-ws/web-app1.0.3, 1.0.4
@basic-ui-components-stc/basic-ui-components1.0.5
@crowdstrike/commitlint8.1.1, 8.1.2
@crowdstrike/falcon-shoelace0.4.1, 0.4.2
@crowdstrike/foundry-js0.19.1, 0.19.2
@crowdstrike/glide-core0.34.2, 0.34.3
@crowdstrike/logscale-dashboard1.205.1, 1.205.2
@crowdstrike/logscale-file-editor1.205.1, 1.205.2
@crowdstrike/logscale-parser-edit1.205.1, 1.205.2
@crowdstrike/logscale-search1.205.1, 1.205.2
@crowdstrike/tailwind-toucan-base5.0.1, 5.0.2
@ctrl/deluge7.2.1, 7.2.2
@ctrl/golang-template1.4.2, 1.4.3
@ctrl/magnet-link4.0.3, 4.0.4
@ctrl/ngx-codemirror7.0.1, 7.0.2
@ctrl/ngx-csv6.0.1, 6.0.2
@ctrl/ngx-emoji-mart9.2.1, 9.2.2
@ctrl/ngx-emoji-mart9.2.2, 9.2.1
@ctrl/ngx-rightclick4.0.1, 4.0.2
@ctrl/qbittorrent9.7.1, 9.7.2
@ctrl/react-adsense2.0.1, 2.0.2
@ctrl/shared-torrent6.3.1, 6.3.2
@ctrl/tinycolor4.1.1, 4.1.2
@ctrl/torrent-file4.1.1, 4.1.2
@ctrl/transmission7.3.1
@ctrl/ts-base324.0.1, 4.0.2
@hestjs/core0.2.1
@hestjs/cqrs0.1.6
@hestjs/demo0.1.2
@hestjs/eslint-config0.1.2
@hestjs/logger0.1.6
@hestjs/scalar0.1.7
@hestjs/validation0.1.6
@nativescript-community/arraybuffers1.1.6, 1.1.7, 1.1.8
@nativescript-community/gesturehandler2.0.35
@nativescript-community/perms3.0.5, 3.0.6, 3.0.7, 3.0.8, 3.0.9
@nativescript-community/sentry4.6.43
@nativescript-community/sqlite3.5.2, 3.5.3, 3.5.4, 3.5.5
@nativescript-community/text1.6.9, 1.6.10, 1.6.11, 1.6.12, 1.6.13
@nativescript-community/typeorm0.2.30, 0.2.31, 0.2.32, 0.2.33
@nativescript-community/ui-collectionview6.0.6
@nativescript-community/ui-document-picker1.1.27, 1.1.28
@nativescript-community/ui-drawer0.1.30
@nativescript-community/ui-image4.5.6
@nativescript-community/ui-label1.3.35, 1.3.36, 1.3.37
@nativescript-community/ui-material-bottom-navigation7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-material-core7.2.72, 7.2.73, 7.2.74, 7.2.75, 7.2.76
@nativescript-community/ui-material-core-tabs7.2.72, 7.2.73, 7.2.74, 7.2.75, 7.2.76
@nativescript-community/ui-material-ripple7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-material-tabs7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-pager14.1.36, 14.1.37, 14.1.38, 14.1.35
@nativescript-community/ui-pulltorefresh2.5.4, 2.5.5, 2.5.6, 2.5.7
@nexe/config-manager0.1.1
@nexe/eslint-config0.1.1
@nexe/logger0.1.3
@nstudio/angular20.0.4, 20.0.5, 20.0.6
@nstudio/focus20.0.4, 20.0.5, 20.0.6
@nstudio/nativescript-checkbox2.0.6, 2.0.7, 2.0.8, 2.0.9
@nstudio/nativescript-loading-indicator5.0.1, 5.0.2, 5.0.3, 5.0.4
@nstudio/ui-collectionview5.1.11, 5.1.12, 5.1.13, 5.1.14
@nstudio/web20.0.4
@nstudio/web-angular20.0.4
@nstudio/xplat20.0.4, 20.0.5, 20.0.6, 20.0.7
@nstudio/xplat-utils20.0.4, 20.0.5, 20.0.6, 20.0.7
@operato/board9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50, 9.0.51
@operato/data-grist9.0.29, 9.0.35, 9.0.36, 9.0.37
@operato/graphql9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46
@operato/headroom9.0.2, 9.0.35, 9.0.36, 9.0.37
@operato/help9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50, 9.0.51
@operato/i18n9.0.35, 9.0.36, 9.0.37
@operato/input9.0.27, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48
@operato/layout9.0.35, 9.0.36, 9.0.37
@operato/popup9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50
@operato/pull-to-refresh9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47
@operato/shell9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39
@operato/styles9.0.2, 9.0.35, 9.0.36, 9.0.37
@operato/utils9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50, 9.0.51
@teselagen/bio-parsers0.4.29
@teselagen/bounce-loader0.3.16, 0.3.17
@teselagen/file-utils0.3.21
@teselagen/liquibase-tools0.4.1
@teselagen/ove0.7.39
@teselagen/range-utils0.3.14, 0.3.15
@teselagen/react-list0.8.19, 0.8.20
@teselagen/react-table6.10.19, 6.10.20, 6.10.21
@teselagen/react-table6.10.19
@teselagen/sequence-utils0.3.33
@teselagen/ui0.9.9
@thangved/callback-window1.1.4
@things-factory/attachment-base9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50
@things-factory/auth-base9.0.42, 9.0.43, 9.0.44, 9.0.45
@things-factory/email-base9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50, 9.0.51, 9.0.52, 9.0.53, 9.0.54
@things-factory/env9.042, 9.043, 9.044, 9.045
@things-factory/integration-base9.042, 9.043, 9.044, 9.045
@things-factory/integration-marketplace9.042, 9.043, 9.044, 9.045
@things-factory/shell9.0.42, 9.0.43, 9.0.44, 9.0.45
@tnf-dev/api1.0.8
@tnf-dev/core1.0.8
@tnf-dev/js1.0.8
@tnf-dev/mui1.0.8
@tnf-dev/react1.0.8
@ui-ux-gang/devextreme-angular-rpk24.1.7
@ui-ux-gang/devextreme-rpk24.1.7
@yoobic/design-system6.5.17
@yoobic/jpeg-camera-es61.0.13
@yoobic/yobi8.7.53
ace-colorpicker-rpk0.0.14
airchief0.3.1
airpilot0.8.8
angulartics214.1.1, 14.1.2
browser-webdriver-downloader3.0.8
capacitor-notificationhandler0.0.2, 0.0.3
capacitor-plugin-healthapp0.0.2, 0.0.3
capacitor-plugin-ihealth1.1.8, 1.1.9
capacitor-plugin-vonage1.0.2, 1.0.3
capacitorandroidpermissions0.0.4, 0.0.5
config-cordova0.8.5
cordova-plugin-voxeet21.0.24
cordova-voxeet1.0.32
create-hest-app0.1.9
db-evo1.1.4, 1.1.5
devextreme-angular-rpk21.2.8
devextreme-rpk21.2.8
ember-browser-services5.0.2, 5.0.3
ember-headless-form1.1.2, 1.1.3
ember-headless-form-yup1.0.1
ember-headless-table2.1.5, 2.1.6
ember-url-hash-polyfill1.0.12, 1.0.13
ember-velcro2.2.1, 2.2.2
encounter-playground0.0.2, 0.0.3, 0.0.4, 0.0.5
eslint-config-crowdstrike11.0.2, 11.0.3
eslint-config-crowdstrike-node4.0.3, 4.0.4
eslint-config-teselagen6.1.8, 6.1.7
globalize-rpk1.7.4
graphql-sequelize-teselagen5.3.8, 5.3.9
html-to-base64-image1.0.2
json-rules-engine-simplified0.2.1, 0.2.4, 0.2.3, 0.2.2
jumpgate0.0.2
koa2-swagger-ui5.11.1, 5.11.2
mcfly-semantic-release1.3.1
mcp-knowledge-base0.0.2
mcp-knowledge-graph1.2.1
mobioffice-cli1.0.3
monorepo-next13.0.1, 13.0.2
mstate-angular0.4.4
mstate-cli0.4.7
mstate-dev-react1.1.1
mstate-react1.6.5
ng-imports-checker0.0.9, 0.0.10
ng2-file-upload7.0.2, 7.0.3, 8.0.1, 8.0.2, 8.0.3, 9.0.1
ngx-bootstrap18.1.4, 19.0.3, 19.0.4, 20.0.3, 20.0.4, 20.0.5, 20.0.6
ngx-color10.0.1, 10.0.2
ngx-toastr19.0.1, 19.0.2
ngx-trend8.0.1
ngx-ws1.1.5, 1.1.6
oradm-to-gql35.0.14, 35.0.15
oradm-to-sqlz1.1.2, 1.1.3, 1.1.4, 1.1.5
ove-auto-annotate0.0.10, 0.0.9
pm2-gelf-json1.0.4, 1.0.5
printjs-rpk1.6.1
react-complaint-image0.0.32, 0.0.33, 0.0.34, 0.0.35
react-jsonschema-form-conditionals0.3.18, 0.3.19, 0.3.20, 0.3.21
react-jsonschema-form-extras1.0.1, 1.0.2, 1.0.3, 1.0.4
react-jsonschema-rxnt-extras0.4.6, 0.4.7, 0.4.8, 0.4.9
remark-preset-lint-crowdstrike4.0.1, 4.0.2
rxnt-authentication0.0.3, 0.0.4, 0.0.5, 0.0.6
rxnt-healthchecks-nestjs1.0.2, 1.0.3, 1.0.4, 1.0.5
rxnt-kue1.0.4, 1.0.5, 1.0.6, 1.0.7
swc-plugin-component-annotate1.9.1, 1.9.2
tbssnch1.0.2
teselagen-interval-tree1.1.2
tg-client-query-builder2.14.4, 2.14.5
tg-redbird1.3.2, 1.3.1
tg-seq-gen1.0.9, 1.0.10
thangved-react-grid1.0.3
ts-imports1.0.1, 1.0.2
tvi-cli0.1.5
ve-bamreader0.2.7, 0.2.6
ve-editor1.0.2, 1.0.1
verror-extra6.0.1
voip-callkit1.0.2, 1.0.3
wdio-web-reporter0.1.3
yargs-help-output5.0.3
yoo-styles6.0.326

Rohan Parakh, Director of Product Management, ArmorCode
Director of Product Management, ArmorCode Inc.
Jeremy Benensohn - Senior Brand & Content Manager, ArmorCode
Senior Brand & Content Manager, ArmorCode Inc.