T03 · Remote Payload Retrieval and Execution
- Location
scripts/setup.sh:87- Finding
Unverified Remote Installer Recommended for Direct Shell Execution
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This validator automation skill is coherent in purpose, but it asks agents to run high-impact Ansible automation from an unaudited mutable template directory and uses risky setup/install patterns.
Review this skill before installing. Use it only on intended validator hosts, inspect the resolved ~/.slv/template playbooks before any run, avoid curl-to-shell installers, prefer pinned and verified dependencies, and require explicit confirmation for user creation, firewall/systemd changes, identity changes, restarts, and ledger cleanup.
scripts/setup.sh:87Unverified Remote Installer Recommended for Direct Shell Execution
AGENT.md:155Execution of Unverified Playbooks Selected from a User-Writable Template Directory
scripts/setup.sh:35Unpinned Installation of Ansible from the Active Python Package Index
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
validator-1:
ansible_host: "<server-ip>"
ansible_user: "solv"
ansible_ssh_private_key_file: "~/.ssh/id_rsa"
vars:
# --- Validator Type ---
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
validator-1:
ansible_host: "<server-ip>"
ansible_user: "solv"
ansible_ssh_private_key_file: "~/.ssh/id_rsa"
vars:
# --- Validator Type ---
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
validator-1:
ansible_host: "<server-ip>"
ansible_user: "solv"
ansible_ssh_private_key_file: "~/.ssh/id_rsa"
vars:
# --- Validator Type ---
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.
brew install ansible
elif [[ "$OS" == "linux" ]]; then
if command -v apt-get &>/dev/null; then
sudo apt-get update && sudo apt-get install -y ansible-core
elif command -v dnf &>/dev/null; then
sudo dnf install -y ansible-core
else
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
warn "SSH agent running but no keys loaded"
echo " → Run: ssh-add ~/.ssh/id_rsa (or your key path)"
fi
elif [[ -f "$HOME/.ssh/id_rsa" ]] || [[ -f "$HOME/.ssh/id_ed25519" ]]; then
info "SSH keys found (agent not running — Ansible will use key files directly)"
else
warn "No SSH keys found"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
warn "SSH agent running but no keys loaded"
echo " → Run: ssh-add ~/.ssh/id_rsa (or your key path)"
fi
elif [[ -f "$HOME/.ssh/id_rsa" ]] || [[ -f "$HOME/.ssh/id_ed25519" ]]; then
info "SSH keys found (agent not running — Ansible will use key files directly)"
else
warn "No SSH keys found"
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -s http://localhost:8899 -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'
The skill instructs use of a user-configurable external RPC endpoint (REFERENCE_RPC_URL) for monitoring, which causes outbound network communication to a third party. While the payload is only getSlot, the endpoint could expose infrastructure metadata, encourage use of API-keyed services, and create a path for sending data to arbitrary external hosts if the variable is not constrained.
# Network latest slot (requires ERPC API key or other reference RPC)
NETWORK_SLOT=$(curl -s "${REFERENCE_RPC_URL}" \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot"}' | jq -r '.result')
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot"}' | jq -r '.result')
# Local slot
LOCAL_SLOT=$(curl -s http://localhost:8899 -X POST -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot"}' | jq -r '.result')
DIFF=$((NETWORK_SLOT - LOCAL_SLOT))
This markdown file advertises deploying validators, managing lifecycle, configuring firewall, systemd services, and log rotation, all of which can affect system integrity and availability. The description does not include any cautionary warning about modifying target servers, service disruption risk, or the need to verify environment and credentials before use.
The skill documents a cleanup playbook that removes ledger and snapshot files but does not explicitly warn that these operations are destructive and may cause irreversible data loss, longer recovery times, or service interruption. In an automation skill for validator operators, omission of a warning increases the chance of accidental execution by users who may interpret the command as routine maintenance.
Several testnet playbooks explicitly remove ledger data or combine restart actions with ledger deletion, yet the documentation provides no clear safety notice about destructive side effects. Because these are operational runbooks intended for direct execution, the lack of warnings materially increases the risk of accidental data deletion and validator downtime.
The script automatically installs packages using pip, Homebrew, apt, or dnf, including privileged package-manager paths and a later curl-based installer recommendation, without any confirmation or integrity verification step. In an agent-skill context, this is risky because running setup as instructed can cause unintended system changes and trust network/package sources implicitly.
The script invokes sudo apt-get update && sudo apt-get install -y ansible-core, which performs privileged system modification non-interactively. In a skill setup script, automatic elevation increases risk because a user may run it without realizing it will change system packages as root.
brew install ansible
elif [[ "$OS" == "linux" ]]; then
if command -v apt-get &>/dev/null; then
sudo apt-get update && sudo apt-get install -y ansible-core
elif command -v dnf &>/dev/null; then
sudo dnf install -y ansible-core
else
The script invokes sudo dnf install -y ansible-core, which is a privileged package installation with automatic approval. This can unexpectedly alter the host system and is especially concerning in an AI-agent workflow where users may execute helper scripts with limited review.
if command -v apt-get &>/dev/null; then
sudo apt-get update && sudo apt-get install -y ansible-core
elif command -v dnf &>/dev/null; then
sudo dnf install -y ansible-core
else
error "Cannot auto-install ansible-core. Please install manually: pip3 install ansible-core"
exit 1
The pre-flight command creates a user on the target system with elevated privileges via --become, which affects system accounts and access configuration. The markdown does not explicitly warn the user that this step performs administrative changes on the remote host.
The script checks SSH_AUTH_SOCK and runs ssh-add -l to inspect the user's loaded SSH keys. While it does not expose private key material, this is access to sensitive authentication state and there is no prior comment or user-facing notice explaining that the script will query the SSH agent.