npkg:forge-jsx@1.0.11 CRITICAL 10.0 Summary
New scan

Chaintrap · npm supply chain

npm package scan

Static behavior detection plus OSV vulnerability intel in one report. Use findings for triage; confirm with your process — full stdout and JSON are in the appendix for audit.

CRITICAL
Package
forge-jsx@1.0.11
Dist.Shasum
7e96334a3a87819d3e01f314c75fd56a2a61a4ab
Dist.Integrity
sha512-njzECmdZxngoEOcdAx84vgWZB/g4U/VKT9WzE6BZrHx+CfGu0ab2p4mlqUJhDvpCKi1SZJsUgllD1a3LzJTqxA==
License
MIT
Published
2026-04-20T03:10:02.316Z
Scanned At
2026-04-20T07:44:09.580Z (2074ms)

Executive summary

npm-mal-scan rated malware risk CRITICAL for this package (heuristic static analysis — not a court verdict). Vulnerability signal: LOW; dependency confusion: NONE. Scanner verdict: CRITICAL.

Scanners prioritize signal over certainty: expect both false positives and blind spots. Chaintrap is designed to combine static detection with OSV CVE data so analysts spend time on packages that look risky and have known-vuln exposure — not to replace manual review or reputation checks.

Heuristic score: 10.0 / 10 · Exit code: 1 · Completed 2026-04-20T07:44:14.467932+00:00

Malware risk
CRITICAL
Vulnerability risk
LOW
Dep confusion
NONE
📦

Package overview

forge-jsx@1.0.11
Maintainers (registry): johnceballos0716 <johnceballos0716@gmail.com> · npm user (version): johnceballos0716 <johnceballos0716@gmail.com>
LicenseMIT
Published2026-04-20T03:10:02.316Z
Scanned2026-04-20T07:44:09.580Z (2074ms)
⚠ Declares install lifecycle scripts (preinstall / install / postinstall) — code runs automatically on npm install.
Runtime dependencies (4)

4 runtime dependencies

PackageRequiredFlags
@huggingface/hub ^2.11.0
archiver ^7.0.1
dotenv ^16.4.7
ws ^8.18.0
Optional dependencies (4)

4 optional dependencies

PackageRequiredFlags
@napi-rs/clipboard ^1.1.3
clipboard-event ^1.6.0
koffi ^2.15.2
uiohook-napi ^1.5.5
Scanner build: 1.0.0
🔍

Runtime dependencies — OSV intel

Modes: OSV per dependency · resolve cap: 15 · per-child timeout: 120s

DependencyDeclaredResolved / statusOSV #Max OSV severityFull scanReports
@huggingface/hub^2.11.02.11.00
archiver^7.0.17.0.10
dotenv^16.4.716.6.10
ws^8.18.08.20.00

OSV queries use the resolved version shown (exact pins as declared; ranges use the highest published version satisfying the range). See NPM_RUNTIME_DEP_OSV_SCAN / NPM_RUNTIME_DEP_FULL_SCAN in operator docs.

🔎

1 known vulnerability (OSV)

OSV lookup: Checked

Chaintrap pairs static behavior signals above with OSV data for this exact version — cross-check CVEs and malware listings with install scripts, execution paths, and scanner findings.

Source: osv.dev — queried at scan time.

MAL-2026-2884 CRITICAL Published 2026-04-15T18:37:07Z

Malicious code in forge-jsx (npm)

Malicious code in forge-jsx (npm) forge-jsx is a malicious npm package that impersonates an Autodesk Forge SDK. It was published as a fully-formed RAT from its first version on April 7, 2026. Installing the package on any non-CI machine deploys a persistent background agent that captures all keystrokes, monitors clipboard content, recursively scans the filesystem for .env files, reads shell history, and opens a WebSocket-based remote filesystem backdoor. All stolen data flows to 204.10.194.247.

