Back to skill

Security audit

Cherry Mcp

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a real MCP-to-HTTP bridge, but it exposes powerful tool calls and restarts without authentication and handles secrets too loosely.

Review before installing. Use this only on a tightly controlled machine, keep it bound to localhost or protected behind real authentication, restrict CORS, avoid exposing it to a network, pin and review all MCP server packages, and do not store API keys in config.json. Run it under a low-privilege account with minimal environment variables.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
Findings (5)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
bridge.js:143
Finding

Unauthenticated MCP Tool Invocation and Server Restart

Content
View full analysis
srv.start(), 500); res.writeHead(200, { 'Content-Type': 'application/json' }); ...[truncated 2245 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
bridge.js:177
Finding

Unbounded HTTP Request Body Permits Memory Exhaustion

Content
View full analysis
/call`. 3. The attacker sends a very large body or continuously streams body data without completing the request. 4. The bridge accumulates every chunk in the `body` string. 5. Memory consumption grows until the process becomes unresponsive, is terminated by the runtime, or affects other services on the host. ### Impact Assessment A reachable unauthenticated attacker can degrade or terminate the bridge and all MCP services accessed through it. Concurrent oversized or slow requests may also consume host memory and file descriptors, potentially affecting unrelated processes running under the s ...[truncated 44 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
bridge.js:52
Finding

MCP Child Processes Inherit the Entire Parent Environment

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
cli.js:19
Finding

Secrets Are Persisted and Displayed in Plaintext

Content
View full analysis
{ const [server, key, value] = args; if (!server || !key || !value) { console.log('Usage: set-env '); return; } const config = load(); if (!config.servers[server]) return console.log(`✗ Server '${server}' not found`); config.servers[server].env = config.servers[server].env || {}; config.servers[server].env[key] = value; save(config); console.log(`✓ Set ${key} for '${server}'`); }, ``` ```js 'show-config': () => { console.log(JSON.stringify(load(), null, 2)); }, ``` ### Technical Analysis The `set-env` command stores supplied values directly in `config.json`. The save operation does not explicitly create or enforce restrictive permissions such as mode `0600`. Existing permissive permissions are also not corrected. The `show-config` command serializes the complete configuration without redacting environment values. Secrets can consequently appear in terminal history capture, CI logs, support transcripts, process output collection, or screen recordings. Although the documentation warns users that values are stored in plaintext, disclosure does not remove the underlying risk. ### Attack Path 1. An operator executes `set-env` with an API token, password, or other secret. 2. The CLI writes the value into `config.json` in plaintext. 3. A local user, backup process, source-control operation, or other process reads the configuration file. 4. Alternatively, an operator runs `show-config`, causing all stored values to be printed. 5. The exposed credential is reused against the corresponding external service. ### Impact Assessment An attacker wh ...[truncated 407 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:31
Finding

Documentation Recommends Unpinned Runtime Package Execution Through npx

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (14)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · bridge.js (reported line 57)May include surrounding context.

js
console.log(`[${this.name}] Starting: ${command} ${args.join(' ')}`);

    this.process = spawn(command, args, {
      env: { ...process.env, ...env },
      stdio: ['pipe', 'pipe', 'pipe']
    });

Credential Access

High
Category
Privilege Escalation
Confidence
91% confidence
Finding

This finding reflects credential handling behavior: the code accepts env values—likely secrets—and persists them to disk in plaintext under the server configuration. In the context of an HTTP bridge for MCP tools, those credentials may grant access to external APIs, repositories, or internal systems, so disclosure can have significant downstream impact.

Content

Scanner excerpt · cli.js (reported line 70)May include surrounding context.

js
}
    const config = load();
    if (!config.servers[server]) return console.log(`✗ Server '${server}' not found`);
    config.servers[server].env = config.servers[server].env || {};
    config.servers[server].env[key] = value;
    save(config);
    console.log(`✓ Set ${key} for '${server}'`);

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill advertises network and environment-related capabilities but does not declare any explicit tool scope or permissions boundaries. In an agent ecosystem, this weakens reviewability and least-privilege guarantees, making it easier for the skill to access sensitive env data or perform network actions without clear operator consent.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding

Using npx @anthropic/mcp-github without pinning an exact version makes the deployed MCP server supply-chain mutable at runtime. A future malicious or compromised package release could be fetched and executed automatically, which is especially risky here because the bridge persists child processes and can pass through environment secrets such as API tokens.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 65)May include surrounding context.

bash
# List servers
curl http://localhost:3456/

# List tools
curl http://localhost:3456/<server>/tools

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
77% confidence
Finding

The bridge launches configured commands as child processes, inheriting the host environment and allowing custom environment overrides. While starting MCP servers is part of the bridge's implementation, arbitrary command execution is a powerful capability that is broader than a simple REST exposure layer unless explicitly declared in the skill scope.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The POST /:server/call endpoint allows remote invocation of any MCP tool without authentication, authorization, or meaningful user confirmation. Because MCP tools may perform sensitive local or network actions, this bridge effectively turns them into remotely callable capabilities, which is especially dangerous combined with permissive CORS and optional IP filtering.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The bridge exposes an unauthenticated POST /:server/restart endpoint that allows any reachable client to stop and restart managed subprocesses. In this skill’s context, the bridge is intended to keep MCP servers alive and expose tools via HTTP, so exposing lifecycle control over REST materially expands the attack surface and enables denial of service or operational disruption.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The CLI stores arbitrary environment-variable values directly into config.json on disk, which will commonly include API keys, tokens, or other secrets for MCP servers. If file permissions are weak, backups are exposed, or the config is accidentally committed or shared, attackers can recover credentials and pivot into connected services.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

show-config prints the entire configuration object, including per-server env values, directly to stdout. This can leak secrets into terminal scrollback, logs, shell history captures, CI output, or remote support sessions, making credential disclosure easy even without filesystem access.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The manifest describes a bridge that keeps MCP servers alive and exposes them over REST, but this CLI also invokes a host process manager command to restart a named service. Managing local system processes through pm2 is a privileged operational capability that goes beyond simple bridge configuration and is not explicitly stated in the manifest description.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The restart endpoint performs process control over managed MCP servers without any user-facing disclosure or access control. While the absence of disclosure alone is not the core issue, in practice this exposes administrative functionality to any reachable client and can be used to interrupt service or force repeated reinitialization.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

The remove-server command deletes a configured server entry from config.json immediately after invocation. Although successful deletion is logged afterward, there is no prior confirmation prompt or warning for this destructive action, and the help text does not call out that the change is immediate.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
bridge.js:56

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
cli.js:119