AdaptixC2 via npm typosquat: DFIR playbook for https-proxy-utils
Kaspersky reported on October 17, 2025 that a malicious npm package named https-proxy-utils masqueraded as a proxy helper and, during installation, executed a postinstall script that fetched and launched an AdaptixC2 agent; the package has since been removed from npm (Securelist). The lure name mimicked popular packages like http-proxy-agent and https-proxy-agent, and even cloned functionality from proxy-from-env to appear legitimate (Securelist).
AdaptixC2 is an open-source, cross‑platform post‑exploitation framework with server components in Go and a Qt client, providing beacons and listeners across Windows, macOS, and Linux—features attractive both to red teams and threat actors (AdaptixC2 GitHub).
Why DFIR teams should care
- The infection vector is developer tooling: a postinstall script in a dependency. npm lifecycle hooks run arbitrary commands by design, so a single mistaken
installin a dev workstation or CI runner can bootstrap C2 (npm scripts docs). - The implant uses OS‑specific drop locations and persistence, blending in with normal platform behaviors and making triage noisy if you don’t know where to look (Securelist).
- The Windows stage employs DLL sideloading via a legitimate binary—mapped to MITRE ATT&CK T1574.001—complicating binary trust heuristics (MITRE ATT&CK T1574.001; Securelist).
Execution details and artefacts
Package behavior and network
- Package:
https-proxy-utils(malicious; removed from npm) (Securelist). - Trigger:
postinstalllifecycle script downloads and executes platform‑specific AdaptixC2 payloads (Securelist; npm scripts docs). - C2/hosted payload endpoints observed:
cloudcenter.toppaths for Windows/macOS/Linux arm/x64 payloads and a macOS plist; see IOC list below (Securelist).
OS‑specific staging
-
Windows
- Drops a malicious DLL into
C:\Windows\Tasks, then copiesmsdtc.exeinto the same directory to sideload the DLL on execution (Securelist). - Technique: DLL sideloading (MITRE ATT&CK T1574.001) (MITRE ATT&CK).
- Drops a malicious DLL into
-
macOS
- Writes an executable into the user’s
~/Library/LaunchAgentsand drops a plist to achieve autorun; selects x64 vs ARM payload before download (Securelist). - Launch agents/daemons are the supported macOS persistence mechanism; official locations include
~/Library/LaunchAgentsand/Library/LaunchAgents(Apple Developer launchd doc; Apple Terminal guide).
- Writes an executable into the user’s
-
Linux
- Fetches the agent into
/tmp/.fonts-unix(x64/ARM) and marks it executable (Securelist).
- Fetches the agent into
Indicators of Compromise (subset)
Package name
https-proxy-utils
Network
cloudcenter.top/sys/update
cloudcenter.top/macos_update_arm
cloudcenter.top/macos_update_x64
cloudcenter.top/macosUpdate.plist
cloudcenter.top/linux_update_x64
cloudcenter.top/linux_update_arm
Source: Kaspersky IOC section (Securelist).
Where to hunt first: developer and CI artefacts
Target investigations at places npm/yarn/pnpm record dependency state and lifecycle activity:
-
Lockfiles and manifests
package-lock.json,yarn.lock,pnpm-lock.yaml—search forhttps-proxy-utilsand unexpected transitive inclusions (npm ci blog).- pnpm lock/behavior docs if you use pnpm in CI (pnpm settings – ignoreScripts).
-
npm logs and cache
- NPM writes logs under
_logsinside the npm cache; default cache is~/.npm(POSIX) or%AppData%/npm-cache(Windows). Usenpm config get cacheto locate it, then inspect_logs/for failed postinstall or unusual fetches (npm folders; npm logging).
- NPM writes logs under
-
Lifecycle scripts evidence
- npm lifecycle hooks, including
postinstall, run command strings from dependencies’package.json(npm scripts docs). In CI, prefernpm cifor reproducible installs and consider disabling scripts when feasible (npm ci blog; npm install ignore-scripts).
- npm lifecycle hooks, including
Quick hunts (copy/paste)
- Repo/lockfile search
# Linux/macOS
rg -n --hidden -S "https-proxy-utils" -g '!node_modules' .
# Windows PowerShell
Get-ChildItem -Recurse -Filter package-lock.json | Select-String -Pattern 'https-proxy-utils'
Get-ChildItem -Recurse -Filter yarn.lock | Select-String -Pattern 'https-proxy-utils'
Get-ChildItem -Recurse -Filter pnpm-lock.yaml | Select-String -Pattern 'https-proxy-utils'
- npm cache/logs for network traces
npm config get cache # locate cache dir
# Then inspect <cache>/_logs/*.log for postinstall or cloudcenter.top URLs
rg -n "cloudcenter\.top" "$(npm config get cache)" -S || true
Endpoint hunts by OS
Windows
- File hunts
- Look for unsigned/unexpected DLLs in
C:\Windows\Tasksalongsidemsdtc.exe(Securelist).
- Look for unsigned/unexpected DLLs in
- Process/Module telemetry
- Hunt for
msdtc.exeexecuting fromC:\Windows\Tasks\instead ofC:\Windows\System32\and loading a local DLL (DLL sideloading, ATT&CK T1574.001) (MITRE ATT&CK).
- Hunt for
- Example Sigma (process creation)
title: MSDTC Executed from Non-Standard Path
id: 9db3d6e8-0f5b-4a5f-9c2e-https-proxy-utils
status: experimental
description: Detect msdtc.exe spawned from Windows\Tasks (AdaptixC2 npm case)
logsource: { product: windows, category: process_creation }
detection:
sel:
Image|endswith: '\\msdtc.exe'
Image|contains: '\\Windows\\Tasks\\'
condition: sel
level: high
references:
- https://securelist.com/adaptixc2-agent-found-in-an-npm-package/117784/
- https://attack.mitre.org/techniques/T1574/001/
macOS
- Persistence
- Inspect
~/Library/LaunchAgentsfor unfamiliar plists referencing binaries in user writeable paths or remote URLs; this is a standard persistence location (Apple Developer launchd doc; Apple Terminal guide).
- Inspect
- Unload/remove suspicious agent
launchctl list | grep -i macosUpdate || true
launchctl bootout gui/"$(id -u)" ~/Library/LaunchAgents/<suspicious>.plist
rm -f ~/Library/LaunchAgents/<suspicious>.plist
- IOC points to
macosUpdate.plist; search for that string too (Securelist).
Linux
- Staging folder
- Examine
/tmp/.fonts-unixfor recently created ELF payloads and anomalous execute bits (Securelist).
- Examine
ls -la /tmp/.fonts-unix 2>/dev/null || true
file /tmp/.fonts-unix/* 2>/dev/null | grep -E 'ELF|Mach-O'
Network detection and containment
- Block/alert on
cloudcenter.toppaths enumerated in the IOC list (Securelist). - Watch for initial postinstall fetches from developer workstations/CI runners shortly after
npm i/npm ci. npm can run lifecycle scripts unless disabled (npm install flags; npm scripts docs).
Response guidance
- Developer endpoints and CI runners
- Isolate the host if you confirm a hit. On Windows, delete the rogue
msdtc.exeand malicious DLL fromC:\Windows\Tasksand restore the legitimate binary in System32; re-run EDR scans (sideloading per ATT&CK T1574.001) (MITRE ATT&CK; Securelist). - On macOS, unload and remove the LaunchAgent plist and its executable from
~/Library/LaunchAgents(Apple Terminal guide). - On Linux, remove payloads from
/tmp/.fonts-unixand rotate credentials if any developer tokens could have been accessed (Securelist).
- Dependency hygiene and install hardening
- Use lockfile‑driven, reproducible installs in CI:
npm cior the lockfile equivalents in yarn/pnpm (npm ci blog; yarn install docs; pnpm settings). - Disable lifecycle scripts where possible during CI:
npm ci --ignore-scripts,yarn install --ignore-scripts, or pnpm’s--ignore-scripts(npm install flags; yarn install docs; pnpm install flags). - If you must run some scripts, prefer an allowlist approach with
@lavamoat/allow-scriptsto execute only explicitly approved lifecycle hooks (LavaMoat allow-scripts).
- Hunting and eradication at scale
- Search SCM and artifact registries for
https-proxy-utilsreferences in manifests and lockfiles; purge artifacts built during the exposure window. - In npm caches/logs, look for failed or successful fetches to
cloudcenter.top(logs reside under the npm cache path by default) (npm logging; npm folders).
About AdaptixC2 (for triage and intel)
AdaptixC2 provides listeners and agents across Windows/Linux/macOS, with features like GUI control, encrypted comms, and multiple beacon listeners—so a successful install on a developer machine can quickly escalate into lateral movement if credentials or code signing material are present (AdaptixC2 GitHub).
Appendix: Hashes and URLs (from Kaspersky)
Kaspersky provides multiple hashes for the package and lists the payload endpoints; operationalize these in blocklists and retro hunts (Securelist).
Takeaways
- Hunt and purge
https-proxy-utilsfrom lockfiles, node_modules, caches, and CI images; scan forcloudcenter.topin npm_logsand proxy telemetry (Securelist; npm logging). - Prioritize OS hunts: Windows DLL in
C:\Windows\Taskswithmsdtc.exesideloading; macOS LaunchAgents; Linux/tmp/.fonts-unixbinaries (Securelist; MITRE ATT&CK; Apple docs). - Harden installs: prefer
npm ci, disable lifecycle scripts in CI when feasible, or enforce an allowlist with@lavamoat/allow-scripts(npm ci blog; npm install flags; LavaMoat). - Monitor for postinstall‑timed network egress from developer hosts and CI, and block
cloudcenter.toppayload endpoints (Securelist).
Sources / References
- Kaspersky Securelist: Malicious package with AdaptixC2 agent found in npm: https://securelist.com/adaptixc2-agent-found-in-an-npm-package/117784/
- AdaptixC2 GitHub repository: https://github.com/Adaptix-Framework/AdaptixC2
- MITRE ATT&CK T1574.001: DLL sideloading: https://attack.mitre.org/techniques/T1574/001/
- npm docs: scripts lifecycle: https://docs.npmjs.com/cli/v11/using-npm/scripts/
- npm docs: logging and _logs location: https://docs.npmjs.com/cli/v9/using-npm/logging
- npm docs: folders (cache paths): https://docs.npmjs.com/cli/v7/configuring-npm/folders/
- npm blog: introducing npm ci: https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable
- npm install flags (ignore-scripts, foreground-scripts): https://www.unpkg.com/npm%4010.8.2/docs/output/commands/npm-install.html
- Yarn classic: yarn install --ignore-scripts: https://classic.yarnpkg.com/lang/en/docs/cli/install/
- pnpm settings: ignoreScripts: https://pnpm.io/next/settings
- Apple Developer: Creating Launch Daemons and Agents: https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html
- Apple Terminal User Guide: launchd locations: https://support.apple.com/et-ee/guide/terminal/apdc6c1077b-5d5d-4d35-9c19-60f2397b2369/mac
- LavaMoat: allow-scripts (allowlisting lifecycle hooks): https://lavamoat.github.io/guides/allow-scripts/