Cybersecurity researchers have uncovered a coordinated supply-chain campaign in which 14 trojanized npm packages — masquerading as functional calendar and streak-tracking utilities — silently deploy a Linux implant tracked as RedC2 4.0, an AI-assisted command-and-control (C2) backdoor. The packages are not broken typosquats that fail on install; they work as advertised, which is precisely what makes them dangerous. They pass casual code review, survive npm install smoke tests, and execute their payload the moment the module is require()'d or imported.
According to TrendAI (Trend Micro's research arm), the execution chain is brutally simple: when the module loads, it locates the bundled binary, marks it executable, and launches it as a detached background process. No CVE is associated with this campaign — this is pure software supply-chain abuse, not an exploitable vulnerability in legitimate code. The affected surface is any developer workstation, build agent, or Linux production container that transitively depends on one of these packages. Given that npm dependency trees routinely pull hundreds of transitive dependencies into CI/CD pipelines, the blast radius extends well beyond the developer who typed npm install.
Defenders need to act on three fronts immediately: (1) inventory whether any of the malicious packages exist in your dependency graphs or artifacts, (2) hunt for the execution behavior — Node.js spawning chmod and detached child binaries — across Linux endpoints and build infrastructure, and (3) harden the package installation pipeline so the next campaign (and there will be one) fails closed instead of open.
Technical Analysis
Affected Products and Platforms
- Ecosystem: npm registry (Node.js)
- Packages: 14 trojanized packages posing as calendar and streak utility libraries (refer to the Trend Micro / The Hacker News reporting for the current package name list; names rotate as takedowns occur and attackers re-publish under fresh aliases)
- Target platform: Linux — the payload is a bundled ELF binary. Developer laptops running Linux, Linux-based CI/CD runners (GitHub Actions self-hosted runners, GitLab runners, Jenkins agents), Docker build containers, and any Linux server that bundles
node_modulesinto deployment artifacts are all in scope. - Payload: RedC2 4.0 — a Linux implant with an AI-assisted C2 channel, meaning the operator can leverage AI-driven tasking/interaction over the C2 session, lowering the skill bar for post-compromise operations and potentially enabling more adaptive, less signature-stable command traffic.
Attack Chain (Defender's View)
- Distribution: Attacker publishes plausible, functional utility packages to npm. Functionality is genuine — this defeats both manual review and automated "does it work" checks.
- Installation: Victim installs the package directly or inherits it transitively. npm's default behavior executes lifecycle scripts (
preinstall,install,postinstall) unless--ignore-scriptsis set, but notably this campaign doesn't even require lifecycle scripts — the payload triggers on module load, meaning it fires at application runtime or duringnpm test, build bundling, or server startup. - Staging: On
require()/import, the module resolves the path of a binary bundled inside the package directory (e.g., undernode_modules/<pkg>/bin/or an obfuscated asset path). - Execution: The module invokes
chmod +xon the bundled binary and spawns it as a detached background process (e.g., via Node'schild_process.spawnwith{ detached: true, stdio: 'ignore' }followed byunref()). The Node process can exit cleanly while the implant persists. - C2: RedC2 4.0 establishes its AI-assisted C2 channel outbound — typically HTTPS or WebSocket to attacker infrastructure or abused legitimate services — blending with normal egress.
Why This Technique Is Effective
The "load-time execution" pattern sidesteps a control many teams rely on: --ignore-scripts and npm's ignore-scripts=true config block lifecycle scripts, but do nothing against code that executes when the module is imported. Detached process spawning breaks parent-child lineage expectations (the implant's parent exits, reparenting it to init/PID 1), which defeats naive process-tree-based EDR detections. And because the binary ships inside the package tarball, there is no suspicious download event at install time to catch.
Exploitation Status
- Status: Confirmed active in-the-wild campaign; packages were live on the npm registry at time of reporting.
- CVE: None assigned — this is malicious package publication, not a vulnerability in legitimate software. No CISA KEV entry applies.
- Attribution: Under investigation by TrendAI; the RedC2 versioning ("4.0") indicates a mature, iterated implant codebase rather than a one-off proof of concept.
Detection & Response
The highest-fidelity detection opportunities cluster around three behaviors: Node/npm spawning chmod, Node spawning detached child binaries from node_modules, and unexpected execution of files residing under node_modules. File-hash and package-name IOCs are ephemeral — behavioral detections survive re-publication under new names.
Sigma Rules
---
title: Node.js or npm Spawning chmod to Mark Binary Executable
id: 3f8a2c14-7b91-4e6d-a502-9c1d8e4f6a2b
status: experimental
description: Detects node/npm/npx processes invoking chmod with +x, consistent with trojanized npm packages staging a bundled binary as seen in the RedC2 4.0 campaign.
references:
- https://thehackernews.com/2026/08/14-trojanized-npm-packages-drop-redc2.html
- https://attack.mitre.org/techniques/T1059/007/
author: Security Arsenal
date: 2026/08/15
tags:
- attack.execution
- attack.t1059.007
- attack.defense_evasion
logsource:
category: process_creation
product: linux
detection:
selection_parent:
ParentImage|endswith:
- '/node'
- '/npm'
- '/npx'
selection_image:
Image|endswith: '/chmod'
selection_cli:
CommandLine|contains:
- '+x'
- 'u+x'
- '755'
- '777'
condition: selection_parent and selection_image and selection_cli
falsepositives:
- Legitimate build tooling marking compiled artifacts executable during npm install of native modules
- Rare postinstall scripts from legitimate packages
level: high
---
title: Execution of Binary Residing Under node_modules Directory
id: 8d4e1b63-2a7f-4c9e-b815-6f3a9d2c5e71
status: experimental
description: Detects execution of ELF binaries located within node_modules paths, a strong indicator of a trojanized npm package launching a bundled implant such as RedC2 4.0.
references:
- https://thehackernews.com/2026/08/14-trojanized-npm-packages-drop-redc2.html
- https://attack.mitre.org/techniques/T1195/002/
author: Security Arsenal
date: 2026/08/15
tags:
- attack.initial_access
- attack.t1195.002
- attack.execution
logsource:
category: process_creation
product: linux
detection:
selection:
Image|contains:
- '/node_modules/'
filter_cli_wrappers:
Image|endswith:
- '/node'
- '/esbuild'
- '/swc'
condition: selection and not filter_cli_wrappers
falsepositives:
- Legitimate packages shipping prebuilt native binaries (esbuild, swc, sharp) - maintain an allowlist per environment
level: high
---
title: Detached Background Process Spawned by Node.js Runtime
id: 5c2f7a91-4d8b-4e36-9a04-1b7e3c6d8f29
status: experimental
description: Detects node processes spawning child processes that immediately daemonize/detach, matching the RedC2 4.0 launch pattern of a detached background implant reparented to init.
references:
- https://thehackernews.com/2026/08/14-trojanized-npm-packages-drop-redc2.html
- https://attack.mitre.org/techniques/T1059/007/
author: Security Arsenal
date: 2026/08/15
tags:
- attack.persistence
- attack.execution
- attack.t1059.007
logsource:
category: process_creation
product: linux
detection:
selection_parent:
ParentImage|endswith:
- '/node'
selection_shell:
CommandLine|contains:
- 'nohup'
- 'setsid'
- 'disown'
- '& disown'
- 'daemon'
condition: selection_parent and selection_shell
falsepositives:
- Process managers (pm2, forever) intentionally daemonizing services
- Legitimate development tooling
level: medium
KQL — Microsoft Sentinel / Defender
This query hunts the core RedC2 4.0 staging behavior across both Defender for Endpoint telemetry and Syslog/CEF-ingested Linux data: Node runtimes invoking chmod, and execution of binaries from within node_modules.
let NodeParents = dynamic(["node", "npm", "npx", "nodejs"]);
let SuspiciousExec = DeviceProcessEvents
| where TimeGenerated > ago(7d)
| where InitiatingProcessFileName in~ (NodeParents)
| where (FileName =~ "chmod" and ProcessCommandLine has_any ("+x", "755", "777"))
or (ProcessCommandLine has "node_modules" and FileName !in~ ("node", "npm", "npx", "sh", "bash"))
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine,
FileName, ProcessCommandLine, FolderPath, SHA256, AccountName, ReportId;
let SyslogExec = Syslog
| where TimeGenerated > ago(7d)
| where SyslogMessage has "node_modules"
| where SyslogMessage has_any ("chmod", "+x", "setsid", "nohup")
| project TimeGenerated, HostName, ProcessName, SyslogMessage;
SuspiciousExec
| union SyslogExec
| order by TimeGenerated desc
Velociraptor VQL
This hunt artifact identifies suspect Node-spawned processes and orphaned (reparented-to-init) binaries running from writable or dependency paths — the detached-process signature of this campaign.
-- Hunt for node-spawned children and detached binaries running from node_modules
SELECT Pid, Ppid, Name, Exe, CommandLine, Username, CreateTime
FROM pslist()
WHERE (CommandLine =~ 'node_modules' AND Name !~ 'node|npm|npx')
OR (Ppid = 1 AND Exe =~ '(node_modules|/tmp/|/var/tmp/|/dev/shm/)')
OR (Name =~ '^node' AND CommandLine =~ '(child_process|spawn|exec)')
Verification and Containment Script (Bash)
Run this on developer workstations, CI runners, and Linux servers to audit for suspicious node_modules binaries, kill detached implants, and lock down npm defaults pending package review.
#!/bin/bash
# RedC2 4.0 / trojanized npm package audit + containment - run as root or via your RMM
set -u
echo "=== [1] Scanning for executable binaries inside node_modules trees ==="
find /home /root /opt /srv /var/www /usr/lib/node_modules -type d -name node_modules 2>/dev/null | while read -r nm; do
find "$nm" -type f -executable ! -name '*.js' ! -name '*.node' ! -name '*.sh' 2>/dev/null
done | tee /tmp/nm_suspect_binaries.txt
echo "=== [2] Checking for detached/orphaned processes with node_modules or tmp paths ==="
ps -eo pid,ppid,comm,args | awk '$2==1' | grep -Ei 'node_modules|/tmp/|/var/tmp/|/dev/shm/' | tee /tmp/nm_orphaned_procs.txt
echo "=== [3] Auditing outbound connections from non-browser userland processes ==="
ss -tupn 2>/dev/null | grep -Ei 'node|npm' | tee /tmp/nm_node_netconns.txt
echo "=== [4] Listing npm packages with install lifecycle scripts (review against known-good) ==="
find / -type d -name node_modules -prune -o -type f -name package.json -print 2>/dev/null | \
xargs grep -lE '"(preinstall|postinstall|install)"' 2>/dev/null | head -50 | tee /tmp/nm_lifecycle_pkgs.txt
echo "=== [5] Hardening npm defaults for the current user context (defense-in-depth) ==="
npm config set ignore-scripts true 2>/dev/null || true
npm config set audit true 2>/dev/null || true
echo "=== [6] Optional: kill orphaned suspect processes found in step 2 (uncomment to enable) ==="
# awk '{print $1}' /tmp/nm_orphaned_procs.txt | xargs -r kill -9
echo "Done. Review /tmp/nm_suspect_binaries.txt, /tmp/nm_orphaned_procs.txt, /tmp/nm_node_netconns.txt"
echo "Next: cross-reference installed package names against the Trend Micro IOC list and rotate"
echo "any credentials, tokens (NPM_TOKEN, AWS_*, SSH keys) present on hosts with confirmed hits."
Remediation
- Identify exposure immediately. Query your artifact registry, lockfiles (
package-lock.json,yarn.lock,pnpm-lock.yaml), and SBOMs for the 14 package names published in the Trend Micro / The Hacker News reporting. Check not just direct dependencies — runnpm ls <package-name>to catch transitive inclusion, and grep built container images and deployed bundles. - Remove and purge. Uninstall the malicious packages, delete
node_modules, clear the npm cache (npm cache clean --force), and rebuild from a known-good lockfile. Do not simplynpm uninstallon a live host — the implant has already executed and survives package removal. - Treat confirmed-hit hosts as compromised. RedC2 4.0 is a full C2 implant. Reimage or rebuild affected workstations, runners, and containers from trusted images. Memory-only cleanup is not sufficient; assume persistence and credential theft.
- Rotate secrets on any host that loaded the package. Priority order: npm/GitHub tokens, cloud provider credentials (AWS/GCP/Azure env vars and metadata-sourced keys), SSH private keys,
.envfiles, kubeconfigs, and any CI/CD service-account tokens. Revoke at the provider, not just locally. - Harden the install pipeline. Set
ignore-scripts=truein project and CI.npmrcfiles (blocks lifecycle scripts, though not load-time execution). Pin all dependencies with lockfiles and integrity hashes (npm ci, nevernpm installin CI). Evaluate private registry proxies (Artifactory, Nexus, Verdaccio) with allowlisting and quarantine windows for newly published package versions. - Deploy the detections above to EDR/SIEM coverage for developer workstations and CI infrastructure — historically under-monitored segments that supply-chain actors deliberately target.
- Add egress controls. Deny-by-default outbound traffic from build runners and restrict developer workstation egress to required registries and SaaS endpoints. AI-assisted C2 still has to traverse the wire; egress filtering converts a silent compromise into a blocked, alertable event.
- Adopt continuous dependency monitoring. Integrate SCA tooling with malicious-package intelligence feeds (npm audit, Socket, OpenSSF malicious-packages repo) into pull-request gating, so a trojanized dependency is blocked at merge time rather than discovered by researchers weeks later.
Supply-chain compromises via package registries are now a standard initial-access vector, and the AI-assisted C2 in RedC2 4.0 signals operators are investing in post-compromise efficiency. The organizations that fare best are the ones that treat developer endpoints and build pipelines as tier-zero assets — because attackers already do.
Related Resources
Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.