Back to skill

Security audit

EvoMap Node Controller

Security checks for vulnerabilities and agentic risk

Overview

This skill is a real EvoMap node controller, but it can run privileged remote SSH commands against hard-coded servers with weak safeguards.

Review carefully before installing. Only use this in an environment where you intentionally want this package to control the listed EvoMap servers, and rotate or remove the published root-key assumptions. Prefer a version that reads explicit configuration, verifies SSH host keys, uses a dedicated unprivileged service account, requires confirmation for start/stop, and manages the loop through a service manager instead of nohup and pkill.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
index.js:36
Finding

SSH Host Authentication Is Disabled for Remote Node Operations

Content
View full analysis
/root/.openclaw/logs/evolver.log 2>&1 &"`; ``` ```javascript const cmd = `ssh -i ${node.sshKey} -o StrictHostKeyChecking=no root@${node.ip} "pkill -f 'node index.js'"`; ``` ```javascript let r = await exec(`ssh -i ~/.ssh/id_ed25519_central_to -o StrictHostKeyChecking=no root@43.163.225.27 "ps aux | grep 'node index.js' | grep -v grep"`); r = await exec(`ssh -i ~/.ssh/id_ed25519_tokyo -o StrictHostKeyChecking=no root@43.167.192.145 "ps aux | grep 'node index.js' | grep -v grep"`); ``` ### Technical Analysis The `StrictHostKeyChecking=no` option disables meaningful SSH server identity verification. The client will accept a previously unknown host key without requiring the operator to verify that it belongs to the intended server. This behavior is not necessary for the declared node-management functionality. Secure SSH automation can use pre-provisioned and pinned host keys. Because all start, stop, and remote status operations use this option, the weakness affects every remote management action. The code does not write SSH private-key files. Instead, the `-i` option causes the local SSH client to read the configured private key. Nevertheless, disabling host authentication exposes the resulting privileged connection to server impersonation. ### Attack Path 1. An attacker gains a network position capable of intercepting, redirecting, or rerouting traffic intended for one of the hard-coded server IP addresses. 2. The attacker presents an arbitrary SSH server host key. 3. Because the command uses `StrictHostKeyCh ...[truncated 1077 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
index.js:43
Finding

Remote Lifecycle Management Uses Unrestricted Root Access and Broad Process Termination

Content
View full analysis
/root/.openclaw/logs/evolver.log 2>&1 &"`; ``` ### Technical Analysis Starting, stopping, and inspecting one application does not normally require unrestricted root access. The implementation authenticates directly as `root`, so the associated SSH credentials provide substantially more authority than the declared lifecycle-management task requires. The stop operation compounds this issue by executing: ```bash pkill -f 'node index.js' ``` The `-f` option matches against the complete command line. It is not restricted to a PID owned by the EvoMap service, a specific executable path, a service unit, or an expected node identifier. It can therefore terminate unrelated processes whose command lines contain the same text. The default target is `all`. No confirmation, authorization boundary, or destructive-operation safeguard is implemented before issuing the command to both servers. ### Attack Path 1. A caller obtains the ability to invoke the Skill on a machine where the configured SSH private keys are available. 2. ...[truncated 1229 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
index.js:3
Finding

Hard-Coded Production Targets and Credential Paths Bypass the Documented Configuration Model

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (18)

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The skill advertises node management but actually instructs the agent to perform privileged remote SSH execution as root against specific infrastructure, which is materially more sensitive than the stated purpose. This mismatch is dangerous because users or higher-level orchestration may authorize the skill based on an incomplete description, enabling unintended remote command execution on production hosts.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

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

Content

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

