Supply Chain Attack on @ctrl/tinycolor and 180+ NPM Packages

Supply Chain Attack on @ctrl/tinycolor and 180+ NPM Packages

16 September 2025

10:30 UTC

Last Updated: 17 September 2025 06:06 UTC

A Wakeup Call for the JavaScript Ecosystem

A recent supply chain attack was discovered targeting the NPM package @ctrl/tinycolor, which has over 2 million weekly downloads. In addition to this package, more than 180+ other packages were also compromised. The scale of this attack is huge, and the impact of such attacks are only increasing in the JavaScript ecosystem. Just a week ago we saw the compromise of Chalk and Debug packages, and now, the number has only increased.

Overview of the Attack

The attack was initially identified by LinkedIn user Daniel Pereira, who shared details in a post on 15 September 2025 at 10:30 PM UTC. He reported detecting malware in @ctrl/tinycolor@4.1.1 and advised against installing any additional packages from the maintainer scttcper, on concerns of further compromise.

Later a list of confirmed compromised packages were identified:

S.NoPackage NameVersion(s)
1@ahmedhfarag/ngx-perfect-scrollbar20.0.20
@ahmedhfarag/ngx-perfect-scrollbar
20.0.20
2@ahmedhfarag/ngx-virtual-scroller4.0.4
@ahmedhfarag/ngx-virtual-scroller
4.0.4
3@art-ws/common2.0.28
@art-ws/common
2.0.28
4@art-ws/config-eslint2.0.4, 2.0.5
@art-ws/config-eslint
2.0.4, 2.0.5
5@art-ws/config-ts2.0.7, 2.0.8
@art-ws/config-ts
2.0.7, 2.0.8
6@art-ws/db-context2.0.24
@art-ws/db-context
2.0.24
7@art-ws/di2.0.28, 2.0.32
@art-ws/di
2.0.28, 2.0.32
8@art-ws/di-node2.0.13
@art-ws/di-node
2.0.13
9@art-ws/eslint1.0.5, 1.0.6
@art-ws/eslint
1.0.5, 1.0.6
10@art-ws/fastify-http-server2.0.24, 2.0.27
@art-ws/fastify-http-server
2.0.24, 2.0.27
11@art-ws/http-server2.0.21, 2.0.25
@art-ws/http-server
2.0.21, 2.0.25
12@art-ws/openapi0.1.12, 0.1.9
@art-ws/openapi
0.1.12, 0.1.9
13@art-ws/package-base1.0.5, 1.0.6
@art-ws/package-base
1.0.5, 1.0.6
14@art-ws/prettier1.0.5, 1.0.6
@art-ws/prettier
1.0.5, 1.0.6
15@art-ws/slf2.0.15, 2.0.22
@art-ws/slf
2.0.15, 2.0.22
16@art-ws/ssl-info1.0.10, 1.0.9
@art-ws/ssl-info
1.0.10, 1.0.9
17@art-ws/web-app1.0.3, 1.0.4
@art-ws/web-app
1.0.3, 1.0.4
18@crowdstrike/commitlint8.1.1, 8.1.2
@crowdstrike/commitlint
8.1.1, 8.1.2
19@crowdstrike/falcon-shoelace0.4.1, 0.4.2
@crowdstrike/falcon-shoelace
0.4.1, 0.4.2
20@crowdstrike/foundry-js0.19.1, 0.19.2
@crowdstrike/foundry-js
0.19.1, 0.19.2
21@crowdstrike/glide-core0.34.2, 0.34.3
@crowdstrike/glide-core
0.34.2, 0.34.3
22@crowdstrike/logscale-dashboard1.205.1, 1.205.2
@crowdstrike/logscale-dashboard
1.205.1, 1.205.2
23@crowdstrike/logscale-file-editor1.205.1, 1.205.2
@crowdstrike/logscale-file-editor
1.205.1, 1.205.2
24@crowdstrike/logscale-parser-edit1.205.1, 1.205.2
@crowdstrike/logscale-parser-edit
1.205.1, 1.205.2
25@crowdstrike/logscale-search1.205.1, 1.205.2
@crowdstrike/logscale-search
1.205.1, 1.205.2
26@crowdstrike/tailwind-toucan-base5.0.1, 5.0.2
@crowdstrike/tailwind-toucan-base
5.0.1, 5.0.2
27@ctrl/deluge7.2.1, 7.2.2
@ctrl/deluge
7.2.1, 7.2.2
28@ctrl/golang-template1.4.2, 1.4.3
@ctrl/golang-template
1.4.2, 1.4.3
29@ctrl/magnet-link4.0.3, 4.0.4
@ctrl/magnet-link
4.0.3, 4.0.4
30@ctrl/ngx-codemirror7.0.1, 7.0.2
@ctrl/ngx-codemirror
7.0.1, 7.0.2
31@ctrl/ngx-csv6.0.1, 6.0.2
@ctrl/ngx-csv
6.0.1, 6.0.2
32@ctrl/ngx-emoji-mart9.2.1, 9.2.2
@ctrl/ngx-emoji-mart
9.2.1, 9.2.2
33@ctrl/ngx-rightclick4.0.1, 4.0.2
@ctrl/ngx-rightclick
4.0.1, 4.0.2
34@ctrl/qbittorrent9.7.1, 9.7.2
@ctrl/qbittorrent
9.7.1, 9.7.2
35@ctrl/react-adsense2.0.1, 2.0.2
@ctrl/react-adsense
2.0.1, 2.0.2
36@ctrl/shared-torrent6.3.1, 6.3.2
@ctrl/shared-torrent
6.3.1, 6.3.2
37@ctrl/tinycolor4.1.1, 4.1.2
@ctrl/tinycolor
4.1.1, 4.1.2
38@ctrl/torrent-file4.1.1, 4.1.2
@ctrl/torrent-file
4.1.1, 4.1.2
39@ctrl/transmission7.3.1
@ctrl/transmission
7.3.1
40@ctrl/ts-base324.0.1, 4.0.2
@ctrl/ts-base32
4.0.1, 4.0.2
41@hestjs/core0.2.1
@hestjs/core
0.2.1
42@hestjs/cqrs0.1.6
@hestjs/cqrs
0.1.6
43@hestjs/demo0.1.2
@hestjs/demo
0.1.2
44@hestjs/eslint-config0.1.2
@hestjs/eslint-config
0.1.2
45@hestjs/logger0.1.6
@hestjs/logger
0.1.6
46@hestjs/scalar0.1.7
@hestjs/scalar
0.1.7
47@hestjs/validation0.1.6
@hestjs/validation
0.1.6
48@nativescript-community/arraybuffers1.1.6, 1.1.7, 1.1.8
@nativescript-community/arraybuffers
1.1.6, 1.1.7, 1.1.8
49@nativescript-community/gesturehandler2.0.35
@nativescript-community/gesturehandler
2.0.35
50@nativescript-community/perms3.0.5, 3.0.6, 3.0.7, 3.0.8
@nativescript-community/perms
3.0.5, 3.0.6, 3.0.7, 3.0.8
51@nativescript-community/sentry4.6.43
@nativescript-community/sentry
4.6.43
52@nativescript-community/sqlite3.5.2, 3.5.3, 3.5.4, 3.5.5
@nativescript-community/sqlite
3.5.2, 3.5.3, 3.5.4, 3.5.5
53@nativescript-community/text1.6.10, 1.6.11, 1.6.12, 1.6.13, 1.6.9
@nativescript-community/text
1.6.10, 1.6.11, 1.6.12, 1.6.13, 1.6.9
54@nativescript-community/typeorm0.2.30, 0.2.31, 0.2.32, 0.2.33
@nativescript-community/typeorm
0.2.30, 0.2.31, 0.2.32, 0.2.33
55@nativescript-community/ui-collectionview6.0.6
@nativescript-community/ui-collectionview
6.0.6
56@nativescript-community/ui-document-picker1.1.27, 1.1.28
@nativescript-community/ui-document-picker
1.1.27, 1.1.28
57@nativescript-community/ui-drawer0.1.30
@nativescript-community/ui-drawer
0.1.30
58@nativescript-community/ui-image4.5.6
@nativescript-community/ui-image
4.5.6
59@nativescript-community/ui-label1.3.35, 1.3.36, 1.3.37
@nativescript-community/ui-label
1.3.35, 1.3.36, 1.3.37
60@nativescript-community/ui-material-bottom-navigation7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-material-bottom-navigation
7.2.72, 7.2.73, 7.2.74, 7.2.75
61@nativescript-community/ui-material-bottomsheet7.2.72
@nativescript-community/ui-material-bottomsheet
7.2.72
62@nativescript-community/ui-material-core7.2.72, 7.2.73, 7.2.74, 7.2.75, 7.2.76
@nativescript-community/ui-material-core
7.2.72, 7.2.73, 7.2.74, 7.2.75, 7.2.76
63@nativescript-community/ui-material-core-tabs7.2.72, 7.2.73, 7.2.74, 7.2.75, 7.2.76
@nativescript-community/ui-material-core-tabs
7.2.72, 7.2.73, 7.2.74, 7.2.75, 7.2.76
64@nativescript-community/ui-material-ripple7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-material-ripple
7.2.72, 7.2.73, 7.2.74, 7.2.75
65@nativescript-community/ui-material-tabs7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-material-tabs
7.2.72, 7.2.73, 7.2.74, 7.2.75
66@nativescript-community/ui-pager14.1.36, 14.1.37, 14.1.38
@nativescript-community/ui-pager
14.1.36, 14.1.37, 14.1.38
67@nativescript-community/ui-pulltorefresh2.5.4, 2.5.5, 2.5.6, 2.5.7
@nativescript-community/ui-pulltorefresh
2.5.4, 2.5.5, 2.5.6, 2.5.7
68@nexe/config-manager0.1.1
@nexe/config-manager
0.1.1
69@nexe/eslint-config0.1.1
@nexe/eslint-config
0.1.1
70@nexe/logger0.1.3
@nexe/logger
0.1.3
71@nstudio/angular20.0.4, 20.0.5, 20.0.6
@nstudio/angular
20.0.4, 20.0.5, 20.0.6
72@nstudio/focus20.0.4, 20.0.5, 20.0.6
@nstudio/focus
20.0.4, 20.0.5, 20.0.6
73@nstudio/nativescript-checkbox2.0.6, 2.0.7, 2.0.8, 2.0.9
@nstudio/nativescript-checkbox
2.0.6, 2.0.7, 2.0.8, 2.0.9
74@nstudio/nativescript-loading-indicator5.0.1, 5.0.2, 5.0.3, 5.0.4
@nstudio/nativescript-loading-indicator
5.0.1, 5.0.2, 5.0.3, 5.0.4
75@nstudio/ui-collectionview5.1.11, 5.1.12, 5.1.13, 5.1.14
@nstudio/ui-collectionview
5.1.11, 5.1.12, 5.1.13, 5.1.14
76@nstudio/web20.0.4
@nstudio/web
20.0.4
77@nstudio/web-angular20.0.4
@nstudio/web-angular
20.0.4
78@nstudio/xplat20.0.5, 20.0.6, 20.0.7
@nstudio/xplat
20.0.5, 20.0.6, 20.0.7
79@nstudio/xplat-utils20.0.5, 2.0.6, 20.0.7
@nstudio/xplat-utils
20.0.5, 2.0.6, 20.0.7
80@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/board
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
81@operato/data-grist9.0.29, 9.0.35, 9.0.36, 9.0.37
@operato/data-grist
9.0.29, 9.0.35, 9.0.36, 9.0.37
82@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/graphql
9.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
83@operato/headroom9.0.2, 9.0.35, 9.0.36, 9.0.37
@operato/headroom
9.0.2, 9.0.35, 9.0.36, 9.0.37
84@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/help
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
85@operato/i18n9.0.35, 9.0.36, 9.0.37
@operato/i18n
9.0.35, 9.0.36, 9.0.37
86@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/input
9.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
87@operato/layout9.0.35, 9.0.36, 9.0.37
@operato/layout
9.0.35, 9.0.36, 9.0.37
88@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.49
@operato/popup
9.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.49
89@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/pull-to-refresh
9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42
90@operato/shell9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39
@operato/shell
9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39
91@operato/styles9.0.2, 9.0.35, 9.0.36, 9.0.37
@operato/styles
9.0.2, 9.0.35, 9.0.36, 9.0.37
92@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.49
@operato/utils
9.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.49
93@teselagen/bio-parsers0.4.30
@teselagen/bio-parsers
0.4.30
94@teselagen/bounce-loader0.3.16, 0.3.17
@teselagen/bounce-loader
0.3.16, 0.3.17
95@teselagen/file-utils0.3.22
@teselagen/file-utils
0.3.22
96@teselagen/liquibase-tools0.4.1
@teselagen/liquibase-tools
0.4.1
97@teselagen/ove0.7.40
@teselagen/ove
0.7.40
98@teselagen/range-utils0.3.14, 0.3.15
@teselagen/range-utils
0.3.14, 0.3.15
99@teselagen/react-list0.8.19, 0.8.20
@teselagen/react-list
0.8.19, 0.8.20
100@teselagen/react-table6.10.19, 6.10.20, 6.10.22
@teselagen/react-table
6.10.19, 6.10.20, 6.10.22
101@teselagen/sequence-utils0.3.34
@teselagen/sequence-utils
0.3.34
102@teselagen/ui0.9.10
@teselagen/ui
0.9.10
103@thangved/callback-window1.1.4
@thangved/callback-window
1.1.4
104@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/attachment-base
9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50
105@things-factory/auth-base9.0.43, 9.0.44, 9.0.45
@things-factory/auth-base
9.0.43, 9.0.44, 9.0.45
106@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/email-base
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, 9.0.52, 9.0.53, 9.0.54
107@things-factory/env9.0.42, 9.0.43, 9.0.44, 9.0.45
@things-factory/env
9.0.42, 9.0.43, 9.0.44, 9.0.45
108@things-factory/integration-base9.0.43, 9.0.44, 9.0.45
@things-factory/integration-base
9.0.43, 9.0.44, 9.0.45
109@things-factory/integration-marketplace9.0.43, 9.0.44, 9.0.45
@things-factory/integration-marketplace
9.0.43, 9.0.44, 9.0.45
110@things-factory/shell9.0.43, 9.0.44, 9.0.45
@things-factory/shell
9.0.43, 9.0.44, 9.0.45
111@tnf-dev/api1.0.8
@tnf-dev/api
1.0.8
112@tnf-dev/core1.0.8
@tnf-dev/core
1.0.8
113@tnf-dev/js1.0.8
@tnf-dev/js
1.0.8
114@tnf-dev/mui1.0.8
@tnf-dev/mui
1.0.8
115@tnf-dev/react1.0.8
@tnf-dev/react
1.0.8
116@ui-ux-gang/devextreme-angular-rpk24.1.7
@ui-ux-gang/devextreme-angular-rpk
24.1.7
117@yoobic/design-system6.5.17
@yoobic/design-system
6.5.17
118@yoobic/jpeg-camera-es61.0.13
@yoobic/jpeg-camera-es6
1.0.13
119@yoobic/yobi8.7.53
@yoobic/yobi
8.7.53
120airchief0.3.1
airchief
0.3.1
121airpilot0.8.8
airpilot
0.8.8
122angulartics214.1.1, 14.1.2
angulartics2
14.1.1, 14.1.2
123browser-webdriver-downloader3.0.8
browser-webdriver-downloader
3.0.8
124capacitor-notificationhandler0.0.2, 0.0.3
capacitor-notificationhandler
0.0.2, 0.0.3
125capacitor-plugin-healthapp0.0.2, 0.0.3
capacitor-plugin-healthapp
0.0.2, 0.0.3
126capacitor-plugin-ihealth1.1.8, 1.1.9
capacitor-plugin-ihealth
1.1.8, 1.1.9
127capacitor-plugin-vonage1.0.2, 1.0.3
capacitor-plugin-vonage
1.0.2, 1.0.3
128capacitorandroidpermissions0.0.4, 0.0.5
capacitorandroidpermissions
0.0.4, 0.0.5
129config-cordova0.8.5
config-cordova
0.8.5
130cordova-plugin-voxeet21.0.24
cordova-plugin-voxeet2
1.0.24
131cordova-voxeet1.0.32
cordova-voxeet
1.0.32
132create-hest-app0.1.9
create-hest-app
0.1.9
133db-evo1.1.4, 1.1.5
db-evo
1.1.4, 1.1.5
134devextreme-angular-rpk21.2.8
devextreme-angular-rpk
21.2.8
135ember-browser-services5.0.2, 5.0.3
ember-browser-services
5.0.2, 5.0.3
136ember-headless-form1.1.2, 1.1.3
ember-headless-form
1.1.2, 1.1.3
137ember-headless-form-yup1.0.1
ember-headless-form-yup
1.0.1
138ember-headless-table2.1.5, 2.1.6
ember-headless-table
2.1.5, 2.1.6
139ember-url-hash-polyfill1.0.12, 1.0.13
ember-url-hash-polyfill
1.0.12, 1.0.13
140ember-velcro2.2.1, 2.2.2
ember-velcro
2.2.1, 2.2.2
141encounter-playground0.0.2, 0.0.3, 0.0.4, 0.0.5
encounter-playground
0.0.2, 0.0.3, 0.0.4, 0.0.5
142eslint-config-crowdstrike11.0.2, 11.0.3
eslint-config-crowdstrike
11.0.2, 11.0.3
143eslint-config-crowdstrike-node4.0.3, 4.0.4
eslint-config-crowdstrike-node
4.0.3, 4.0.4
144eslint-config-teselagen6.1.7, 6.1.8
eslint-config-teselagen
6.1.7, 6.1.8
145globalize-rpk1.7.4
globalize-rpk
1.7.4
146graphql-sequelize-teselagen5.3.8, 5.3.9
graphql-sequelize-teselagen
5.3.8, 5.3.9
147html-to-base64-image1.0.2
html-to-base64-image
1.0.2
148json-rules-engine-simplified0.2.1, 0.2.4
json-rules-engine-simplified
0.2.1, 0.2.4
149jumpgate0.0.2
jumpgate
0.0.2
150koa2-swagger-ui5.11.1, 5.11.2
koa2-swagger-ui
5.11.1, 5.11.2
151mcfly-semantic-release1.3.1
mcfly-semantic-release
1.3.1
152mcp-knowledge-base0.0.2
mcp-knowledge-base
0.0.2
153mcp-knowledge-graph1.2.1
mcp-knowledge-graph
1.2.1
154mobioffice-cli1.0.3
mobioffice-cli
1.0.3
155monorepo-next13.0.1, 13.0.2
monorepo-next
13.0.1, 13.0.2
156mstate-angular0.4.4
mstate-angular
0.4.4
157mstate-cli0.4.7
mstate-cli
0.4.7
158mstate-dev-react1.1.1
mstate-dev-react
1.1.1
159mstate-react1.6.5
mstate-react
1.6.5
160ng2-file-upload7.0.2, 7.0.3, 8.0.1, 8.0.2, 8.0.3, 9.0.1
ng2-file-upload
7.0.2, 7.0.3, 8.0.1, 8.0.2, 8.0.3, 9.0.1
161ngx-bootstrap18.1.4, 19.0.3, 19.0.4, 20.0.3, 20.0.4, 20.0.5
ngx-bootstrap
18.1.4, 19.0.3, 19.0.4, 20.0.3, 20.0.4, 20.0.5
162ngx-color10.0.1, 10.0.2
ngx-color
10.0.1, 10.0.2
163ngx-toastr19.0.1, 19.0.2
ngx-toastr
19.0.1, 19.0.2
164ngx-trend8.0.1
ngx-trend
8.0.1
165ngx-ws1.1.5, 1.1.6
ngx-ws
1.1.5, 1.1.6
166oradm-to-gql35.0.14, 35.0.15
oradm-to-gql
35.0.14, 35.0.15
167oradm-to-sqlz1.1.2
oradm-to-sqlz
1.1.2
168ove-auto-annotate0.0.10, 0.0.9
ove-auto-annotate
0.0.10, 0.0.9
169pm2-gelf-json1.0.4, 1.0.5
pm2-gelf-json
1.0.4, 1.0.5
170printjs-rpk1.6.1
printjs-rpk
1.6.1
171react-complaint-image0.0.32, 0.0.35
react-complaint-image
0.0.32, 0.0.35
172react-jsonschema-form-conditionals0.3.18, 0.3.21
react-jsonschema-form-conditionals
0.3.18, 0.3.21
173react-jsonschema-form-extras1.0.4
react-jsonschema-form-extras
1.0.4
174react-jsonschema-rxnt-extras0.4.9
react-jsonschema-rxnt-extras
0.4.9
175remark-preset-lint-crowdstrike4.0.1, 4.0.2
remark-preset-lint-crowdstrike
4.0.1, 4.0.2
176rxnt-authentication0.0.3, 0.0.4, 0.0.5, 0.0.6
rxnt-authentication
0.0.3, 0.0.4, 0.0.5, 0.0.6
177rxnt-healthchecks-nestjs1.0.2, 1.0.3, 1.0.4, 1.0.5
rxnt-healthchecks-nestjs
1.0.2, 1.0.3, 1.0.4, 1.0.5
178rxnt-kue1.0.4, 1.0.5, 1.0.6, 1.0.7
rxnt-kue
1.0.4, 1.0.5, 1.0.6, 1.0.7
179swc-plugin-component-annotate1.9.1, 1.9.2
swc-plugin-component-annotate
1.9.1, 1.9.2
180tbssnch1.0.2
tbssnch
1.0.2
181teselagen-interval-tree1.1.2
teselagen-interval-tree
1.1.2
182tg-client-query-builder2.14.4, 2.14.5
tg-client-query-builder
2.14.4, 2.14.5
183tg-redbird1.3.1, 1.3.2
tg-redbird
1.3.1, 1.3.2
184tg-seq-gen1.0.10, 1.0.9
tg-seq-gen
1.0.10, 1.0.9
185thangved-react-grid1.0.3
thangved-react-grid
1.0.3
186ts-gaussian3.0.5, 3.0.6
ts-gaussian
3.0.5, 3.0.6
187ts-imports1.0.1, 1.0.2
ts-imports
1.0.1, 1.0.2
188tvi-cli0.1.5
tvi-cli
0.1.5
189ve-bamreader0.2.6, 0.2.7
ve-bamreader
0.2.6, 0.2.7
190ve-editor1.0.1, 1.0.2
ve-editor
1.0.1, 1.0.2
191verror-extra6.0.1
verror-extra
6.0.1
192voip-callkit1.0.2, 1.0.3
voip-callkit
1.0.2, 1.0.3
193wdio-web-reporter0.1.3
wdio-web-reporter
0.1.3
194yargs-help-output5.0.3
yargs-help-output
5.0.3
195yoo-styles6.0.326
yoo-styles
6.0.326

