T03 · Remote Payload Retrieval and Execution
- Location
runner.sh:102- Finding
Unpinned Remote Installer Is Piped Directly into a Shell
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches its GPU-wrapper purpose, but it needs review because its manifest grants broader Bash access than the documented runner-only boundary and it includes unsafe pipe-to-shell install guidance.
Review before installing. Keep dry-run and confirmation enabled, do not run the suggested `curl ... | sh` installer without independent verification, and install only if you are comfortable with the manifest's broader Bash permission or the publisher narrows it to the bundled runner. Expect `gpu` commands to use your configured provider account and possibly incur costs.
runner.sh:102Unpinned Remote Installer Is Piped Directly into a Shell
manifest.yaml:14Manifest Grants General Bash Access Despite Claiming a Runner-Only Boundary
Referenced artifact was not completely inspected
description: Safely run local `gpu` commands via a guarded wrapper (`runner.sh`) with preflight checks and budget/time caps.
Referenced artifact was not completely inspected
description: Safely run local `gpu` commands via a guarded wrapper (`runner.sh`) with preflight checks and budget/time caps.
The skill uses 'shell' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The script surfaces a curl ... | sh installation command in an error message, encouraging execution of a remote script fetched over the network without integrity verification. Even though the runner does not execute it directly, embedding this pattern in a trusted tool can socially engineer operators into unsafe installation behavior, leading to arbitrary code execution if the source is compromised or intercepted.
# Preflight checks
echo_info "Preflight: checking gpu --version"
if ! gpu --version >/dev/null 2>&1; then
echo_error "'gpu' binary not found on PATH. Please install: curl -fsSL https://gpu-cli.sh/install.sh | sh"
exit 2
fi
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
# --- Tests that don't need the gpu binary ---
# 1) Deny semicolon injection
if ./runner.sh gpu status --json \; rm -rf / 2>/dev/null; then
fail "semicolon injection not blocked"
else
pass "semicolon injection blocked"
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
# --- Tests that don't need the gpu binary ---
# 1) Deny semicolon injection
if ./runner.sh gpu status --json \; rm -rf / 2>/dev/null; then
fail "semicolon injection not blocked"
else
pass "semicolon injection blocked"
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.
# --- Tests that don't need the gpu binary ---
# 1) Deny semicolon injection
if ./runner.sh gpu status --json \; rm -rf / 2>/dev/null; then
fail "semicolon injection not blocked"
else
pass "semicolon injection blocked"
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
pass() { printf "[PASS] %s\n" "$1"; }
fail() { printf "[FAIL] %s\n" "$1"; exit 1; }
skip() { printf "[SKIP] %s\n" "$1"; }
HAS_GPU=false
if command -v gpu >/dev/null 2>&1; then HAS_GPU=true; fi
# --- Tests that don't need the gpu binary ---
# 1) Deny semicolon injection
if ./runner.sh gpu status --json \; rm -rf / 2>/dev/null; then
fail "semicolon injection not blocked"
else
pass "semicolon injection blocked"
fi
# 2) Deny dollar-sign injection
if SKILL_INPUT='gpu status $(id)' ./runner.sh 2>/dev/null; then
fail "dollar injection not blocked"
else
pass "dollar injection blocked"
fi
# --- Tests that need the gpu binary ---
if [[ "$HAS_GPU" != true ]]; then
skip "gpu binary not on PATH; skipping preflight tests"
echo "Self-tests completed (some skipped)."
exit 0
fi
# 3) Preflight dry-run of a safe command (exits 4 = blocked by dry-run)
SKILL_DRY_RUN=true SKILL_REQUIRE_CONFIRM=fal
Skill selects an external model or provider that may use a different account or billing plan than the operator expects. Undisclosed model switches can cause unexpected cost or quota consumption.
- Run `runner.sh gpu inventory --json --available --max-price 0.50` and suggest a GPU for FLUX.
- Run `runner.sh gpu run python train.py --gpu-type "RTX 4090"` with batch size 4; preview the plan.
- Run `runner.sh gpu comfyui run flux_schnell` and sync images to outputs/.
- Run `runner.sh gpu llm run --vllm --model llama-3.1-8b-instruct -y -p 8000:8000`.
Notes
- The skill enforces a single 'runner.sh gpu …' command with no shell chaining or redirection.
The README advertises activation via broad natural-language phrases like "Use GPU CLI to ...", which can cause the skill to trigger on loosely matching user input rather than an explicit command. In an execution-oriented skill that runs local CLI commands, this increases the risk of unintended invocation and command execution from ambiguous prompts or prompt-injected text in the conversation context.
The trigger phrase "Run on a GPU" is generic natural language that could overlap with ordinary user requests rather than an intentional invocation of this specific skill. The manifest does not provide exclusion conditions or tighter scope to distinguish when the skill should activate versus when the user is speaking generally about GPU usage.
The allowlist permits the auth subcommand, which can use existing stored credentials or trigger account-affecting authentication flows without any dedicated warning beyond the generic confirmation gate. In a skill context, credential and account operations are more sensitive than ordinary status/read commands, so users should receive explicit notice and narrower policy controls.
No suspicious patterns detected.