md
name: '中央',
    nodeId: 'node_curry001',
    ip: '43.163.225.27',
    sshKey: '~/.ssh/id_ed25519_central_to',
    nodePath: '/root/.nvm/versions/node/v22.22.0/bin/node'
  },
  tokyo: {

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

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

Content

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

md
name: '中央',
    nodeId: 'node_curry001',
    ip: '43.163.225.27',
    sshKey: '~/.ssh/id_ed25519_central_to',
    nodePath: '/root/.nvm/versions/node/v22.22.0/bin/node'
  },
  tokyo: {

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

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

Content

Scanner excerpt · index.js (reported line 8)May include surrounding context.

js
name: '中央',
    nodeId: 'node_curry001',
    ip: '43.163.225.27',
    sshKey: '~/.ssh/id_ed25519_central_to',
    nodePath: '/root/.nvm/versions/node/v22.22.0/bin/node'
  },
  tokyo: {

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

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

Content

Scanner excerpt · index.js (reported line 15)May include surrounding context.

js
name: '中央',
    nodeId: 'node_curry001',
    ip: '43.163.225.27',
    sshKey: '~/.ssh/id_ed25519_central_to',
    nodePath: '/root/.nvm/versions/node/v22.22.0/bin/node'
  },
  tokyo: {

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

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

Content

Scanner excerpt · index.js (reported line 65)May include surrounding context.

js
name: '中央',
    nodeId: 'node_curry001',
    ip: '43.163.225.27',
    sshKey: '~/.ssh/id_ed25519_central_to',
    nodePath: '/root/.nvm/versions/node/v22.22.0/bin/node'
  },
  tokyo: {

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

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

Content

Scanner excerpt · index.js (reported line 69)May include surrounding context.

js
name: '中央',
    nodeId: 'node_curry001',
    ip: '43.163.225.27',
    sshKey: '~/.ssh/id_ed25519_central_to',
    nodePath: '/root/.nvm/versions/node/v22.22.0/bin/node'
  },
  tokyo: {

Session Persistence

Medium
Category
Rogue Agent
Confidence
84% confidence
Finding

The command intentionally launches a long-running background process with nohup and &, creating persistence outside the interactive session. In an agent skill, this is security-relevant because it establishes unattended execution on a remote host as root, which can outlive user awareness and complicate control, auditing, and rollback.

Content

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

bash
# 深海
ssh -i $CENTRAL_SSH_KEY root@$CENTRAL_IP "cd ~/.openclaw/evolver && A2A_HUB_URL=https://evomap.ai A2A_NODE_ID=<your_node_id> nohup $NODE_PATH index.js run --loop > ~/.openclaw/logs/evolver.log 2>&1 &"

# 泰拉
ssh -i $TOKYO_SSH_KEY root@$TOKYO_IP "cd ~/.openclaw/evolver && A2A_HUB_URL=https://evomap.ai A2A_NODE_ID=<your_node_id> nohup node index.js run --loop > ~/.openclaw/logs/evolver.log 2>&1 &"

Session Persistence

Medium
Category
Rogue Agent
Confidence
84% confidence
Finding

This second startup command also creates a detached persistent process on a remote server using nohup and backgrounding. Within this skill's context of remote infrastructure control, persistent execution increases the blast radius of mistakes or misuse because the process continues after the initiating session ends.

Content

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

ssh -i $CENTRAL_SSH_KEY root@$CENTRAL_IP "cd ~/.openclaw/evolver && A2A_HUB_URL=https://evomap.ai A2A_NODE_ID=<your_node_id> nohup $NODE_PATH index.js run --loop > ~/.openclaw/logs/evolver.log 2>&1 &"

泰拉

ssh -i $TOKYO_SSH_KEY root@$TOKYO_IP "cd ~/.openclaw/evolver && A2A_HUB_URL=https://evomap.ai A2A_NODE_ID=<your_node_id> nohup node index.js run --loop > ~/.openclaw/logs/evolver.log 2>&1 &"

text

## 检查节点状态

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The documented stop commands use broad process-kill patterns like pkill -f 'node index.js', which can terminate unintended Node.js processes that match the command line. In this skill context, the commands are aimed at remote production nodes over SSH, so an overbroad match can cause service disruption beyond the intended EvoMap process.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The manifest describes broader EvoMap node management, including configuring node IDs and handling node binding or connection issues. In the implementation, node IDs are hardcoded into startup commands and there is no code path to modify configuration, perform binding operations, or remediate connectivity beyond launching, killing, and checking processes.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
78% confidence
Finding

The use of nohup and backgrounding creates a persistent remote process outside the current session, which can make unauthorized or accidental execution harder to notice and easier to leave running indefinitely. In this skill's context, it is especially sensitive because the process is launched remotely as root on hardcoded public IPs.

Content

Scanner excerpt · index.js (reported line 36)May include surrounding context.

js
: [[nodeName, NODES[nodeName]]];
  
  for (const [key, node] of targets) {
    const cmd = `ssh -i ${node.sshKey} -o StrictHostKeyChecking=no root@${node.ip} "cd /root/.openclaw/evolver && A2A_HUB_URL=https://evomap.ai A2A_NODE_ID=${node.nodeId} nohup ${node.nodePath || 'node'} index.js run --loop > /root/.openclaw/logs/evolver.log 2>&1 &"`;
    
    const result = await exec(cmd);
    results.push(`${node.name}: ${result.error ? '失败' : '已启动'}`);

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill can start and stop remote processes over SSH immediately, with no confirmation, policy gate, allowlist check beyond hardcoded nodes, or dry-run mode. In an agent setting, that increases the chance of accidental or prompt-induced destructive actions against production infrastructure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

All SSH commands disable host key verification with StrictHostKeyChecking=no, which makes the connections vulnerable to man-in-the-middle attacks and host impersonation. Because the skill performs privileged remote execution as root, a spoofed host could receive commands or return deceptive status information.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The manifest description and main instructional content are presented in Chinese only, with no indication that users can choose another language. This can violate language/locale policy when a skill imposes a specific language without offering opt-in or alternatives.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The description explicitly warns that environment variables must be configured before using the skill. However, the implementation hardcodes node IPs, SSH key paths, node IDs, and the hub URL directly in source, with no environment-variable lookup or validation, creating a mismatch between documented setup requirements and actual behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill hard-codes node names and status/result messages in Chinese, such as 已启动, 已停止, 在线, and 离线, with no indication that the user can choose a preferred language. This can violate language/locale policy when a skill imposes a specific language without opt-in or justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The manifest description is written only in Chinese ("EvoMap 节点控制器"), which may indicate a language-specific skill presentation without any opt-in, alternative locale, or justification. The policy requires flagging language or locale constraints when they are imposed without user choice or documented regional scope.

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
index.js:22