Flooding Dropper — ~850 npm packages deliver a cross-platform RAT/infostealer via require()-time execution, targets Russian fintech developers
TL;DR
Sonatype tracked (as sonatype-2026-005660) a campaign it calls "Flooding Dropper" — roughly 846 malicious npm packages, published across many disposable throwaway accounts (a handful of packages per account, to slow takedown), using AI-generated typosquat-style names built around fintech/"buy-now-pay-later" terms (bigops, bnpl) that appear to target Russian financial-services developers. Unlike most campaigns this repo tracks, the payload doesn't run at install time via a lifecycle hook or binding.gyp — the package's README instructs the developer to load it via require(), and that require() call itself triggers a downloader (WEL1DROPPER) that fetches a platform-specific binary RAT/infostealer for Windows, Linux, or macOS. Discovered and published 2026-08-05; may be an evolution of the April 2026 "Moika" dependency-confusion campaign.
What happened
Rather than a single publisher account or a coordinated few-minute burst, Flooding Dropper's operators automated npm account and package creation at scale: 846 packages distributed thinly across many accounts, combining terms like bigops and bnpl (buy-now-pay-later, a fintech term) with other words — e.g. bigops-api, dolyame-boxy-desktop-bnpl-card-gallery — many sharing version numbers in the 35.x.y range. This pattern, and the fintech-adjacent naming, points toward developers integrating with Russian payment/BNPL platforms as the intended targets, and researchers note it may be a continuation or evolution of the April 2026 "Moika" dependency-confusion campaign.
Delivery mechanism — require()-time execution, not install-time. Most supply-chain campaigns this repo tracks fire at npm install time via a preinstall/postinstall lifecycle hook or a binding.gyp native-build step (both of which some mitigations, like --ignore-scripts, can block or reduce). Flooding Dropper instead ships a README that instructs the developer to load the package via require() in their own code — and it's that require() call, at normal runtime, that triggers WEL1DROPPER, a downloader that:
1. Identifies the host OS and processor architecture.
2. Fetches a platform-specific binary payload from one of three Cloudflare Workers hosts: oob-worker.cf103-070.workers.dev, oob-worker.cf102-baf.workers.dev, oob-worker.cf99-9b3.workers.dev.
3. If the HTTPS download fails, falls back to DNS TXT record exfiltration/staging from wel1[.]ru, using platform-specific subdomains (sdk.dl, ext.dl, pkg.dl, net.dl).
4. Executes the fetched payload as a detached background process.
The Windows binary includes anti-analysis evasion (Event Tracing for Windows patching, VM/debugger detection) and persistence via Registry Run keys and scheduled tasks — a materially more sophisticated payload than the typical single-stage JavaScript credential grabber this repo tracks in npm typosquat campaigns.
Update, 2026-08-11: The Hacker News' updated coverage puts the confirmed package count at 1,033 (up from the initial ~846), with campaign velocity reportedly slowing. Named targets now include Russian payment/BNPL platforms tcsbank[.]ru and cloudpayments[.]ru, consistent with the original fintech-targeting assessment.
Am I affected?
# Search your lockfiles for the naming pattern this campaign uses
grep -riE '"(bigops|bnpl|dolyame)[-a-z0-9]*":' package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null
# Check for outbound DNS activity to the campaign's exfil/staging domain
# (run against your DNS logs, not locally)
# wel1[.]ru and its subdomains: sdk.dl, ext.dl, pkg.dl, net.dl
# Look for the Cloudflare Workers staging hosts in outbound HTTP logs
# oob-worker.cf103-070.workers.dev
# oob-worker.cf102-baf.workers.dev
# oob-worker.cf99-9b3.workers.dev
You're at risk if you installed any package matching the naming pattern above from npm around or after 2026-08-05, or if any of your dependencies' READMEs instructed you to require() a specific unfamiliar sub-package by name.
If you are affected
- Remove any matching package immediately and check whether it was actually
require()'d/imported in your codebase (not just present innode_modules) — the payload only fires on that call, unlike install-time hooks. - If it was imported: treat the host as compromised. Check for the Windows persistence indicators (Registry Run keys, scheduled tasks) if on Windows; rebuild rather than clean in place.
- Rotate credentials accessible from the affected machine.
- Block the Cloudflare Workers hosts and
wel1[.]ru(and subdomains) at your network egress.
→ playbooks/if-you-installed-a-bad-npm-package.md → playbooks/rotating-cloud-credentials.md
Prevention
→ prevention/npm-hardening.md
→ prevention/package-vetting-checklist.md
- --ignore-scripts and npm v12's allowScripts: off don't help here — this campaign's payload fires on ordinary require()/import, the same "import-time execution, no install-time footprint" primitive this repo already tracks for the Rollup polyfill impersonation and Joyfill npm compromises. Vet a package's actual source before importing it, not just its package.json scripts.
- Be suspicious of any package README that specifically instructs you to require() a named sub-module rather than just documenting the package's normal public API.
Sources
- Sonatype — Flooding Dropper Hits npm With 850 Malicious Packages — primary technical writeup: package count, naming pattern, delivery mechanism, IOC domains.
- The Hacker News — Nearly 800 Malicious npm Packages Deliver Cross-Platform RAT and Infostealer — independent confirmation, Windows binary evasion/persistence detail, researcher attribution (Paul McCarty / OpenSourceMalware), Moika-campaign lineage note.