T09 · Insecure Skill Coding Practices
- Location
scripts/check-wallet.sh:16- Finding
Arbitrary Python Code Execution Through Wallet Arguments
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This crypto tracker is mostly purpose-aligned, but its shell scripts can execute unintended local code from crafted inputs and the documentation overstates some financial-tracking features.
Install only if you are comfortable reviewing and fixing the scripts first. Do not run it with untrusted token names, wallet addresses, alert values, or config paths, and avoid cron use until the Python interpolation bugs are removed and privacy/storage behavior is clearly documented.
scripts/check-wallet.sh:16Arbitrary Python Code Execution Through Wallet Arguments
scripts/price.sh:27Arbitrary Python Code Execution Through Token Arguments
scripts/portfolio.sh:46Python Injection Through Portfolio Configuration Path
scripts/alerts.sh:21Python Injection Through Alert Configuration Path
scripts/alerts.sh:39Python Source Injection Through Embedded Price API Response
If the skill only performs limited token price lookup while claiming full wallet balance tracking, aggregation, alerting, and multi-chain support, users may expose wallet data and rely on outputs under false assumptions. The crypto-finance context makes this more dangerous because accuracy and coverage directly affect monitoring, trading, and record-keeping decisions.
If the skill only performs limited token price lookup while claiming full wallet balance tracking, aggregation, alerting, and multi-chain support, users may expose wallet data and rely on outputs under false assumptions. The crypto-finance context makes this more dangerous because accuracy and coverage directly affect monitoring, trading, and record-keeping decisions.
If the skill only performs limited token price lookup while claiming full wallet balance tracking, aggregation, alerting, and multi-chain support, users may expose wallet data and rely on outputs under false assumptions. The crypto-finance context makes this more dangerous because accuracy and coverage directly affect monitoring, trading, and record-keeping decisions.
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
echo "================================"
# Get prices for native tokens
PRICES=$(curl -s "https://api.coingecko.com/api/v3/simple/price?ids=ethereum,solana,matic-network&vs_currencies=usd" 2>/dev/null)
ETH_PRICE=$(echo "$PRICES" | python3 -c "import sys,json; print(json.load(sys.stdin).get('ethereum',{}).get('usd',0))" 2>/dev/null)
SOL_PRICE=$(echo "$PRICES" | python3 -c "import sys,json; print(json.load(sys.stdin).get('solana',{}).get('usd',0))" 2>/dev/null)
MATIC_PRICE=$(echo "$PRICES" | python3 -c "import sys,json; print(json.load(sys.stdin).get('matic-network',{}).get('usd',0))" 2>/dev/null)
The skill advertises shell and network-driven workflows but does not declare any tool scope such as permissions or allowed-tools. In an agent environment, that omission weakens policy boundaries and can allow the skill to be invoked with broader-than-expected capabilities, increasing the chance of unintended command execution or outbound requests.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
echo "================================"
# Get prices for native tokens
PRICES=$(curl -s "https://api.coingecko.com/api/v3/simple/price?ids=ethereum,solana,matic-network&vs_currencies=usd" 2>/dev/null)
ETH_PRICE=$(echo "$PRICES" | python3 -c "import sys,json; print(json.load(sys.stdin).get('ethereum',{}).get('usd',0))" 2>/dev/null)
SOL_PRICE=$(echo "$PRICES" | python3 -c "import sys,json; print(json.load(sys.stdin).get('solana',{}).get('usd',0))" 2>/dev/null)
MATIC_PRICE=$(echo "$PRICES" | python3 -c "import sys,json; print(json.load(sys.stdin).get('matic-network',{}).get('usd',0))" 2>/dev/null)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
echo "================================"
# Get prices for native tokens
PRICES=$(curl -s "https://api.coingecko.com/api/v3/simple/price?ids=ethereum,solana,matic-network&vs_currencies=usd" 2>/dev/null)
ETH_PRICE=$(echo "$PRICES" | python3 -c "import sys,json; print(json.load(sys.stdin).get('ethereum',{}).get('usd',0))" 2>/dev/null)
SOL_PRICE=$(echo "$PRICES" | python3 -c "import sys,json; print(json.load(sys.stdin).get('solana',{}).get('usd',0))" 2>/dev/null)
MATIC_PRICE=$(echo "$PRICES" | python3 -c "import sys,json; print(json.load(sys.stdin).get('matic-network',{}).get('usd',0))" 2>/dev/null)
The script invokes a secondary wallet-checking script for each configured wallet address, which by the skill's purpose likely results in external lookups tied to the user's wallet addresses. Although the script prints portfolio results, it does not disclose before execution that user wallet information will be sent to external services during scanning.
The documentation instructs users to query wallet balances and prices through public RPCs and third-party APIs without disclosing that wallet addresses and query metadata are sent to external providers. In a crypto portfolio context, this can reveal sensitive financial associations and tracking information, especially when public RPCs are used repeatedly or via automation.
The cron example instructs users to append portfolio snapshots to a local history file without warning that this creates persistent financial records. Even if written locally, those records can disclose wallet holdings, balances, and activity patterns to other users, backups, or later processes on the same system.