VDB
GCVE-110-OSM-2026-11626
GCVE-110-OSM-2026-11626
Advisory PublishedCVSS 9.6/10
@crysnovax/baileys is a renamed fork of the Baileys WhatsApp Web library. On every successful connection (connection.update with connection === 'open', wired in lib/Socket/socket.js) it silently makes the user's own authenticated WhatsApp account follow two channels controlled by the publisher, 120363402922206865@newsletter and 120363423670814885@newsletter, through the xwa2_newsletter_join_v2 FOLLOW query, with no opt-out and a creds.additionalData.crysnovaxFollowed once-flag. From 2.7.10 the module that performs the follow (lib/Utils/channel-policy.js) is the only file in the package run through javascript-obfuscator (declared as a devDependency with an 'obfuscate' npm script); pkgwarden re-implemented the rotated string-table decoder to recover the channel ids without executing the code. Separately, from 2.7.6, lib/Utils/integrity.js POSTs the package name and version plus a SHA-256 machine fingerprint to https://bailey.crysnovax.link/api/v1/verify on every connect (a publisher-controlled kill switch that fails open), and the update check is repointed to web.crysnovax.link. Earlier versions (1.0.3 through 2.7.5) carry the same forced follow in plaintext with a comment calling it a 'condition of use'; they are not listed here. The listed versions combine the concealed follow with the fingerprint phone-home. Reachability was confirmed by following the socket chain from makeWASocket. No credential or session-key theft was observed. All listed versions were fetched from the npm registry and read by hand on 2026-09-03; the current latest tag (2.8.3) is armed. Related family: MAL-2026-13932 and MAL-2026-15819 (Baileys-fork newsletter auto-follow campaign).
Judge assessment: This package implements a publisher-controlled malware pattern: on install it runs `engine-requirements.js`, and at runtime `lib/Utils/integrity.js` phones home to `https://bailey.crysnovax.link/api/v1/verify` with a SHA-256 machine fingerprint and package identity, matching the attacker model of remote attestation/kill-switch enforcement. The obfuscated `lib/Utils/channel-policy.js` and the deobfuscated IOC recovery (`iocs-recovered`, `recoveredIocCount: 10`) align with concealed behavior rather than a benign library, and the OSV advisory’s forced newsletter follow is corroborated by the hidden IOCs and obfuscation. The presence of persistence-like `.profile` hooks plus `data-exfiltration-encoding` and `dynamic-code-execution` findings further supports adversarial intent in a renamed Baileys fork, not just odd library code. I would treat this as a compromised/abusive supply-chain package from a malicious publisher model that silently enforces publisher actions and contacts publisher infrastructure.
ENTRY
engine-requirements.js (install-hook: node ./engine-requirements.js)
- Install Hook Executes Local JS File in package.json
PERSISTENCE
- Startup Persistence in lib/Socket/chats.js: ".profile"
- Startup Persistence in lib/Socket/chats.js[old]: ".profile"
- Startup Persistence in lib/Socket/messages-send.js: ".profile"
- Startup Persistence in lib/Socket/privacy.js: ".PROFILE"
- Startup Persistence in lib/Store/make-in-memory-store.js: ".profile"
- Startup Persistence in lib/Utils/messages-media.js: ".profile"
- Startup Persistence in lib/Utils/rich-message-utils.js: ".profile"
- Startup Persistence in lib/Utils/rich-message-utils.js[Old]: ".profile"
(+1 more)
DESTINATION
- 5 exfil (custom-c2)
- 2 c2 (urls, domains)
- 2 fetched-payload (deobfuscated)
(values recorded in verified_iocs)
EXFIL
- Data Encoding for Exfiltration in lib/Socket/ban-checker.js: "encodeURIComponent(String(value)).replace(/%25([0-9a-f]{2})/gi, '%$1"
- Data Encoding for Exfiltration in lib/Socket/messages-send.js: "encodeURIComponent(latex).replace(/'/g, '%27"
- Data Encoding for Exfiltration in lib/Socket/socket.js: "Buffer.from(creds.noiseKey.public).toString('base64')"
- Data Encoding for Exfiltration in lib/Utils/chat-utils.js: "Buffer.from(indexMac).toString('base64')"
- Data Encoding for Exfiltration in lib/Utils/chat-utils.js[old]: "Buffer.from(indexMac).toString('base64')"
- Data Encoding for Exfiltration in lib/Utils/generics.js: "Buffer.from(value?.data || value).toString('base64')"
- Data Encoding for Exfiltration in lib/Utils/generics.js@old: "Buffer.from(value?.data || value).toString('base64')"
- Data Encoding for Exfiltration in lib/Utils/messages-media.js: "Buffer.from(media.fileSha256).toString('base64')"
(+7 more)
OBFUSCATION
- Decoded Base64 Content in lib/Utils/integrity.js (x6)
- Decoded Base64 Content in [deobfuscated] lib/Utils/integrity.js (x6)
- IOCs Found in Deobfuscated Code in lib/Utils/decode-wa-message.js
- IOCs Found in Deobfuscated Code in lib/Utils/integrity.js
- Dynamic Base64 Decoding in lib/Socket/interactive-handler.js: "Buffer.from(jpegThumbnail, 'base64')"
- Obfuscation: augmented proxied array function replacements in lib/Utils/channel-policy.js
- Dynamic Base64 Decoding in lib/Utils/chat-utils.js: "Buffer.from(keyId, 'base64')"
- Dynamic Base64 Decoding in lib/Utils/chat-utils.js[old]: "Buffer.from(keyId, 'base64')"
(+14 more)
ADDITIONAL FINDINGS
- Dynamic Code Execution in lib/Utils/message-composer.js: "exec(line)"
PAYLOAD FILES
lib/Utils/integrity.js (+ [deobfuscated] lib/Utils/integrity.js)
Weaknesses (CWE)
CWE-506Embedded Malicious Code
Risk Scores
CVSS 3.1
9.6/10
Critical · CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
Affected Products
| Vendor | Product | Versions | Platforms |
|---|---|---|---|
| unknown | @crysnovax/baileys | 2.8.3 (affected) | — |
Aliases
Browse GCVE Records
3,521 records in the GCVE database · Updated September 6, 2026
No matching records found.
Explore Further
Investigate this vulnerability in the interactive console or download the raw GCVE record.