This attack stands out from other recent supply chain attacks we have seen due to the sophisticated infection flow.

After a victim installs the affected version of a trojanized package, a post install script automatically infects and modifies other packages maintained by the same victim and publishes them, This results in an automated, self-propagating infection across multiple packages maintained by the same developer.

How the Attack Worked

When a victim installs any of the above infected packages, a post-install script triggers and calls the function “NpmModule.updatePackage”, the script then is tasked with compromising further packages by the same maintainer, by the help of the above function, it modifies package.json, then creates a file called bundle.js and republishes the package. In this way, the entire ecosystem can be affected with no human efforts.

After the victim is done installing an affected version, the post install script runs bundle.js from the command “node bundle.js”. This specific script tries to download TruffleHog based on the victim’s OS(Linux/Windows), a secret searching tool to find exposed sensitive credentials across the machine. Upon running the TruffleHog tool, a list of secrets such as GITHUB_TOKEN, NPM_TOKEN, AWS_ACCESS_KEY_ID, and AWS_SECRET_ACCESS_KEY are exfiltrated, a notable point is that, the found NPM, GitHub tokens are validated by using NPM’s whoami endpoint and GitHub’s API, so that only authenticated working tokens are sent.

The exfiltrated credentials are then posted to a webhook site: “webhook[.]site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7”

