Russian AI Slopsquatting Publishes 700+ Malicious NPM Packages A threat actor published more than 700 malicious packages to the npm registry over 48 hours, using AI-generated typo-squatted names to deliver a cross-platform RAT and infostealer. The packages, such as checkout-mobile-bnpl@35.6.9, execute upon import via require() without lifecycle scripts, downloading payloads from Cloudflare Workers hosts or DNS TXT records under wel1.ru. The OpenSourceMalware research team analyzed the campaign, which affects Windows, Linux, and macOS with critical severity. BLOG Russian AI Slopsquatting Publishes 700+ Malicious NPM Packages NUL1DROPPER is a new downloader targeting mobile SDK installs a RAT to Windows, Mac, and Linux with no install script required By c0a15726-c5b1-4b0d-85e6-fe15553df9e2 · Over the course of 48 hours a threat actor has published more than 700 malicious packages to the NPM registry. These packages appear to use AI slop squatted, or randomly generated typo-squatting package names, but all of them deliver a powerful RAT and infostealer payload. The NPM packages do not use a preinstall or postinstall script. It doesn’t need one. The README tells developers to load the library with require "checkout-mobile-bnpl" , and that single call starts the infection chain. The downloader supports Windows, Linux, and macOS. It rotates through three Cloudflare Workers hosts for its primary payload delivery and falls back to reconstructing the payload from DNS TXT records hosted under wel1.ru . That DNS fallback is the interesting part. Even if defenders block the obvious HTTPS hosts, the package has a second route for delivering the same executable. TL;DR Threat type: Cross-platform downloader and dropper Affected ecosystem: npm Malicious package: checkout-mobile-bnpl@35.6.9 Execution trigger: Importing the package with require Primary delivery: HTTPS from three workers.dev hosts Fallback delivery: Base64-encoded payload chunks in DNS TXT records Impact: Downloads and silently executes native malware; the macOS payload establishes persistence and retrieves an additional beacon Severity: Critical The OpenSourceMalware research team has analyzed multiple packages from this campaign. There are minor differences in the workers.dev C2, but otherwise the payloads are exactly the same. A Mobile SDK That Doesn’t Do Much Mobile SDK Work At first glance, the example package we chose, checkout-mobile-bnpl , presents itself as a small mobile SDK. Its public API exposes a class with init , version , and configure methods. None of those methods perform any meaningful checkout or buy-now-pay-later functionality. The real behavior is tucked underneath the export at the bottom of index.js : js module.exports = { CheckoutMobileBnpl, create: opts = new CheckoutMobileBnpl opts , VERSION }; try { require "./ helpers" ; } catch {} That last line loads helpers.js . The helper file calls its own run function immediately, so a developer does not need to initialize the alleged SDK or call a suspicious method. Importing the package is enough. This is a useful reminder that npm malware does not require lifecycle scripts to execute. Install-script controls help, but they do not protect an application that later imports a malicious dependency during development, testing, or production startup. What Does the Package Do? Once loaded, the package identifies the operating system and CPU architecture and maps the victim to one of four payload paths: Victim platform Payload path Linux x64 /pkg/package Linux ARM64 /pkg/package-arm64 macOS x64 or ARM64 /pkg/loader mac Windows x64 or x86 /pkg/package.exe It shuffles three attacker-controlled hosts and attempts an HTTPS GET against each one: oob-worker.cf103-070.workers.dev oob-worker.cf102-baf.workers.dev oob-worker.cf99-9b3.workers.dev The request is forced over IPv4, times out after 15 seconds, and uses node-fetch/2.6 as its User-Agent. A response is accepted only when the server returns HTTP 200 and more than 1,000 bytes. There is no signature check, trusted certificate pinning, expected hash, or other payload verification. Whatever those servers return is treated as an executable. When HTTPS Fails, It Downloads the Payload Through DNS If all three HTTPS hosts fail, the package switches to a platform-specific domain: Victim platform DNS payload domain Linux x64 sdk.dl.wel1.ru Linux ARM64 ext.dl.wel1.ru macOS pkg.dl.wel1.ru Windows net.dl.wel1.ru The package first requests a TXT record from c.