network-ai
Ecosystem: npm
Downloads: 7.03 K
- 2CriticalAffects 2 versions
- 3HighAffects 3 versions
- 0MediumAffects 0 versions
- 4ModerateAffects 4 versions
- 0LowAffects 0 versions
- Critical2 (22.2%)
- High3 (33.3%)
- Medium0 (0.0%)
- Moderate4 (44.4%)
- Low0 (0.0%)
Monthly breakdown
- Critical
- High
- Medium
- Moderate
- Low
- 7 vulnerabilities
- Critical: 2
- High: 1
- Medium: 0
- Moderate: 4
- Low: 0
- 2 vulnerabilities
- Critical: 0
- High: 2
- Medium: 0
- Moderate: 0
- Low: 0
Vulnerabilities (9)
Known vulnerabilities affecting network-ai, based on data from OSV.
| ID | Severity | Summary | Affected versions | Published | Source |
|---|---|---|---|---|---|
| GHSA-2fmp-9rvw-hc96 | High | Network-AI: Poisoned environment backup manifest allows arbitrary recursive deletion during backup pruning### Summary `EnvironmentManager.listBackups()` reads each backup's `_manifest.json` and trusts the manifest's `path` field. `EnvironmentManager.pruneBackups()` later passes that trusted `entry.path` directly to `rmSync(entry.path, { recursive: true, force: true })`. An attacker who can place or modify a manifest inside `data/<env>/.backups/<name>/_manifest.json` can cause `network-ai env backup prune --env <env> --keep <n>` or any code path invoking `pruneBackups()` to recursively delete an arbitrary path accessible to the Network-AI process user. Confirmed in Network-AI 5.12.1. ### Details |
| GitHub (opens in a new tab) | |
| GHSA-48x2-6pr9-2jjf | Moderate | Network-AI: EnvironmentManager.restore() backup ID path traversal copies arbitrary directories into environment data### Summary `EnvironmentManager.restore(env, backupId)` computes the backup path with `join(envDir, '.backups', backupId)` and only checks that this path exists. It does not resolve the result or verify that it remains under `data/<env>/.backups`. A caller can pass a traversal backup ID such as `../../../outside/source-dir` to restore files from an arbitrary directory into the target environment data directory. Confirmed in Network-AI 5.12.1. ### Details `restore()` builds `backupPath` directly from caller-controlled `backupId`: ```ts restore(env: EnvName, backupId: string): RestoreResult { |
| GitHub (opens in a new tab) | |
| GHSA-6x2m-p4xp-wg22 | Moderate | Network-AI: EnvironmentManager.backup() follows symlinked directories and copies files outside the environment root into backups### Summary `EnvironmentManager.backup()` recursively collects files using `_collectBackupFiles()`. `_collectBackupFiles()` uses `statSync(full)`, which follows symlinks. If `data/<env>` contains a symlink to a directory outside the environment root, backup recursion follows the symlink and copies external files into `data/<env>/.backups/<backupId>/`. An attacker who can place a symlink under the environment data directory can cause backup operations to disclose files outside the environment root into backup artifacts. Confirmed in Network-AI 5.12.1. ### Details `backup()` collects file path |
| GitHub (opens in a new tab) | |
| GHSA-jvcm-f35g-w78p | Moderate | Network-AI: AgentRuntime sandbox path-prefix checks allow file access outside the configured base directory### Summary `AgentRuntime` promises scoped file access under a configured sandbox `basePath`, but its path containment checks use raw string prefix tests. A sandbox base such as `/tmp/network-ai-sandbox` also matches a sibling path such as `/tmp/network-ai-sandbox_evil/secret.txt`. An agent/user that can call `AgentRuntime.readFile()` or `AgentRuntime.listDir()` can read or list files outside the intended sandbox when the target path is in a sibling directory sharing the base path prefix. This breaks the documented sandbox boundary. Confirmed in Network-AI 5.12.1. Severity: Medium, CVSS 3.1 v |
| GitHub (opens in a new tab) | |
| GHSA-mxjx-28vx-xjjj | Moderate | Network-AI: ApprovalInbox HTTP server has no authentication — anyone can approve pending agent actions## Summary `network-ai`'s `ApprovalInbox` (`lib/approval-inbox.ts`) is a shipped, exported, documented feature — *"a web-accessible approval queue with REST API … and SSE streaming"* (SECURITY.md). It is the network surface of the **human-in-the-loop Approval Gate**, which `ApprovalGate` uses to require explicit human approval for *"high-risk operations (writes, shell commands, budget spend)"* (SECURITY.md). The HTTP server it exposes has **no authentication of any kind** and sets **`Access-Control-Allow-Origin: *`** on every route, including the state-changing `POST /approvals/:id/approve` a |
| GitHub (opens in a new tab) | |
| GHSA-qw6v-5fcf-5666 | Critical | 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. |
| GitHub (opens in a new tab) | |
| GHSA-r78r-rwrf-rjwp | Critical | Network-AI: CVE-2026-46701 fix incomplete — empty default secret still authorizes all requests## Advisory / Disclosure # Network-AI — CVE-2026-46701 fix is incomplete: the "Empty Default Secret" unauth path survives **Target:** Jovancoding/Network-AI (npm `network-ai`), **latest v5.7.1** **Status:** the advisory ("Unauthenticated Cross-Origin MCP Tool Invocation via Empty Default Secret") named three flaws. The fix (5.4.5) closed the **CORS** flaw (`Access-Control-Allow-Origin` is now set only for localhost origins), but left the **empty-default-secret** flaw the title is about: the SSE MCP server still defaults to an empty secret, `_isAuthorized()` still returns `true` when the secr |
| GitHub (opens in a new tab) | |
| GHSA-j3vx-cx2r-pvg8 | High | Network-AI: Unauthenticated Cross-Origin MCP Tool Invocation via Empty Default Secret# Unauthenticated Cross-Origin MCP Tool Invocation via Empty Default Secret | Field | Value | | ---------------- | ----- | | Repository | Jovancoding/Network-AI | | Affected version | v5.4.4 (commit c12686e181f231cf8d7bcf836a96d78f0f0877ac) | ## Summary The MCP SSE server defaults to an empty secret (`process.env['NETWORK_AI_MCP_SECRET'] ?? ''` at `bin/mcp-server.ts:89`), which causes `_isAuthorized` (`lib/mcp-transport-sse.ts:254`) to return `true` unconditionally for every request — no `Authorization` header is required. Simultaneously, `_handleRequest` sets `Access-Contr |
| GitHub (opens in a new tab) | |
| GHSA-fj4g-2p96-q6m3 | High | Network-AI missing authentication on MCP HTTP endpoint, which allows unauthenticated privileged tool calls# Security Advisory: Missing Authentication for Critical Function in `Jovancoding/Network-AI` | Field | Value | |---|---| | Project | `Jovancoding/Network-AI` | | Repository | https://github.com/Jovancoding/Network-AI | | Affected commit | `c344f2053eb0d49395988f803bf92f2a86b2a0d0` | | Affected tested version | `5.1.2` | | Vulnerability type | CWE-306: Missing Authentication for Critical Function | | Severity | High | | Authentication required | None | | Default network exposure | Bind address `0.0.0.0` | | Reporter validation date | 2026-04-21 | ## Summary The MCP HTTP transport accepts JS |
| GitHub (opens in a new tab) |
- GHSA-2fmp-9rvw-hc96HighNetwork-AI: Poisoned environment backup manifest allows arbitrary recursive deletion during backup pruning
< 5.12.2
### Summary `EnvironmentManager.listBackups()` reads each backup's `_manifest.json` and trusts the manifest's `path` field. `EnvironmentManager.pruneBackups()` later passes that trusted `entry.path` directly to `rmSync(entry.path, { recursive: true, force: true })`. An attacker who can place or modify a manifest inside `data/<env>/.backups/<name>/_manifest.json` can cause `network-ai env backup prune --env <env> --keep <n>` or any code path invoking `pruneBackups()` to recursively delete an arbitrary path accessible to the Network-AI process user. Confirmed in Network-AI 5.12.1. ### Details
CVE: CVE-2026-58484
- GHSA-48x2-6pr9-2jjfModerateNetwork-AI: EnvironmentManager.restore() backup ID path traversal copies arbitrary directories into environment data
< 5.12.2
### Summary `EnvironmentManager.restore(env, backupId)` computes the backup path with `join(envDir, '.backups', backupId)` and only checks that this path exists. It does not resolve the result or verify that it remains under `data/<env>/.backups`. A caller can pass a traversal backup ID such as `../../../outside/source-dir` to restore files from an arbitrary directory into the target environment data directory. Confirmed in Network-AI 5.12.1. ### Details `restore()` builds `backupPath` directly from caller-controlled `backupId`: ```ts restore(env: EnvName, backupId: string): RestoreResult {
CVE: CVE-2026-58413
- GHSA-6x2m-p4xp-wg22ModerateNetwork-AI: EnvironmentManager.backup() follows symlinked directories and copies files outside the environment root into backups
< 5.12.2
### Summary `EnvironmentManager.backup()` recursively collects files using `_collectBackupFiles()`. `_collectBackupFiles()` uses `statSync(full)`, which follows symlinks. If `data/<env>` contains a symlink to a directory outside the environment root, backup recursion follows the symlink and copies external files into `data/<env>/.backups/<backupId>/`. An attacker who can place a symlink under the environment data directory can cause backup operations to disclose files outside the environment root into backup artifacts. Confirmed in Network-AI 5.12.1. ### Details `backup()` collects file path
CVE: CVE-2026-58414
- GHSA-jvcm-f35g-w78pModerateNetwork-AI: AgentRuntime sandbox path-prefix checks allow file access outside the configured base directory
< 5.12.2
### Summary `AgentRuntime` promises scoped file access under a configured sandbox `basePath`, but its path containment checks use raw string prefix tests. A sandbox base such as `/tmp/network-ai-sandbox` also matches a sibling path such as `/tmp/network-ai-sandbox_evil/secret.txt`. An agent/user that can call `AgentRuntime.readFile()` or `AgentRuntime.listDir()` can read or list files outside the intended sandbox when the target path is in a sibling directory sharing the base path prefix. This breaks the documented sandbox boundary. Confirmed in Network-AI 5.12.1. Severity: Medium, CVSS 3.1 v
CVE: CVE-2026-58481
- GHSA-mxjx-28vx-xjjjModerateNetwork-AI: ApprovalInbox HTTP server has no authentication — anyone can approve pending agent actions
>= 5.0.0, < 5.12.2
## Summary `network-ai`'s `ApprovalInbox` (`lib/approval-inbox.ts`) is a shipped, exported, documented feature — *"a web-accessible approval queue with REST API … and SSE streaming"* (SECURITY.md). It is the network surface of the **human-in-the-loop Approval Gate**, which `ApprovalGate` uses to require explicit human approval for *"high-risk operations (writes, shell commands, budget spend)"* (SECURITY.md). The HTTP server it exposes has **no authentication of any kind** and sets **`Access-Control-Allow-Origin: *`** on every route, including the state-changing `POST /approvals/:id/approve` a
CVE: CVE-2026-58482
- GHSA-qw6v-5fcf-5666CriticalNetwork-AI: Improper Neutralization of Special Elements used in an OS Command
< 5.9.1
## 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.
CVE: CVE-2026-54051
- GHSA-r78r-rwrf-rjwpCriticalNetwork-AI: CVE-2026-46701 fix incomplete — empty default secret still authorizes all requests
< 5.7.2
## Advisory / Disclosure # Network-AI — CVE-2026-46701 fix is incomplete: the "Empty Default Secret" unauth path survives **Target:** Jovancoding/Network-AI (npm `network-ai`), **latest v5.7.1** **Status:** the advisory ("Unauthenticated Cross-Origin MCP Tool Invocation via Empty Default Secret") named three flaws. The fix (5.4.5) closed the **CORS** flaw (`Access-Control-Allow-Origin` is now set only for localhost origins), but left the **empty-default-secret** flaw the title is about: the SSE MCP server still defaults to an empty secret, `_isAuthorized()` still returns `true` when the secr
CVE: CVE-2026-48814
- GHSA-j3vx-cx2r-pvg8HighNetwork-AI: Unauthenticated Cross-Origin MCP Tool Invocation via Empty Default Secret
< 5.4.5
# Unauthenticated Cross-Origin MCP Tool Invocation via Empty Default Secret | Field | Value | | ---------------- | ----- | | Repository | Jovancoding/Network-AI | | Affected version | v5.4.4 (commit c12686e181f231cf8d7bcf836a96d78f0f0877ac) | ## Summary The MCP SSE server defaults to an empty secret (`process.env['NETWORK_AI_MCP_SECRET'] ?? ''` at `bin/mcp-server.ts:89`), which causes `_isAuthorized` (`lib/mcp-transport-sse.ts:254`) to return `true` unconditionally for every request — no `Authorization` header is required. Simultaneously, `_handleRequest` sets `Access-Contr
CVE: CVE-2026-46701
- GHSA-fj4g-2p96-q6m3HighNetwork-AI missing authentication on MCP HTTP endpoint, which allows unauthenticated privileged tool calls
< 5.1.3
# Security Advisory: Missing Authentication for Critical Function in `Jovancoding/Network-AI` | Field | Value | |---|---| | Project | `Jovancoding/Network-AI` | | Repository | https://github.com/Jovancoding/Network-AI | | Affected commit | `c344f2053eb0d49395988f803bf92f2a86b2a0d0` | | Affected tested version | `5.1.2` | | Vulnerability type | CWE-306: Missing Authentication for Critical Function | | Severity | High | | Authentication required | None | | Default network exposure | Bind address `0.0.0.0` | | Reporter validation date | 2026-04-21 | ## Summary The MCP HTTP transport accepts JS
CVE: CVE-2026-42856