race-mcp@0.3.0
CAUTION· not startedPublisher claims: "Local-first remote access, control, and exchange through CLI and MCP" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Not started: dependency install failed; the server itself was not observed.- Tested
- the dependency install step · every file read, file written and host contacted by what ran
- Not tested
- server startup · the tool list · tool behavior
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
- no credential variables read in the code
- Where it talks to
- no vendor host named in the codeAlso openssh.com, mcp.example — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- server startup · the tool list · tool behavior
Connect it under the guard. Not started: dependency install failed; the server itself was not observed. The code names no credential variable; the guard pins the network to what the honeypot saw and logs every call.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; not started: dependency install failed; the server itself was not observed) on 2026-11-15 and scored it 68/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: References a credential file in the home directory; Privileged sudo command; Privileged sudo command. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
# Usage: _identity_file_readiness("gpu", "gpu.example", ["~/.ssh/id_ed25519"])Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.f"sudo dnf install -y {quoted_tool}",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.f"sudo pacman -Sy --noconfirm {quoted_tool}",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.help="Optional SSH config file path for --ssh-config; defaults to ~/.ssh/config",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."It executes a signed broker sudo no-op probe and records used execution_ids on the target.",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."USER_CMD=$(base64 -d < \"$JOB_DIR/cmd.b64\")",Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.# Usage: _execution_permission_block(device, "L6", "command_policy:sudo disabled", {})Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.help="Optional ACL target override; defaults to the SSH login user's home when the sudo install script runs",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Usage: _identity_file_readiness("gpu", "gpu.example", ["~/.ssh/id_ed25519"])Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.f"sudo apt-get update && sudo apt-get install -y {quoted_tool}",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."Execution mode uses non-interactive package-manager commands and never receives or forwards sudo passwords.",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."The probe does not execute sudo or high-risk privileged actions.",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.f"sudo yum install -y {quoted_tool}",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.BLOCK_REASON_SUDO_DISABLED = "sudo disabled"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Usage: _identity_file_path_from_token("gpu", "gpu.example", "~/.ssh/id_ed25519")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.help="Upload runner/broker setup scripts to target /tmp and print sudo next steps",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Usage: _identity_file_path_from_token("gpu", "gpu.example", "~/.ssh/id_ed25519")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Usage: _identity_file_readiness("gpu", "gpu.example", ["~/.ssh/id_ed25519"])Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."sudo -n true && "Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out." sudo -n yum install -y rsync",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.sudo_token_seen = f"remote-workspace broker sudo smoke {broker_sudo_token}" in broker_sudo_stdout_linesFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell." shell_path=\"$(awk -F: -v u=\"$user\" '$1 == u {print $7; exit}' /etc/passwd || true)\"",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose." sudo -n apt-get install -y rsync",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.proc = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.sudo = shutil.which("sudo")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell." sudo -n zypper --non-interactive install rsync",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.f"sudo {shlex.quote(REMOTE_INSTALL_SCRIPT_PATH)}",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."USER_CMD=$(printf '%s' \"$CMD_B64\" | base64 -d)",Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.# Function Description: Upload Host-scoped runner/broker setup scripts and render sudo next steps.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.f"sudo {shlex.quote(REMOTE_KEYS_SCRIPT_PATH)}",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell." sudo -n apt-get update >/dev/null",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell." if [ -z \"$shell_path\" ] && [ -r /etc/passwd ]; then",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.elif [ -r /etc/passwd ]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.else "SSH login user's home, resolved on the target from the sudo user"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."sudo -n id -u"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."method": "signed broker execution of sudo -n true and sudo -n id -u",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."title": "SSH into target and run sudo setup scripts",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.setup_mcp_parser.add_argument("--mcp-server", action="store_true", help="Include Streamable HTTP MCP server configuration")Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.awk -F: -v user="$lookup_user" '$1 == user {{print $6; exit}}' /etc/passwdFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.broker_sudoers_file=/etc/sudoers.d/remote-workspace-broker-root-helperFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose." sudo -n dnf install -y rsync",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.f"printf 'remote-workspace broker sudo smoke {broker_sudo_token}\\n' && "Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."chmod 700 \"$MANAGER_SCRIPT\"",Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.("broker wrapper mode", 'chmod 755 "$broker_wrapper"'),Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run(argv, text=True, capture_output=True, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# Usage: subprocess.run(argv, **_non_interactive_ssh_run_kwargs())Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.ssh_g = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run(grant["exact_command"], shell=True, text=True, capture_output=True, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run(argv, check=False, text=True, capture_output=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."Aliases --mcp-tool and --mcp-server select the same stdio and Streamable HTTP surfaces.",Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed_file = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run(command, check=False, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.probe = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.("authorized_keys ownership", 'chown "$user:$user" "$auth"'),Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run(["id", user], text=True, capture_output=True, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.("workspace acl helper mode", 'chmod 750 "$workspace_acl_helper"'),Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts."mcp_server_mode": "stdio discovers project config from cwd and falls back to global config; Streamable HTTP requires an explicit fixed scope",Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.completed = subprocess.run(list(argv), capture_output=True, text=True, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.("authorized_keys mode", "chmod 600 \"$auth\""),Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.("broker root helper mode", 'chmod 750 "$broker_root_helper"'),Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts." while [ \"$WAIT_COUNT\" -lt \"$GRACE_SEC\" ] && kill -0 \"$PID\" 2>/dev/null; do",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell." if kill -TERM \"$PID\" 2>/dev/null; then TERM_SENT=true; fi",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell." if kill -0 \"$PID\" 2>/dev/null; then",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."if [ -n \"$PID\" ] && kill -0 \"$PID\" 2>/dev/null; then PID_ALIVE=true; fi",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell." if kill -0 \"$PID\" 2>/dev/null; then",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.process = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
Not checked against OSV yet; the weekly check has not reached this version.
What would make this Verified
12 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Reads credential paths from the home directory≈ +9 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Unclaimed publisher≈ +8 on the totalClaim bluewhitep: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Obfuscated code≈ +5 on the totalRemove base64-assembled strings, eval of decoded text and minified blobs. Reviewers and scanners both treat unreadable code as hostile.
- References a credential file in the home directory≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.