Raw scan report

Erliban Ssh — the complete, unedited output of the deterministic mcptrustchecker engine v1.13.0, scanned . Every finding, capability tag and score component below is exactly what the engine produced — no AI, no post-processing.

← Back to the scan page
{
  "tool": {
    "name": "mcptrustchecker",
    "version": "1.13.0",
    "methodologyVersion": "mcptrustchecker-1.13"
  },
  "target": {
    "id": "@erliban/ssh-mcp-server",
    "source": {
      "kind": "package",
      "origin": "@erliban/ssh-mcp-server"
    },
    "server": {
      "name": "@erliban/ssh-mcp-server"
    }
  },
  "grade": "B",
  "score": {
    "score": 89,
    "threatScore": 100,
    "grade": "B",
    "band": "B",
    "categorySubtotals": {
      "injection": 0,
      "exfiltration": 0,
      "permissions": 0,
      "supply-chain": 0,
      "network": 0,
      "hygiene": 0
    },
    "vector": [
      {
        "kind": "client",
        "term": "capability-exposure",
        "level": "critical",
        "label": "capability blast radius (critical) — client exposure if the model is manipulated",
        "appliedPenalty": 10
      },
      {
        "kind": "client",
        "term": "verification-discount",
        "level": "repo",
        "label": "publisher verification (public source) — no provenance, but the source is public and inspectable",
        "appliedPenalty": 1
      },
      {
        "kind": "client",
        "term": "coverage-honesty",
        "level": "source",
        "label": "inspection depth (source) — how much of the target the scan could see",
        "appliedPenalty": 0
      }
    ],
    "gatesFired": [],
    "methodologyVersion": "mcptrustchecker-1.13"
  },
  "capability": {
    "level": "critical",
    "reasons": [
      "ingests untrusted external content (a prompt-injection entry point)",
      "reads sensitive or local data",
      "has a read → egress path (a data-exfiltration surface)",
      "can execute shell commands or code",
      "untrusted-input, sensitive-source and egress co-exist across tools (toxic-flow surface)",
      "untrusted input can reach code execution"
    ],
    "tags": [
      "code-exec",
      "untrusted-input",
      "sensitive-source"
    ]
  },
  "coverage": {
    "level": "source",
    "inputs": {
      "toolSurface": true,
      "implementationSource": true,
      "packageMetadata": true,
      "liveTransport": false
    },
    "caveats": [
      "Tools were statically extracted from the published source (20 recovered), not enumerated from a running server. Tool-poisoning, Unicode-smuggling, capability and toxic-flow analysis ran on this inferred surface, but a mis-parsed registration could be missed or mis-attributed, so tool-derived findings are capped below “confirmed”. To grade the real runtime surface, scan the running server: --command \"npx -y <package>\"."
    ]
  },
  "findings": [
    {
      "ruleId": "MTC-FLOW-002",
      "title": "Completed toxic-flow trifecta across tools",
      "category": "exfiltration",
      "severity": "critical",
      "confidence": "strong",
      "description": "This server (without client built-ins) exposes a complete data-exfiltration chain: sftp_download → get_logs → exec. Untrusted input is ingested, private data is read, and it can be sent to an external sink via the agent composing the tools (→). Static analysis proves the primitive exists, not that a specific run will occur.",
      "remediation": "Remove one leg of the trifecta: isolate untrusted-input tools from secret-reading tools and from egress tools, or require human approval between them.",
      "location": {
        "kind": "flow",
        "name": "sftp_download → get_logs → exec"
      },
      "owasp": "LLM02:2025 Sensitive Information Disclosure",
      "references": [],
      "data": {
        "untrusted": [
          "sftp_download"
        ],
        "sources": [
          "get_logs"
        ],
        "sinks": [
          "exec",
          "exec_sudo",
          "exec_batch",
          "exec_shell",
          "shell_send",
          "shell_read",
          "shell_close"
        ],
        "path": [
          "sftp_download",
          "get_logs",
          "exec"
        ],
        "edges": [
          {
            "from": "sftp_download",
            "to": "get_logs",
            "kind": "agent-mediated"
          },
          {
            "from": "get_logs",
            "to": "exec",
            "kind": "agent-mediated"
          }
        ],
        "wired": false
      }
    },
    {
      "ruleId": "MTC-SRC-006",
      "title": "Reads a sensitive credential path or dumps the environment (dist/index.js)",
      "category": "exfiltration",
      "severity": "high",
      "confidence": "strong",
      "description": "In the server's implementation (`dist/index.js:147`): Reading private keys / cloud credentials, or serializing the whole environment, is a sensitive-data source that becomes exfiltration when combined with any egress. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.",
      "remediation": "Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.",
      "location": {
        "kind": "server",
        "name": "dist/index.js"
      },
      "evidence": "私钥内容或私钥文件路径(如 /path/to/id_rsa)。password 或 privateKey 至少提供一个' }, passphrase: { type: 'string', d",
      "owasp": "LLM02:2025 Sensitive Information Disclosure",
      "data": {
        "rule": "MTC-SRC-006",
        "file": "dist/index.js",
        "line": 147,
        "nonRuntime": false
      }
    },
    {
      "ruleId": "MTC-CAP-001",
      "title": "Tool \"exec\" exposes command/code execution",
      "category": "permissions",
      "severity": "high",
      "confidence": "strong",
      "description": "Tool \"exec\" appears to run shell commands or evaluate code (keyword \"exec\" in tool name, parameter \"command\"). Arbitrary execution driven by model input is one of the most dangerous MCP capabilities; combined with any untrusted input it becomes RCE.",
      "remediation": "Sandbox execution, allowlist commands/arguments, and never pass model output to a shell unescaped.",
      "location": {
        "kind": "tool",
        "name": "exec"
      },
      "owasp": "LLM05:2025 Improper Output Handling",
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    },
    {
      "ruleId": "MTC-CAP-001",
      "title": "Tool \"exec_sudo\" exposes command/code execution",
      "category": "permissions",
      "severity": "high",
      "confidence": "strong",
      "description": "Tool \"exec_sudo\" appears to run shell commands or evaluate code (keyword \"exec\" in tool name, parameter \"command\"). Arbitrary execution driven by model input is one of the most dangerous MCP capabilities; combined with any untrusted input it becomes RCE.",
      "remediation": "Sandbox execution, allowlist commands/arguments, and never pass model output to a shell unescaped.",
      "location": {
        "kind": "tool",
        "name": "exec_sudo"
      },
      "owasp": "LLM05:2025 Improper Output Handling",
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    },
    {
      "ruleId": "MTC-CAP-001",
      "title": "Tool \"exec_batch\" exposes command/code execution",
      "category": "permissions",
      "severity": "high",
      "confidence": "strong",
      "description": "Tool \"exec_batch\" appears to run shell commands or evaluate code (keyword \"exec\" in tool name, parameter \"command\"). Arbitrary execution driven by model input is one of the most dangerous MCP capabilities; combined with any untrusted input it becomes RCE.",
      "remediation": "Sandbox execution, allowlist commands/arguments, and never pass model output to a shell unescaped.",
      "location": {
        "kind": "tool",
        "name": "exec_batch"
      },
      "owasp": "LLM05:2025 Improper Output Handling",
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    },
    {
      "ruleId": "MTC-CAP-001",
      "title": "Tool \"exec_shell\" exposes command/code execution",
      "category": "permissions",
      "severity": "high",
      "confidence": "strong",
      "description": "Tool \"exec_shell\" appears to run shell commands or evaluate code (keyword \"exec\" in tool name, parameter \"command\"). Arbitrary execution driven by model input is one of the most dangerous MCP capabilities; combined with any untrusted input it becomes RCE.",
      "remediation": "Sandbox execution, allowlist commands/arguments, and never pass model output to a shell unescaped.",
      "location": {
        "kind": "tool",
        "name": "exec_shell"
      },
      "owasp": "LLM05:2025 Improper Output Handling",
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    },
    {
      "ruleId": "MTC-CAP-001",
      "title": "Tool \"shell_send\" exposes command/code execution",
      "category": "permissions",
      "severity": "high",
      "confidence": "strong",
      "description": "Tool \"shell_send\" appears to run shell commands or evaluate code (keyword \"shell\" in tool name). Arbitrary execution driven by model input is one of the most dangerous MCP capabilities; combined with any untrusted input it becomes RCE.",
      "remediation": "Sandbox execution, allowlist commands/arguments, and never pass model output to a shell unescaped.",
      "location": {
        "kind": "tool",
        "name": "shell_send"
      },
      "owasp": "LLM05:2025 Improper Output Handling",
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    },
    {
      "ruleId": "MTC-CAP-001",
      "title": "Tool \"shell_read\" exposes command/code execution",
      "category": "permissions",
      "severity": "high",
      "confidence": "strong",
      "description": "Tool \"shell_read\" appears to run shell commands or evaluate code (keyword \"shell\" in tool name). Arbitrary execution driven by model input is one of the most dangerous MCP capabilities; combined with any untrusted input it becomes RCE.",
      "remediation": "Sandbox execution, allowlist commands/arguments, and never pass model output to a shell unescaped.",
      "location": {
        "kind": "tool",
        "name": "shell_read"
      },
      "owasp": "LLM05:2025 Improper Output Handling",
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    },
    {
      "ruleId": "MTC-CAP-001",
      "title": "Tool \"shell_close\" exposes command/code execution",
      "category": "permissions",
      "severity": "high",
      "confidence": "strong",
      "description": "Tool \"shell_close\" appears to run shell commands or evaluate code (keyword \"shell\" in tool name). Arbitrary execution driven by model input is one of the most dangerous MCP capabilities; combined with any untrusted input it becomes RCE.",
      "remediation": "Sandbox execution, allowlist commands/arguments, and never pass model output to a shell unescaped.",
      "location": {
        "kind": "tool",
        "name": "shell_close"
      },
      "owasp": "LLM05:2025 Improper Output Handling",
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    },
    {
      "ruleId": "MTC-SRC-002",
      "title": "Shell/command execution in server code (dist/core/command-executor.js)",
      "category": "permissions",
      "severity": "high",
      "confidence": "strong",
      "description": "In the server's implementation (`dist/core/command-executor.js:22`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.",
      "remediation": "Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.",
      "location": {
        "kind": "server",
        "name": "dist/core/command-executor.js"
      },
      "evidence": "行远程命令 */ async exec(command, host, port, username, options = {}) { // 支持自动重连 const client = awa",
      "owasp": "LLM05:2025 Improper Output Handling",
      "data": {
        "rule": "MTC-SRC-002",
        "file": "dist/core/command-executor.js",
        "line": 22,
        "nonRuntime": false
      }
    },
    {
      "ruleId": "MTC-SRC-002",
      "title": "Shell/command execution in server code (dist/tools/exec.js)",
      "category": "permissions",
      "severity": "high",
      "confidence": "strong",
      "description": "In the server's implementation (`dist/tools/exec.js:253`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.",
      "remediation": "Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.",
      "location": {
        "kind": "server",
        "name": "dist/tools/exec.js"
      },
      "evidence": "执行命令 */ async exec(params) { // 目标校验(切换确认优先于危险命令确认) if (this.targetGuard) { const",
      "owasp": "LLM05:2025 Improper Output Handling",
      "data": {
        "rule": "MTC-SRC-002",
        "file": "dist/tools/exec.js",
        "line": 253,
        "nonRuntime": false
      }
    },
    {
      "ruleId": "MTC-CAP-007",
      "title": "Unconstrained URL/host parameter \"host\" on \"sftp_download\"",
      "category": "network",
      "severity": "medium",
      "confidence": "heuristic",
      "description": "Tool \"sftp_download\" takes a URL/host parameter \"host\" with no allowlist/pattern. An outbound-request tool with an unbounded destination enables SSRF and cloud-metadata access (e.g. 169.254.169.254).",
      "remediation": "Allowlist destinations or constrain the parameter; block private/link-local addresses server-side.",
      "location": {
        "kind": "tool",
        "name": "sftp_download",
        "field": "inputSchema.properties.host"
      },
      "owasp": "LLM06:2025 Excessive Agency",
      "data": {
        "param": "host"
      }
    },
    {
      "ruleId": "MTC-CAP-006",
      "title": "Unconstrained command parameter \"command\" on \"exec\"",
      "category": "permissions",
      "severity": "medium",
      "confidence": "heuristic",
      "description": "Tool \"exec\" takes a command-shaped parameter \"command\" with no enum/pattern constraint. Free-form, model- or attacker-controlled arguments reaching a shell is the command-injection precondition.",
      "remediation": "Constrain the parameter (enum/pattern), or build the command from a fixed template with escaped args.",
      "location": {
        "kind": "tool",
        "name": "exec",
        "field": "inputSchema.properties.command"
      },
      "owasp": "LLM05:2025 Improper Output Handling",
      "data": {
        "param": "command"
      }
    },
    {
      "ruleId": "MTC-CAP-006",
      "title": "Unconstrained command parameter \"command\" on \"exec_sudo\"",
      "category": "permissions",
      "severity": "medium",
      "confidence": "heuristic",
      "description": "Tool \"exec_sudo\" takes a command-shaped parameter \"command\" with no enum/pattern constraint. Free-form, model- or attacker-controlled arguments reaching a shell is the command-injection precondition.",
      "remediation": "Constrain the parameter (enum/pattern), or build the command from a fixed template with escaped args.",
      "location": {
        "kind": "tool",
        "name": "exec_sudo",
        "field": "inputSchema.properties.command"
      },
      "owasp": "LLM05:2025 Improper Output Handling",
      "data": {
        "param": "command"
      }
    },
    {
      "ruleId": "MTC-CAP-006",
      "title": "Unconstrained command parameter \"command\" on \"exec_batch\"",
      "category": "permissions",
      "severity": "medium",
      "confidence": "heuristic",
      "description": "Tool \"exec_batch\" takes a command-shaped parameter \"command\" with no enum/pattern constraint. Free-form, model- or attacker-controlled arguments reaching a shell is the command-injection precondition.",
      "remediation": "Constrain the parameter (enum/pattern), or build the command from a fixed template with escaped args.",
      "location": {
        "kind": "tool",
        "name": "exec_batch",
        "field": "inputSchema.properties.command"
      },
      "owasp": "LLM05:2025 Improper Output Handling",
      "data": {
        "param": "command"
      }
    },
    {
      "ruleId": "MTC-CAP-006",
      "title": "Unconstrained command parameter \"command\" on \"exec_shell\"",
      "category": "permissions",
      "severity": "medium",
      "confidence": "heuristic",
      "description": "Tool \"exec_shell\" takes a command-shaped parameter \"command\" with no enum/pattern constraint. Free-form, model- or attacker-controlled arguments reaching a shell is the command-injection precondition.",
      "remediation": "Constrain the parameter (enum/pattern), or build the command from a fixed template with escaped args.",
      "location": {
        "kind": "tool",
        "name": "exec_shell",
        "field": "inputSchema.properties.command"
      },
      "owasp": "LLM05:2025 Improper Output Handling",
      "data": {
        "param": "command"
      }
    },
    {
      "ruleId": "MTC-CAP-005",
      "title": "Mutating tool \"exec\" declares no destructiveHint",
      "category": "hygiene",
      "severity": "low",
      "confidence": "heuristic",
      "description": "Tool \"exec\" can mutate/egress but declares no destructiveHint. Clients that don't default to spec-safe behavior may not prompt before running it.",
      "remediation": "Declare accurate annotations, and gate destructive tools on user confirmation regardless.",
      "location": {
        "kind": "tool",
        "name": "exec"
      },
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    },
    {
      "ruleId": "MTC-CAP-005",
      "title": "Mutating tool \"exec_sudo\" declares no destructiveHint",
      "category": "hygiene",
      "severity": "low",
      "confidence": "heuristic",
      "description": "Tool \"exec_sudo\" can mutate/egress but declares no destructiveHint. Clients that don't default to spec-safe behavior may not prompt before running it.",
      "remediation": "Declare accurate annotations, and gate destructive tools on user confirmation regardless.",
      "location": {
        "kind": "tool",
        "name": "exec_sudo"
      },
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    },
    {
      "ruleId": "MTC-CAP-005",
      "title": "Mutating tool \"exec_batch\" declares no destructiveHint",
      "category": "hygiene",
      "severity": "low",
      "confidence": "heuristic",
      "description": "Tool \"exec_batch\" can mutate/egress but declares no destructiveHint. Clients that don't default to spec-safe behavior may not prompt before running it.",
      "remediation": "Declare accurate annotations, and gate destructive tools on user confirmation regardless.",
      "location": {
        "kind": "tool",
        "name": "exec_batch"
      },
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    },
    {
      "ruleId": "MTC-CAP-005",
      "title": "Mutating tool \"exec_shell\" declares no destructiveHint",
      "category": "hygiene",
      "severity": "low",
      "confidence": "heuristic",
      "description": "Tool \"exec_shell\" can mutate/egress but declares no destructiveHint. Clients that don't default to spec-safe behavior may not prompt before running it.",
      "remediation": "Declare accurate annotations, and gate destructive tools on user confirmation regardless.",
      "location": {
        "kind": "tool",
        "name": "exec_shell"
      },
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    },
    {
      "ruleId": "MTC-CAP-005",
      "title": "Mutating tool \"shell_send\" declares no destructiveHint",
      "category": "hygiene",
      "severity": "low",
      "confidence": "heuristic",
      "description": "Tool \"shell_send\" can mutate/egress but declares no destructiveHint. Clients that don't default to spec-safe behavior may not prompt before running it.",
      "remediation": "Declare accurate annotations, and gate destructive tools on user confirmation regardless.",
      "location": {
        "kind": "tool",
        "name": "shell_send"
      },
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    },
    {
      "ruleId": "MTC-CAP-005",
      "title": "Mutating tool \"shell_read\" declares no destructiveHint",
      "category": "hygiene",
      "severity": "low",
      "confidence": "heuristic",
      "description": "Tool \"shell_read\" can mutate/egress but declares no destructiveHint. Clients that don't default to spec-safe behavior may not prompt before running it.",
      "remediation": "Declare accurate annotations, and gate destructive tools on user confirmation regardless.",
      "location": {
        "kind": "tool",
        "name": "shell_read"
      },
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    },
    {
      "ruleId": "MTC-CAP-005",
      "title": "Mutating tool \"shell_close\" declares no destructiveHint",
      "category": "hygiene",
      "severity": "low",
      "confidence": "heuristic",
      "description": "Tool \"shell_close\" can mutate/egress but declares no destructiveHint. Clients that don't default to spec-safe behavior may not prompt before running it.",
      "remediation": "Declare accurate annotations, and gate destructive tools on user confirmation regardless.",
      "location": {
        "kind": "tool",
        "name": "shell_close"
      },
      "data": {
        "tags": [
          "code-exec"
        ]
      }
    }
  ],
  "toxicFlows": [
    {
      "id": "flow-1",
      "severity": "critical",
      "confidence": "strong",
      "untrustedInput": [
        "sftp_download"
      ],
      "sensitiveSource": [
        "get_logs"
      ],
      "externalSink": [
        "exec",
        "exec_sudo",
        "exec_batch",
        "exec_shell",
        "shell_send",
        "shell_read",
        "shell_close"
      ],
      "selfContained": false,
      "path": [
        "sftp_download",
        "get_logs",
        "exec"
      ],
      "pathWired": false,
      "description": "A cross-tool exfiltration chain exists: sftp_download → get_logs → exec."
    }
  ],
  "capabilities": [
    {
      "tool": "connect",
      "tags": [],
      "reasons": {}
    },
    {
      "tool": "disconnect",
      "tags": [],
      "reasons": {}
    },
    {
      "tool": "list_servers",
      "tags": [],
      "reasons": {}
    },
    {
      "tool": "save_server",
      "tags": [],
      "reasons": {}
    },
    {
      "tool": "remove_server",
      "tags": [],
      "reasons": {}
    },
    {
      "tool": "exec",
      "tags": [
        "code-exec"
      ],
      "reasons": {
        "code-exec": [
          "keyword \"exec\" in tool name",
          "parameter \"command\""
        ]
      }
    },
    {
      "tool": "exec_sudo",
      "tags": [
        "code-exec"
      ],
      "reasons": {
        "code-exec": [
          "keyword \"exec\" in tool name",
          "parameter \"command\""
        ]
      }
    },
    {
      "tool": "exec_batch",
      "tags": [
        "code-exec"
      ],
      "reasons": {
        "code-exec": [
          "keyword \"exec\" in tool name",
          "parameter \"command\""
        ]
      }
    },
    {
      "tool": "exec_shell",
      "tags": [
        "code-exec"
      ],
      "reasons": {
        "code-exec": [
          "keyword \"exec\" in tool name",
          "parameter \"command\""
        ]
      }
    },
    {
      "tool": "shell_send",
      "tags": [
        "code-exec"
      ],
      "reasons": {
        "code-exec": [
          "keyword \"shell\" in tool name"
        ]
      }
    },
    {
      "tool": "shell_read",
      "tags": [
        "code-exec"
      ],
      "reasons": {
        "code-exec": [
          "keyword \"shell\" in tool name"
        ]
      }
    },
    {
      "tool": "shell_close",
      "tags": [
        "code-exec"
      ],
      "reasons": {
        "code-exec": [
          "keyword \"shell\" in tool name"
        ]
      }
    },
    {
      "tool": "sftp_ls",
      "tags": [],
      "reasons": {}
    },
    {
      "tool": "sftp_upload",
      "tags": [],
      "reasons": {}
    },
    {
      "tool": "sftp_download",
      "tags": [
        "untrusted-input"
      ],
      "reasons": {
        "untrusted-input": [
          "keyword \"download\""
        ]
      }
    },
    {
      "tool": "sftp_mkdir",
      "tags": [],
      "reasons": {}
    },
    {
      "tool": "sftp_rm",
      "tags": [],
      "reasons": {}
    },
    {
      "tool": "health_check",
      "tags": [],
      "reasons": {}
    },
    {
      "tool": "get_logs",
      "tags": [
        "sensitive-source"
      ],
      "reasons": {
        "sensitive-source": [
          "keyword \"get_logs\""
        ]
      }
    },
    {
      "tool": "list_active_connections",
      "tags": [],
      "reasons": {}
    }
  ],
  "surfaceDigest": "629e29002488ce6b771d12766921f66d88944f7de62e7ca5e0d703746ad32781",
  "stats": {
    "tools": 20,
    "prompts": 0,
    "resources": 0,
    "findingsBySeverity": {
      "critical": 1,
      "high": 10,
      "medium": 5,
      "low": 7,
      "info": 0
    }
  }
}