race-mcp@0.3.0
BLOCKED· static onlyPublisher claims: "Local-first remote access, control, and exchange through CLI and MCP" Observed in sandbox: static analysis only — behavior not yet observed.
Coverage
Static only; nothing was run yet.The label rests on the code, the instruction files and the publisher. The honeypot run replaces this verdict when it completes.
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
- nothing has run yet
- What we could not test
- everything: the server has not run yet
Do not connect it. The honeypot or a critical finding blocked this version; the evidence is below.
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 analysed it statically (a sandbox run is pending) on 2026-11-15 and scored it 45/100 (Blocked). Do not install it: the sandbox observed behaviour consistent with credential theft, exfiltration or persistence. Notable findings: Privileged sudo command; Privileged sudo command; Reads credential paths from the home directory. Summary: static analysis only — behavior not yet observed.
Behavior trace
Queued for honeypot run · static analysis onlyThis version has not been detonated yet. The score above counts behavior as unknown (50/100), so it cannot read Verified until the honeypot run completes and replaces this verdict.
Static findings
BLOCK_REASON_SUDO_DISABLED = "sudo disabled"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Usage: _execution_permission_block(device, "L6", "command_policy:sudo disabled", {})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."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.# 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."chmod 700 \"$MANAGER_SCRIPT\"",Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts."title": "SSH into target and run sudo setup scripts",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.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.sudo = shutil.which("sudo")Fix: 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 zypper --non-interactive install rsync",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell." sudo -n yum install -y rsync",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.# 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.completed = subprocess.run(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."sudo -n true && "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.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.# 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 yum install -y {quoted_tool}",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." sudo -n dnf install -y rsync",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.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.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.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.completed_file = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."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.f"sudo {shlex.quote(REMOTE_KEYS_SCRIPT_PATH)}",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.# 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.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.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.f"sudo pacman -Sy --noconfirm {quoted_tool}",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell." sudo -n apt-get install -y rsync",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."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.# 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.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."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.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.f"sudo dnf install -y {quoted_tool}",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.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 id -u"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.process = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."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.("workspace acl helper mode", 'chmod 750 "$workspace_acl_helper"'),Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts." 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.("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." 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.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.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.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.("authorized_keys mode", "chmod 600 \"$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." if kill -0 \"$PID\" 2>/dev/null; then",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.("broker root helper mode", 'chmod 750 "$broker_root_helper"'),Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.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.# 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.probe = 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." if kill -0 \"$PID\" 2>/dev/null; then",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."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 = subprocess.run(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(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.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.("authorized_keys ownership", 'chown "$user:$user" "$auth"'),Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts."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.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.proc = 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. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
Not checked against OSV yet; the weekly check has not reached this version.
What would make this Verified
35 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.
- 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.
- 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.