Anthropic design choice exposed 150M+ downloads, and 200K servers to complete takeover

180+ NPM Packages Hit in Major Supply Chain Attack

image (105)

Sandworms in the Supply Chain: The “Shai‑Hulud” npm Credential Theft

Overview

Attackers slipped malicious code into new releases of a popular open-source color library @ctrl/tinycolor versions 4.1.1 and 4.1.2. The same campaign also trojanized 40+ packages across multiple maintainers.

How it spread

Installing a compromised package ran code that stole developer/build credentials. With those credentials, attackers could publish malicious updates to other packages owned by the same maintainer, widening the attack surface.

Who is affected

Developers and organizations that installed the tainted versions during the brief time window before takedown. Regular end-users are indirectly at risk if the apps they use were built during that period of time with the compromised packages.

Impact

Potential exposure of keys and tokens used to publish software or access cloud services and the chance of more malicious updates being pushed using those stolen credentials.

What you should do

As a minimum containment measures you should:

  • Remove/downgrade affected versions and rebuild from a clean cache/artifact source.
  • Rotate/revoke and replace credentials used on any affected machine or CI runner (npm tokens, GitHub PATs/Actions secrets, cloud keys).
  • Audit logs for signs of suspicious installs, unauthorized publishes or automated workflow files.
  • Check GitHub for a new repo named “Shai-Hulud”. This campaign creates a public repo under victims’ accounts to dump stolen data. If found, remove it, review its contents/history to better understand the scope of the leak.

However, overall the affected machines should be considered fully compromised. Therefore, full reinstall\reimaging is preferred.

Technical Analysis

The OX Security team found 34 compromised GitHub accounts which contain the “Shai-Hulud” repository, inside it a “data.json” containing an encoded JSON with all of the compromised information the attacker uploaded to the victim’s GitHub account.

The attack 

image4
image2

After decoding the information using a double decode base64 function, we can see all of the compromised data of the user’s account, including github token, AWS and GCP secrets.

image3
image1

PackageVersions
@ahmedhfarag/ngx-perfect-scrollbar20.0.20
@ahmedhfarag/ngx-virtual-scroller4.0.4
@art-ws/common2.0.28
@art-ws/config-eslint2.0.4, 2.0.5
@art-ws/config-ts2.0.7, 2.0.8
@art-ws/db-context2.0.24
@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
@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-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/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-bottomsheet7.2.72
@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.5, 20.0.6, 20.0.7, 20.0.4
@nstudio/xplat-utils20.0.5, 20.0.6, 20.0.7, 20.0.4
@operato/board9.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/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
@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
@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
@operato/pull-to-refresh9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42
@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
@teselagen/bounce-loader0.3.16, 0.3.17
@teselagen/liquibase-tools0.4.1
@teselagen/range-utils0.3.14, 0.3.15
@teselagen/react-list0.8.19, 0.8.20
@teselagen/react-table6.10.19, 6.10.21
@thangved/callback-window1.1.4
@things-factory/attachment-base9.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.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.0.42, 9.0.43, 9.0.44, 9.0.45
@things-factory/integration-base9.0.43, 9.0.44, 9.0.45
@things-factory/integration-marketplace9.0.43, 9.0.44, 9.0.45
@things-factory/shell9.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
@yoobic/design-system6.5.17
@yoobic/jpeg-camera-es61.0.13
@yoobic/yobi8.7.53
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
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.7
globalize-rpk1.7.4
graphql-sequelize-teselagen5.3.8
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
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
ove-auto-annotate0.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
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.1
tg-seq-gen1.0.9, 1.0.10
thangved-react-grid1.0.3
ts-gaussian3.0.5, 3.0.6
ts-imports1.0.1, 1.0.2
tvi-cli0.1.5
ve-bamreader0.2.6
ve-editor1.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

OX Security in Action

OX Security helps you see what’s in your software (SBOMs), spot malicious and vulnerable packages (SCA), and stop risky changes (CI/CD policy enforcement), so identity hardening and pipeline policy become everyday defaults, not emergency responses.

Conclusion

This month showed that software supply-chain risk is no longer about CVEs in the code, but about compromised identities and trusted automation. The recent wallet-drainer case proved how quickly a single phished maintainer can poison billions of weekly downloads.The @ctrl/tinycolor campaign showed malware using your own CI tokens to self-propagate across maintainers. The lesson is stark: every dependency is executable code with production privileges the moment it hits your pipeline.

Teams should start enforcing hardware-based 2FA, short-lived tokens, off-by-default install scripts in CI, cool-down period before adoption and organization-wide review of new package versions. Pairing these practices with SBOM-driven inventory with automated blocklists provides even better protection.

Resilience now comes from identity hardening and pipeline policies, not hope that upstream stays clean.

Tags:

post banner image

Run Every Security Test Your Code Needs

Pinpoint, investigate and eliminate code-level issues across the entire SDLC.

GET A PERSONALIZED DEMO
Frame 2085668530

Subscribe to Our Newsletter

Stay updated with the latest SaaS insights, tips, and news delivered straight to your inbox.

Security Starts at the Source