{"id":"MAL-2026-17408","revision":null,"records":[{"revision":"aaa8bb4c63974f3d8b85d5f97d30cb31","observedAt":"2026-10-29T15:12:22.973+00:00","statement":{"source":"osv","id":"MAL-2026-17408","aliases":[],"title":"Malicious code in whalibmob (npm)","description":"This package is part of a large family (100+ identified as of September 2026) of near-identical\nforks of the Baileys WhatsApp Web library that inject a covert channel-subscription action into\nthe WhatsApp socket layer. On connect, the injected code issues an authenticated `w:mex` FOLLOW\nquery (query_id 7871414976211147) against one or more attacker-chosen WhatsApp Channel/Newsletter\nJIDs, using the installer's own authenticated WhatsApp session -- silently subscribing the\nvictim's account to channels it never asked to join.\n\nThe target JID(s) are hidden from casual source review via one of several obfuscation techniques\nobserved across the family: a plain string literal, base64 encoding, base64+XOR, or a char-code\narray reconstructed at runtime. Some variants instead fetch a mutable, attacker-controlled remote\nJSON/JS list of target JIDs from GitHub or another host at runtime, letting the target list change\nafter installation without a new npm publish. Every sample in the family shares the same underlying\nmechanism (a wrapped/patched socket-connect routine that fires the FOLLOW query some seconds after\nconnect), even though the package name, JID value(s), and obfuscation/delivery method differ per\nfork.\n\nThe malicious action abuses the installer's own authenticated WhatsApp session to gain reach and\nsubscribers for attacker-controlled channels; it does not exfiltrate credentials, establish\npersistence, or execute arbitrary remote code.\n\nAffected package: whalibmob (npm), version(s): 5.33.5, 5.33.4, 5.33.3, 5.33.2, 5.32.2, 5.32.1, 5.32.0, 5.30.0, 5.29.6, 5.29.5, 5.29.4, 5.29.3, 5.29.2, 5.29.1, 5.29.0, 5.28.0, 5.25.0, 5.24.2, 5.24.1, 5.24.0.\n\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (091dbfc5e015710d33beb4bb706ba3bf44808312ba9f4e68b6bb389225d14911)\nPattern-based rules matched keyword co-occurrences in several files of this package: lib/MediaService.js imports fs/http/https and performs fs.readFileSync and https.request calls; lib/Registration.js contains the token 'ping' at multiple lines; lib/WebVersion.js references 'curl' and uses https.get alongside 'ps' tokens; and lib/socks.js references 'curl', 'POST', and 'hostname'. None of these matches, on their own, demonstrates reading installer-side secrets (such as ~/.aws, ~/.ssh, ~/.npmrc, environment credential variables, browser profile stores, or wallet files) and sending them to an attacker-controlled destination, nor install-time code execution of fetched content, nor a backdoor channel. No lifecycle script (preinstall/install/postinstall/prepare) is cited as invoking the flagged code paths at install time. No hardcoded attacker C2 endpoint, no known-bad-infrastructure host, no obfuscated destination, and no credential-grade file read is identified in the available evidence. The package name's similarity to common library naming conventions and the presence of generic network/filesystem primitives are not themselves attack indicators.\n","state":2,"publishedAt":"2026-10-29T13:33:50+00:00","modifiedAt":"2026-10-29T14:30:35.2154324+00:00","affected":[{"ecosystem":"npm","name":"whalibmob","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"}]}],"versions":["5.33.5","5.33.4","5.33.3","5.33.2","5.32.2","5.32.1","5.32.0","5.30.0","5.29.6","5.29.5","5.29.4","5.29.3","5.29.2","5.29.1","5.29.0","5.28.0","5.25.0","5.24.2","5.24.1","5.24.0","5.33.18","5.33.30","5.33.28","5.33.23","5.33.19","5.33.20","5.33.29","5.33.26","5.33.22","5.33.21"],"rawVersionEvidence":null}],"metrics":[],"references":["https://www.ox.security/blog/phantomsub-malicious-npm-campaign-secretly-adds-users-to-whatsapp-spam-channels/","https://www.npmjs.com/package/whalibmob/v/5.33.18","https://www.npmjs.com/package/whalibmob/v/5.33.30","https://www.npmjs.com/package/whalibmob/v/5.33.28","https://www.npmjs.com/package/whalibmob/v/5.33.23","https://www.npmjs.com/package/whalibmob/v/5.33.19","https://www.npmjs.com/package/whalibmob/v/5.33.20","https://www.npmjs.com/package/whalibmob/v/5.33.29","https://www.npmjs.com/package/whalibmob/v/5.33.26","https://www.npmjs.com/package/whalibmob/v/5.33.22","https://www.npmjs.com/package/whalibmob/v/5.33.21"],"sourceUrl":"https://osv.dev/vulnerability/MAL-2026-17408","license":"OSV · upstream source license applies","key":"osv:MAL-2026-17408","identifiers":["MAL-2026-17408"]},"retained":false,"historicalAffected":[]}],"coverage":[{"source":"cisa-kev:global","scope":"Complete CISA KEV catalog; all vendors. Missing entries do not establish absence of exploitation.","generation":"2026-11-07T07:27:10.0308911+00:00","complete":true,"records":1769,"lastAttemptAt":"2026-11-07T07:27:10.0308911+00:00","lastSuccessAt":"2026-11-07T07:27:10.1806401+00:00","error":null,"lastVerifiedAt":"2026-11-07T07:27:10.180641+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"cve-program","scope":"Official CVE Program baseline and cumulative hourly delta; all vendors, published and rejected records","generation":"cve-bb5c9d5a08063ef076042e33dd72a7d0ffa4c4487efdcf3106e29ba55ec2ad57-e2c080f02357fa2a3d144a661c51c212b571c4d7ae811251058237d8f5735e04","complete":true,"records":420765,"lastAttemptAt":"2026-11-07T07:27:09.5001885+00:00","lastSuccessAt":"2026-11-07T07:27:09.4258602+00:00","error":null,"lastVerifiedAt":"2026-11-07T07:27:09.5001885+00:00","snapshotPublishedAt":"2026-11-07T07:18:10+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"euvd","scope":"Rolling EUVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global EUVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-27c3440f97484dda858dd714de0d758d","complete":true,"records":13630,"lastAttemptAt":"2026-11-07T07:38:48.4100635+00:00","lastSuccessAt":"2026-11-07T07:38:48.406+00:00","error":null,"lastVerifiedAt":"2026-11-07T07:38:48.406+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13685,"expectedIdentifiers":13685,"failedIdentifiers":0},{"source":"first-epss:nuget","scope":"FIRST EPSS for explicit CVE aliases in the collected public NuGet archive. Not a global EPSS backfill.","generation":"2026-11-07T07:27:10.0308911+00:00","complete":true,"records":1096,"lastAttemptAt":"2026-11-07T07:27:10.0308911+00:00","lastSuccessAt":"2026-11-07T07:27:10.181531+00:00","error":null,"lastVerifiedAt":"2026-11-07T07:27:10.1815313+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"nvd","scope":"Rolling NVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global NVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-1262a9fa83024e28a1560dfc0c9cdf3c","complete":true,"records":13645,"lastAttemptAt":"2026-11-07T07:27:10.8526655+00:00","lastSuccessAt":"2026-11-07T06:27:08.533+00:00","error":null,"lastVerifiedAt":"2026-11-07T06:27:08.533+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13685,"expectedIdentifiers":13685,"failedIdentifiers":0},{"source":"osv:Go","scope":"Complete OSV Go ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"go-0eb4d6dde62dffacd040ad992d4fd5a65cd7d0dc5f5f4cfa8b41967fc6f9ca5f","complete":true,"records":9914,"lastAttemptAt":"2026-11-07T07:27:09.8729489+00:00","lastSuccessAt":"2026-11-06T20:10:36.6450506+00:00","error":null,"lastVerifiedAt":"2026-11-07T07:27:09.8729489+00:00","snapshotPublishedAt":"2026-11-06T20:02:57+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:NuGet","scope":"Complete OSV NuGet ecosystem archive, including GitHub Advisory Database records; NuGet version matching only","generation":"nuget-fde804134ecdda0ddd5ff5c26ee1fff5a6fa659311f7ef2e51c6ad54964db0e2","complete":true,"records":1971,"lastAttemptAt":"2026-11-07T07:27:09.6560768+00:00","lastSuccessAt":"2026-11-06T19:03:17.0399903+00:00","error":null,"lastVerifiedAt":"2026-11-07T07:27:09.6560768+00:00","snapshotPublishedAt":"2026-11-06T18:17:57+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:crates.io","scope":"Complete OSV crates.io ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"crates.io-335633e78a15c9cde10a6025895b5617717087fb945489ae7e15d377bacf34a9","complete":true,"records":3055,"lastAttemptAt":"2026-11-07T07:27:09.9878127+00:00","lastSuccessAt":"2026-11-06T16:03:00.7615789+00:00","error":null,"lastVerifiedAt":"2026-11-07T07:27:09.9878127+00:00","snapshotPublishedAt":"2026-11-06T16:02:48+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:npm","scope":"Complete OSV npm ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"npm-a0b728bc1c5526b5429930c00621636eba8655069c176697c3080f8377619ad7","complete":true,"records":231291,"lastAttemptAt":"2026-11-07T07:27:09.7648455+00:00","lastSuccessAt":"2026-11-07T00:28:51.1983528+00:00","error":null,"lastVerifiedAt":"2026-11-07T07:27:09.7648455+00:00","snapshotPublishedAt":"2026-11-06T23:33:08+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}