T03 · Remote Payload Retrieval and Execution
- Location
SKILL.md:66- Finding
Unpinned Remote Dependencies and Mutable Source Build
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears to do what it claims, but it handles wallet private keys, irreversible on-chain transactions, and persistent background services without enough safeguards.
Review before installing. Use a dedicated low-funds wallet, prefer address-only status checks, protect the private-key file tightly, verify the Axon repo and dependency versions yourself, run dry-run first, and do not execute real registration unless you accept the permanent burn, stake lockup, and persistent daemon/cron behavior.
SKILL.md:66Unpinned Remote Dependencies and Mutable Source Build
scripts/check-status.py:31Read-Only Status Check Unnecessarily Loads the Wallet Private Key
scripts/register.py:82Registration Proceeds After Preflight Safety Checks Fail
scripts/watchdog.sh:2Cron-Based Daemon Persistence Is Non-Idempotent and Uses an Ambiguous Process Check
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.
"""
Axon Agent Registration Script
Bypasses the official SDK due to ABI mismatch (see references/known-issues.md).
Usage: python3 register.py --private-key-file /path/to/key.txt --capabilities "nlp,coding" --model "claude-sonnet-4.6"
"""
import argparse
import sys
The README instructs users to provide a private key file directly to local scripts, but it does not include any warning about secure storage, file permissions, shell history, or the risk of exposing wallet credentials. In a blockchain context, compromise of the private key would allow full control of the wallet and loss of staked or liquid funds, so normalizing this workflow without safety guidance materially increases credential-handling risk.
The skill directs users to store an EVM private key in a local file and then pass that file to scripts and a long-running daemon, but it lacks a strong secret-handling warning. This increases the risk of credential theft through file leakage, shell history, backups, logs, permissive ownership, or compromise of the host running the daemon.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
## Prerequisites
- Server with Python 3.8+ and Go 1.21+
- EVM wallet private key saved to a file (e.g. `/opt/axon/private_key.txt`, chmod 600)
- Minimum 120 AXON balance (100 stake + 20 burn + gas buffer)
- `web3` Python package: `pip install web3`
The skill instructs the user to perform an on-chain registration that stakes 100 AXON and notes that 20 AXON is burned permanently, but it does not present a clear warning/consent step immediately before the irreversible transaction. Because blockchain transactions are final, users may unintentionally incur permanent financial loss if they follow the instructions without understanding the consequences.
The skill starts a background daemon with nohup, creating a process that persists beyond the interactive session and continuously uses the wallet key for heartbeats. While operationally necessary for this blockchain agent, background persistence increases exposure if the host is compromised or if the daemon/binary is replaced or misconfigured.
go build -o tools/agent-daemon/agent-daemon ./tools/agent-daemon/
# Start daemon
nohup /opt/axon/tools/agent-daemon/agent-daemon \
--rpc https://mainnet-rpc.axonchain.ai/ \
--private-key-file /opt/axon/private_key.txt \
--heartbeat-interval 720 \
The skill installs a recurring cron job on a remote server, which creates persistence by automatically executing a script every five minutes. In legitimate admin context this may be intended, but from a security perspective persistence mechanisms are sensitive because they can survive session termination and repeatedly run modified or compromised scripts.
ssh user@YOUR_SERVER "chmod +x /opt/axon/watchdog.sh"
ssh user@YOUR_SERVER "(crontab -l 2>/dev/null; echo '*/5 * * * * /opt/axon/watchdog.sh') | crontab -"
---
This code accesses a highly sensitive credential by reading a private key from a user-supplied file and deriving an address from it. Although the file usage is visible in the CLI argument, there is no confirmation prompt, warning print, or comment/docstring explaining the sensitivity of this operation or advising safe handling.
Several user-facing strings are hardcoded in Chinese, which imposes a specific language on users without offering a language choice or documenting that the tool is intended only for a Chinese-speaking context. This matches the policy category for language or locale restrictions without user opt-in.
This code prints multiple user-facing messages in Chinese, including balance, errors, warnings, and success notices. Because the script does not provide a locale option or document a justified region-specific constraint, it forces a specific language on users and violates the language/locale policy criterion.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
#!/bin/bash
# Axon agent-daemon watchdog — run via cron: */5 * * * * /opt/axon/watchdog.sh
# Usage: Set AXON_DIR, PRIVATE_KEY, and RPC below, then: crontab -e → add line above
AXON_DIR="${AXON_DIR:-/opt/axon}"
DAEMON="$AXON_DIR/tools/agent-daemon/agent-daemon"
The script starts a long-running daemon with a private key file from disk, but provides no safeguards around secret storage, permissions, or operator warnings. In this context, the daemon appears to be an agent connected to an external RPC endpoint, so compromise of the key file or accidental insecure deployment could expose credentials used for blockchain or agent identity operations.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
if ! pgrep -f "agent-daemon" > /dev/null 2>&1; then
echo "$(date '+%Y-%m-%d %H:%M:%S') [RESTART] daemon not running" >> "$LOG"
nohup "$DAEMON" \
--rpc "$RPC" \
--private-key-file "$PK_FILE" \
--heartbeat-interval 720 \