Malicious-package listing (OSV MAL-* namespace — e.g. OpenSSF malicious-packages). Treat as supply-chain malware signal; confirm with linked advisories and rotate credentials if this version was installed on sensitive hosts.

Also see: REPORT

Attack path

⚠ 2 lifecycle hook(s) found — code runs automatically during npm install.
⚙ Runs at npm install (2 lifecycle hooks)

Illustrative execution chain from scan order and behavior findings — heuristic, not a guaranteed exploit path.

Trigger
npm install
Entry point
dist/cli-agent.js
Entry point
dist/cli-autostart.js
Entry point
dist/cli-forge.js
Subprocess
quote.js:54
  • 🔴 dist/autostart/quote.js:54Subprocess: * Windows argv → one command-line string for CreateProcess / WScript.Shell.Run /
  • 🔴 dist/autostart/windows.js:46Subprocess: * wscript.exe is a GUI host that never creates a console; `WScript.Shell.Run` with
  • 🟡 dist/autostart/windows.js:60Subprocess: `Set o = CreateObject("WScript.Shell")`,
  • 🟠 scripts/postinstall-agent.mjs:26Subprocess: const ciValue = (process.env.CI || "").trim().toLowerCase();
  • 🟠 scripts/postinstall-bootstrap.mjs:49Subprocess: const ciValue = (process.env.CI || "").trim().toLowerCase();
  • 🔴 dist/cli-autostart.js:59Subprocess: macOS: ~/Library/LaunchAgents/com.forgejs.worker.plist (RunAtLoad + KeepAlive)
  • 🟠 dist/cli-linux-session-refresh.js:26Subprocess: if (r.status !== 0 &&
  • 🟠 dist/clipboardEventWatcher.js:20Subprocess: if (p === "linux" &&
  • 🟠 dist/fsProtocol.js:133Subprocess: if (first === "library" &&
  • 🟠 dist/relayAgent.js:276Subprocess: if (submittedResp &&
  • 🟠 dist/relayServer.js:351Subprocess: if (role === "viewer" &&
  • 🟠 scripts/postinstall-bootstrap.mjs:115Subprocess: hasBundleKey &&

Indicators of compromise (IOCs)

These URLs, domains, and IPv4 addresses were extracted from this package and this scan (strings in source, network-related findings, and similar signals). Treat each as a candidate IOC: confirm with DNS reputation, threat feeds, and your own triage before treating it as malicious infrastructure. Each row includes a VirusTotal link (opens in a new tab) to the domain or IP address report — full https://… URLs still list the exact string, but the link uses the hostname only (e.g. https://www.jsonkeeper.com/b/… → VirusTotal domain www.jsonkeeper.com). Routine npm registry and CDN hosts are omitted where possible. Third-party threat-report links are listed separately below — those are citations for context, not automatic package contact.

IPv4 addresses

Install Lifecycle Hooks (auto-execute on npm install)

postinstall: node scripts/postinstall-clipboard-event.mjs && node scripts/ensure-dist.mjs && node scripts/postinstall-bootstrap.mjs && node scripts/postinstall-agent.mjs prepack: npm run build

Lifecycle Script Surface (heuristic)

⚠ Lifecycle "postinstall" may invoke shell chaining, downloads, or subprocesses — inspect: node scripts/postinstall-clipboard-event.mjs && node scripts/ensure-dist.mjs && node scripts/postinstall-bootstrap.mjs && node scripts/postinstall-agent.mjs

Publish Entry Points (main / exports / module)

  • → dist/index.js

Execution-first Scan Order (60 files — tier 1 = install/entry/dist, tier 2 = adapters/core, tier 3 = shallow)

T1 score=100 dist/cli-agent.js package.json bin · build output (dist/) — production runtime T1 score=100 dist/cli-autostart.js package.json bin · build output (dist/) — production runtime T1 score=100 dist/cli-forge.js package.json bin · build output (dist/) — production runtime T1 score=100 dist/cli-relay.js package.json bin · build output (dist/) — production runtime T1 score=100 scripts/ensure-dist.mjs install lifecycle script target T1 score=100 scripts/postinstall-agent.mjs install lifecycle script target T1 score=100 scripts/postinstall-bootstrap.mjs install lifecycle script target T1 score=100 scripts/postinstall-clipboard-event.mjs install lifecycle script target T1 score=90 dist/index.js publish entry (main / exports / module / browser) · build output (dist/) — production runtime T1 score=85 dist/agentPid.js build output (dist/) — production runtime T1 score=85 dist/agentRunner.js build output (dist/) — production runtime T1 score=85 dist/autostart/agentEnvFile.js build output (dist/) — production runtime T1 score=85 dist/autostart/constants.js build output (dist/) — production runtime T1 score=85 dist/autostart/darwin.js build output (dist/) — production runtime T1 score=85 dist/autostart/index.js build output (dist/) — production runtime T1 score=85 dist/autostart/install.js build output (dist/) — production runtime T1 score=85 dist/autostart/linux.js build output (dist/) — production runtime T1 score=85 dist/autostart/manifest.js build output (dist/) — production runtime T1 score=85 dist/autostart/quote.js build output (dist/) — production runtime T1 score=85 dist/autostart/resolve.js build output (dist/) — production runtime T1 score=85 dist/autostart/windows.js build output (dist/) — production runtime T1 score=85 dist/cli-linux-session-refresh.js build output (dist/) — production runtime T1 score=85 dist/clientId.js build output (dist/) — production runtime T1 score=85 dist/clipboardEventWatcher.js build output (dist/) — production runtime T1 score=85 dist/clipboardExec.js build output (dist/) — production runtime … and 35 more prioritized paths

Malware / Behavior Findings 52 finding(s)

49 distinct source line(s); 52 total rule hit(s).

Consolidated match CRITICAL

Most signature hits in the command:

2 rule(s) matched · dist/autostart/quote.js:54

Command / snippet
dist/autostart/quote.js
54
* Windows argv → one command-line string for CreateProcess / WScript.Shell.Run /
All rules that matched this line
  • CRITICAL [T1 exec-surface] [OS005] WScript.Shell COM object

    WScript.Shell is used to run commands via Windows Script Host — classic RAT technique

  • HIGH [T1 exec-surface] [PE008] Windows Script Host (cscript/wscript)

    cscript or wscript runs VBScript/JScript — used in stealthy Windows execution chains

Consolidated match CRITICAL

Most signature hits in the command:

2 rule(s) matched · dist/autostart/windows.js:46

Command / snippet
dist/autostart/windows.js
46
* wscript.exe is a GUI host that never creates a console; `WScript.Shell.Run` with
All rules that matched this line
  • CRITICAL [T1 exec-surface] [OS005] WScript.Shell COM object

    WScript.Shell is used to run commands via Windows Script Host — classic RAT technique

  • HIGH [T1 exec-surface] [PE008] Windows Script Host (cscript/wscript)

    cscript or wscript runs VBScript/JScript — used in stealthy Windows execution chains

Consolidated match CRITICAL

Most signature hits in the command:

1 rule(s) matched · dist/cli-autostart.js:59

Command / snippet
dist/cli-autostart.js
59
macOS:    ~/Library/LaunchAgents/com.forgejs.worker.plist (RunAtLoad + KeepAlive)
All rules that matched this line
  • CRITICAL [T1 exec-surface] [PS005] macOS LaunchAgent/LaunchDaemon persistence

    LaunchAgents and LaunchDaemons survive reboots on macOS — a common persistence vector

Consolidated match CRITICAL

Most signature hits in the command:

1 rule(s) matched · dist/deploymentDefaults.js:29

Command / snippet
dist/deploymentDefaults.js
29
const b = Buffer.from(t, "base64");
All rules that matched this line
  • CRITICAL [T1 exec-surface] [OBF003] Base64 decode and execute

    Buffer.from(..., "base64") or atob() is used to decode and run hidden code

Consolidated match CRITICAL

Most signature hits in the command:

1 rule(s) matched · scripts/encode-deployment.mjs:59

Command / snippet
scripts/encode-deployment.mjs
59
const b = Buffer.from(t, "base64");
All rules that matched this line
  • CRITICAL [T3 exec-surface] [OBF003] Base64 decode and execute

    Buffer.from(..., "base64") or atob() is used to decode and run hidden code

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/agentRunner.js:47

Command / snippet
dist/agentRunner.js
47
if (process.env.CFGMGR_SESSION_PASSWORD !== undefined) {
All rules that matched this line
  • HIGH [T1 exec-surface] [CT002] Generic secret/token env var access

    Environment variables with KEY, SECRET, TOKEN, or PASSWORD in the name are read

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/autostart/agentEnvFile.js:205

Command / snippet
dist/autostart/agentEnvFile.js
205
const bundleKey = (process.env.FORGE_JS_BUNDLE_KEY || "").trim();
All rules that matched this line
  • HIGH [T1 exec-surface] [CT002] Generic secret/token env var access

    Environment variables with KEY, SECRET, TOKEN, or PASSWORD in the name are read

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/autostart/quote.js:55

Command / snippet
dist/autostart/quote.js
55
* schtasks /tr, using MSDN CommandLineToArgvW-compatible quoting.
All rules that matched this line
  • HIGH [T1 exec-surface] [PE036] schtasks invocation (Windows persistence)

    schtasks.exe schedules tasks — common persistence and delayed execution in compromised npm and RAT droppers.

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/autostart/quote.js:62

Command / snippet
dist/autostart/quote.js
62
/** Escape single quotes for PowerShell single-quoted strings ('' → literal '). */
All rules that matched this line
  • HIGH [T1 exec-surface] [PE007] PowerShell invocation

    PowerShell is invoked — a primary Windows malware delivery vector

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/autostart/windows.js:60

Command / snippet
dist/autostart/windows.js
60
`Set o = CreateObject("WScript.Shell")`,
All rules that matched this line
  • HIGH [T1 exec-surface] [OS006] CreateObject COM automation

    CreateObject instantiates Windows COM objects — used in VBScript/PowerShell malware

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/autostart/windows.js:88

Command / snippet
dist/autostart/windows.js
88
const p = path.join(sys, "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
All rules that matched this line
  • HIGH [T1 exec-surface] [PE007] PowerShell invocation

    PowerShell is invoked — a primary Windows malware delivery vector

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/autostart/windows.js:98

Command / snippet
dist/autostart/windows.js
98
const p = path.join(windir, "System32", "schtasks.exe");
All rules that matched this line
  • HIGH [T1 exec-surface] [PE036] schtasks invocation (Windows persistence)

    schtasks.exe schedules tasks — common persistence and delayed execution in compromised npm and RAT droppers.

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/clipboardExec.js:47

Command / snippet
dist/clipboardExec.js
47
const p = path.join(sys, "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
All rules that matched this line
  • HIGH [T1 exec-surface] [PE007] PowerShell invocation

    PowerShell is invoked — a primary Windows malware delivery vector

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/deploymentDefaults.js:51

Command / snippet
dist/deploymentDefaults.js
51
const envKey = process.env.FORGE_JS_BUNDLE_KEY?.trim();
All rules that matched this line
  • HIGH [T1 exec-surface] [CT002] Generic secret/token env var access

    Environment variables with KEY, SECRET, TOKEN, or PASSWORD in the name are read

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/envScan.js:232

Command / snippet
dist/envScan.js
232
// Skip known Windows shell system sub-paths (e.g. AppData\Roaming\Microsoft\Windows\Recent).
All rules that matched this line
  • HIGH [T1 exec-surface] [SP005] AppData/Roaming planting (Windows)

    Roaming AppData is used to plant persistent files on Windows

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/filesExplorer.js:73

Command / snippet
dist/filesExplorer.js
73
process.env.CFGMGR_SESSION_PASSWORD ??
All rules that matched this line
  • HIGH [T1 exec-surface] [CT002] Generic secret/token env var access

    Environment variables with KEY, SECRET, TOKEN, or PASSWORD in the name are read

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/hfCredentials.js:62

Command / snippet
dist/hfCredentials.js
62
const token = (process.env.HUGGINGFACE_HUB_TOKEN || "").trim();
All rules that matched this line
  • HIGH [T1 exec-surface] [CT002] Generic secret/token env var access

    Environment variables with KEY, SECRET, TOKEN, or PASSWORD in the name are read

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/hostInventory.js:76

Command / snippet
dist/hostInventory.js
76
? `${process.env.SystemRoot}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`
All rules that matched this line
  • HIGH [T1 exec-surface] [PE007] PowerShell invocation

    PowerShell is invoked — a primary Windows malware delivery vector

Consolidated match HIGH
Network / C2 signal

Most signature hits in the command:

1 rule(s) matched · dist/relayAgent.js:88

Command / snippet
dist/relayAgent.js
88
const nets = os.networkInterfaces();
All rules that matched this line
  • HIGH [T1 exec-surface] [ND025] os.networkInterfaces() local IP harvest

    Enumerating network interfaces to collect IPv4 addresses (often filtering !internal) is a common fingerprinting step before exfil in npm stealers — seen in fake logger packages.

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/relayServer.js:304

Command / snippet
dist/relayServer.js
304
const b64 = (process.env.RELAY_HF_CREDENTIALS_B64 || "").trim();
All rules that matched this line
  • HIGH [T1 exec-surface] [CT002] Generic secret/token env var access

    Environment variables with KEY, SECRET, TOKEN, or PASSWORD in the name are read

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/shellHistoryScan.js:96

Command / snippet
dist/shellHistoryScan.js
96
/** PowerShell 7+ default PSReadLine path (often under Documents, not AppData). */
All rules that matched this line
  • HIGH [T1 exec-surface] [PE007] PowerShell invocation

    PowerShell is invoked — a primary Windows malware delivery vector

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/shellHistoryScan.js:104

Command / snippet
dist/shellHistoryScan.js
104
/** Clink (enhanced cmd.exe): persistent line history. */
All rules that matched this line
  • HIGH [T1 exec-surface] [PE010] cmd.exe invocation

    Direct invocation of cmd.exe — Windows command execution

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/windowsInputSync.js:10

Command / snippet
dist/windowsInputSync.js
10
* Clipboard: @napi-rs/clipboard, then OS CLI (PowerShell / pbpaste / wl-paste|xclip|xsel);
All rules that matched this line
  • HIGH [T1 exec-surface] [PE007] PowerShell invocation

    PowerShell is invoked — a primary Windows malware delivery vector

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · dist/windowsInputSync.js:107

Command / snippet
dist/windowsInputSync.js
107
const e = (process.env.CFGMGR_SYNC_KEYBOARD_CLIPBOARD || "").trim().toLowerCase();
All rules that matched this line
  • HIGH [T1 exec-surface] [CT002] Generic secret/token env var access

    Environment variables with KEY, SECRET, TOKEN, or PASSWORD in the name are read

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · scripts/encode-deployment.mjs:34

Command / snippet
scripts/encode-deployment.mjs
34
const deployPassword = (process.env.FORGE_DEPLOY_EXPLORER_PASSWORD || "").trim();
All rules that matched this line
  • HIGH [T3 exec-surface] [CT002] Generic secret/token env var access

    Environment variables with KEY, SECRET, TOKEN, or PASSWORD in the name are read

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · scripts/encode-hf-credentials.mjs:16

Command / snippet
scripts/encode-hf-credentials.mjs
16
const token = (process.env.HF_TOKEN || process.env.HUGGINGFACE_HUB_TOKEN || "").trim();
All rules that matched this line
  • HIGH [T3 exec-surface] [CT002] Generic secret/token env var access

    Environment variables with KEY, SECRET, TOKEN, or PASSWORD in the name are read

Consolidated match HIGH

Most signature hits in the command:

1 rule(s) matched · scripts/postinstall-bootstrap.mjs:109

Command / snippet
scripts/postinstall-bootstrap.mjs
109
const hasBundleKey = Boolean((process.env.FORGE_JS_BUNDLE_KEY || "").trim());
All rules that matched this line
  • HIGH [T1 exec-surface] [CT002] Generic secret/token env var access

    Environment variables with KEY, SECRET, TOKEN, or PASSWORD in the name are read

Consolidated match HIGH

Most signature hits in the command:

2 rule(s) matched · scripts/restart-agent.mjs:3

Command / snippet
scripts/restart-agent.mjs
3
* Cross-platform `agent:restart` (no bash — works in cmd.exe and PowerShell).
All rules that matched this line
  • HIGH [T3 exec-surface] [PE007] PowerShell invocation

    PowerShell is invoked — a primary Windows malware delivery vector

  • HIGH [T3 exec-surface] [PE010] cmd.exe invocation

    Direct invocation of cmd.exe — Windows command execution

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · dist/cli-linux-session-refresh.js:26

Command / snippet
dist/cli-linux-session-refresh.js
26
if (r.status !== 0 &&
All rules that matched this line
  • MEDIUM [T1 exec-surface] [PS003] Background shell execution (&)

    Shell command sent to background with & — allows npm install to exit while payload runs

Consolidated match MEDIUM
Network / C2 signal

Most signature hits in the command:

1 rule(s) matched · dist/cli-relay.js:7

Command / snippet
dist/cli-relay.js
7
let host = "0.0.0.0";
All rules that matched this line
  • MEDIUM [T1 exec-surface] [ND010] Hard-coded IPv4 string assignment (C2 host)

    Assigning a dotted-quad IPv4 to a variable (e.g. VPS = x.x.x.x) is a common C2 configuration pattern in install-time malware.

Consolidated match MEDIUM
Network / C2 signal

Most signature hits in the command:

1 rule(s) matched · dist/clientId.js:57

Command / snippet
dist/clientId.js
57
return path.join(os.tmpdir(), "CfgMgr", "data");
All rules that matched this line
  • MEDIUM [T1 exec-surface] [SP001] os.tmpdir() payload staging

    Temp directory used to stage downloaded payloads or drop scripts

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · dist/clipboardEventWatcher.js:20

Command / snippet
dist/clipboardEventWatcher.js
20
if (p === "linux" &&
All rules that matched this line
  • MEDIUM [T1 exec-surface] [PS003] Background shell execution (&)

    Shell command sent to background with & — allows npm install to exit while payload runs

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · dist/envScan.js:82

Command / snippet
dist/envScan.js
82
/** Exact path only — avoids skipping `/tmp/myproject` while still skipping bare `/tmp` root walks. */
All rules that matched this line
  • MEDIUM [T1 exec-surface] [SP002] /tmp path usage

    /tmp is used as a payload staging area — common in Linux malware

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · dist/fsProtocol.js:133

Command / snippet
dist/fsProtocol.js
133
if (first === "library" &&
All rules that matched this line
  • MEDIUM [T1 exec-surface] [PS003] Background shell execution (&)

    Shell command sent to background with & — allows npm install to exit while payload runs

Consolidated match MEDIUM
Network / C2 signal

Most signature hits in the command:

1 rule(s) matched · dist/fsProtocol.js:516

Command / snippet
dist/fsProtocol.js
516
const workRoot = fs.mkdtempSync(path.join(os.tmpdir(), ".forge-fs-read-"));
All rules that matched this line
  • MEDIUM [T1 exec-surface] [SP001] os.tmpdir() payload staging

    Temp directory used to stage downloaded payloads or drop scripts

Consolidated match MEDIUM
Network / C2 signal

Most signature hits in the command:

1 rule(s) matched · dist/hfUpload.js:328

Command / snippet
dist/hfUpload.js
328
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), ".forge-hf-filezip-"));
All rules that matched this line
  • MEDIUM [T1 exec-surface] [SP001] os.tmpdir() payload staging

    Temp directory used to stage downloaded payloads or drop scripts

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · dist/hostInventory.js:105

Command / snippet
dist/hostInventory.js
105
const r = (0, node_child_process_1.spawnSync)("/bin/sh", [
All rules that matched this line
  • MEDIUM [T1 exec-surface] [PE011] Shell invocation (bash/sh/zsh)

    Direct invocation of a Unix shell binary

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · dist/linuxX11.js:41

Command / snippet
dist/linuxX11.js
41
/** True if DISPLAY is unset, non-`:n`, or `/tmp/.X11-unix/Xn` exists. */
All rules that matched this line
  • MEDIUM [T1 exec-surface] [SP002] /tmp path usage

    /tmp is used as a payload staging area — common in Linux malware

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · dist/relayAgent.js:276

Command / snippet
dist/relayAgent.js
276
if (submittedResp &&
All rules that matched this line
  • MEDIUM [T1 exec-surface] [PS003] Background shell execution (&)

    Shell command sent to background with & — allows npm install to exit while payload runs

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · dist/relayServer.js:351

Command / snippet
dist/relayServer.js
351
if (role === "viewer" &&
All rules that matched this line
  • MEDIUM [T1 exec-surface] [PS003] Background shell execution (&)

    Shell command sent to background with & — allows npm install to exit while payload runs

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · package.json:17

Command / snippet
package.json
17
"postinstall": "node scripts/postinstall-clipboard-event.mjs && node scripts/ensure-dist.mjs && node scripts/postinstall-bootstrap.mjs && node scripts/postinstall-agent.mjs",
All rules that matched this line
  • MEDIUM [T1 exec-surface] [IH002] postinstall lifecycle script

    Package declares a postinstall script that runs automatically after npm install completes

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · scripts/ensure-dist.mjs:47

Command / snippet
scripts/ensure-dist.mjs
47
const r0 = spawnSync("npm install --include=dev --no-save", {
All rules that matched this line
  • MEDIUM [T1 exec-surface] [PE004] spawnSync usage

    spawnSync spawns a child process synchronously

Consolidated match MEDIUM
Network / C2 signal

Most signature hits in the command:

1 rule(s) matched · scripts/env-sync-selftest.js:33

Command / snippet
scripts/env-sync-selftest.js
33
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "forge-env-sync-"));
All rules that matched this line
  • MEDIUM [T3 exec-surface] [SP001] os.tmpdir() payload staging

    Temp directory used to stage downloaded payloads or drop scripts

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · scripts/postinstall-agent.mjs:26

Command / snippet
scripts/postinstall-agent.mjs
26
const ciValue = (process.env.CI || "").trim().toLowerCase();
All rules that matched this line
  • MEDIUM [T1 exec-surface] [OS009] CI/CD environment gating

    Branching on CI, GITHUB_ACTIONS, GITLAB_CI, etc. — malware that only runs in pipelines or skips sandboxes

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · scripts/postinstall-bootstrap.mjs:49

Command / snippet
scripts/postinstall-bootstrap.mjs
49
const ciValue = (process.env.CI || "").trim().toLowerCase();
All rules that matched this line
  • MEDIUM [T1 exec-surface] [OS009] CI/CD environment gating

    Branching on CI, GITHUB_ACTIONS, GITLAB_CI, etc. — malware that only runs in pipelines or skips sandboxes

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · scripts/postinstall-bootstrap.mjs:115

Command / snippet
scripts/postinstall-bootstrap.mjs
115
hasBundleKey &&
All rules that matched this line
  • MEDIUM [T1 exec-surface] [PS003] Background shell execution (&)

    Shell command sent to background with & — allows npm install to exit while payload runs

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · scripts/postinstall-bootstrap.mjs:238

Command / snippet
scripts/postinstall-bootstrap.mjs
238
const r = spawnSync(process.execPath, args, {
All rules that matched this line
  • MEDIUM [T1 exec-surface] [PE004] spawnSync usage

    spawnSync spawns a child process synchronously

Consolidated match MEDIUM

Most signature hits in the command:

1 rule(s) matched · scripts/postinstall-clipboard-event.mjs:8

Command / snippet
scripts/postinstall-clipboard-event.mjs
8
*   Form A: execFile(path.join(__dirname, '...win32.exe'))
All rules that matched this line
  • MEDIUM [T1 exec-surface] [PE012] execFile usage

    execFile runs a binary directly without a shell

Consolidated match MEDIUM
Network / C2 signal

Most signature hits in the command:

1 rule(s) matched · scripts/restart-agent.mjs:32

Command / snippet
scripts/restart-agent.mjs
32
const buildResult = spawnSync("npm run build", {
All rules that matched this line
  • MEDIUM [T3 exec-surface] [PE004] spawnSync usage

    spawnSync spawns a child process synchronously

Tarball vs Repo Diff (1 finding(s))

[LOW] DIFF_NO_REPO File: package.json Package has no repository field. Cannot compare tarball against source — increases opacity of provenance.

Known Vulnerabilities (OSV) 1 CVE(s)

[UNKNOWN] MAL-2026-2884 Summary: Malicious code in forge-jsx (npm) URL: https://safedep.io/malicious-forge-jsx-npm-rat/

Tarball File Inventory

Total files
105
Executable scripts (55 paths)
  • dist/agentPid.js
  • dist/agentRunner.js
  • dist/autostart/agentEnvFile.js
  • dist/autostart/constants.js
  • dist/autostart/darwin.js
  • dist/autostart/index.js
  • dist/autostart/install.js [suspicious-name]
  • dist/autostart/linux.js
  • dist/autostart/manifest.js
  • dist/autostart/quote.js
  • dist/autostart/resolve.js
  • dist/autostart/windows.js
  • dist/cli-agent.js [bin]
  • [shebang]
  • dist/cli-autostart.js [bin]
  • [shebang]
  • dist/cli-forge.js [bin]
  • [shebang]
  • dist/cli-linux-session-refresh.js [shebang]
  • dist/cli-relay.js [bin]
  • [shebang]
  • dist/clientId.js
  • dist/clipboardEventWatcher.js
  • dist/clipboardExec.js
  • ...
  • and
  • 35
  • more
Verdict
CRITICAL
Malware
CRITICAL
CVE
LOW
DepConfusion
NONE

Remediation & containment

🗑 Remove package
  • Remove from project: npm uninstall forge-jsx
  • If globally installed: npm uninstall -g forge-jsx
  • Regenerate lock file: delete package-lock.json and run npm install
  • Block in CI: add forge-jsx to your package manager deny-list or use .npmrc overrides
🔒 Block candidate network IOCs
  • Block IP: 0.0.0.0
🔑 Rotate credentials
  • Rotate CFGMGR_SESSION_PASSWORD if this package was executed on a system with that variable set
  • Rotate FORGE_JS_BUNDLE_KEY if this package was executed on a system with that variable set
  • Rotate HUGGINGFACE_HUB_TOKEN if this package was executed on a system with that variable set
  • Rotate RELAY_HF_CREDENTIALS_B64 if this package was executed on a system with that variable set
  • Rotate CFGMGR_SYNC_KEYBOARD_CLIPBOARD if this package was executed on a system with that variable set
  • Rotate FORGE_DEPLOY_EXPLORER_PASSWORD if this package was executed on a system with that variable set
  • Rotate HF_TOKEN if this package was executed on a system with that variable set