Webhook.site is a free service that is used to instantly receive, inspect, and debug HTTP requests without setting up a server.

To increase attack’s persistence, the script then searches for the availability of GitHub PAT, if a GitHub Personal Access Token is found, a .github/workflows/shai-hulud-workflow.yml file is created to automate the CI/CD pipeline’s compromise, if this workflow is triggered, it wraps all the runner’s environment secret findings to a findings.json and then encodes it in base64, and sends it to webhook[.]site.

Impact

A supply chain attack at this scale with such complexity leads to rapid infection on a wide range of developer machines, the major impact is Credential Harvesting. The attack is able to exfiltrate:

  1. NPM authentication tokens
  2. GitHub personal access tokens
  3. AWS access keys (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
  4. Google Cloud Platform service credentials
  5. Azure credentials
  6. Cloud metadata endpoints

… and more secrets found by TruffleHog.

When a victim installs an infected package, it can not only exfiltrate all possible secrets from the machine but also act as a zombie to further infect more packages which the victim maintains on NPM Registry. This poses a serious risk for NPM Package maintainers.

Find out if you are Affected
  1. Check for usage of affected packages in package.json, package-lock.json.
  2. If you have identified an infected version, immediately downgrade or upgrade to safe versions.
  3. Rotate secrets immediately if compromised.
  4. Audit GitHub repositories for injected workflow files.
  5. Monitor NPM account and CI logs for suspicious activity.
Indicators of Compromise (IoC)
  1. bundle.js
    SHA-256: 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09
  2. GitHub workflow file: .github/workflows/shai-hulud-workflow.yml
Note on NPM installs

If your project uses a package-lock.json and you run npm ci, it will install exact versions pinned in the lockfile even if newer malicious versions are published. Always commit your lockfiles and use npm ci in CI/CD to reduce risk.

Best Practices to Mitigate Supply Chain Risks
  1. Pin and lock versions in package.json + package-lock.json and always run npm ci in CI/CD.
  2. Rotate secrets frequently and avoid storing sensitive tokens on developer machines.
  3. Review post-install scripts or suspicious changes in dependencies before upgrading.
Conclusion

For developers and organizations, it is important to adopt stronger supply chain security practices: pin and lock package versions, run npm ci in CI/CD, audit post-install scripts, rotate secrets frequently, and continuously monitor credentials and workflows for suspicious activity. As the ecosystem scales, proactive dependency security is a must.