T09 · Insecure Skill Coding Practices
- Location
scripts/channel.sh:55- Finding
Financial Transaction Submission Without Ownership Validation
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is purpose-built for Aavegotchi automation, but it needs Review because it can submit unattended Bankr wallet transactions while overstating ownership protections and allowing under-scoped transaction settings.
Review carefully before installing. Use an explicit BANKR_API_KEY, verify every parcel/gotchi pair yourself, keep the contract and chain pinned to the intended Base REALM deployment, and avoid cron automation until you have dry-run or confirmation safeguards and transaction monitoring in place.
scripts/channel.sh:55Financial Transaction Submission Without Ownership Validation
scripts/lib.sh:29Configurable Transaction Destination and Chain Are Not Restricted to the Declared Deployment
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).
ow to Use
cd ~/.openclaw/workspace/skills/gotchi-channeling
./scripts/channel.sh 9638 867
./scripts/check-cooldown.sh 9638
# Output: ready:0 (or waiting:SECONDS)
./scripts/channel-all.sh
# Reads config.json, channels all ready gotchis
# Add to crontab
0 9 * * * cd ~/.openclaw/workspace/skills/gotchi-channeling && ./scripts/channel-all.sh >> /tmp/channeling.log 2>&1
Gas Cost: 569,556 gas ($0.02 on Base)
Execution Time: ~3-5 seconds
Rewards: ~250 Alchemica tokens per channel
Cooldown: 24 hours
Automation: Fully autonomous ✅
The code partially matches the description because it does check cooldown status for a Gotchi. However, the declared purpose claims a broader capability: channeling Aavegotchis via Bankr, building calldata, and submitting channel transactions safely. This code chunk only performs a read-only RPC query against the Realm Diamond contract and computes remaining cooldown time locally. There is no calldata construction, no Bankr integration, and no transaction submission logic in the supplied code. Therefore the description overstates what this code chunk actually does.
The documentation explicitly states the skill cannot perform autonomous channeling because a backend signature is required, yet the skill metadata claims it channels Aavegotchis and submits transactions safely. This mismatch can mislead users and downstream agents into attempting unsupported or unsafe transaction flows, increasing the chance of failed transactions, unsafe workarounds, or trust in capabilities the skill does not actually have.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Direct transaction submission via Bankr API:
curl -X POST "https://api.bankr.bot/agent/submit" \
-H "X-API-Key: $API_KEY" \
-d '{"transaction": {...}}'
The deployment guide recommends adding a daily cron job that runs the channeling script, but it does not place a prominent warning near the command that this will submit real on-chain transactions automatically. In a blockchain skill, silent scheduled execution can cause repeated spending of gas and repeated state-changing actions without the operator fully appreciating the financial consequences.
The crontab entry establishes persistent scheduled execution of a script that performs real blockchain actions. Even though persistence is not inherently malicious here, it increases risk because a misconfiguration, compromised script, or unnoticed config change could trigger unattended transactions indefinitely.
# Add to crontab
0 9 * * * cd ~/.openclaw/workspace/skills/gotchi-channeling && ./scripts/channel-all.sh >> /tmp/channeling.log 2>&1
The README explicitly describes scripts that submit wallet-backed blockchain transactions, but it does not clearly warn users that running these commands can cause on-chain state changes, spend gas, and trigger irreversible actions. In an automation skill that batches channeling operations, lack of prominent transaction/effect disclosure increases the risk of users executing value-bearing actions without informed consent or sufficient review.
The release notes explicitly encourage unattended cron-based execution of blockchain transactions but do not pair that guidance with a clear warning about transaction, asset, gas, and configuration risks. In a skill that submits on-chain actions against user-owned assets, this omission can lead users to deploy automation without understanding that misconfiguration or logic errors may cause repeated unwanted transactions or financial loss.
The documentation presents parcel ownership verification as a built-in safety check, but elsewhere states that access rights also permit channeling without ownership. This inconsistency can mislead users into believing the skill enforces a stricter authorization policy than it actually does, increasing the chance they channel on another user's parcel and forfeit rewards.
The file claims the skill protects users from channeling on parcels they do not own, yet earlier documents that access-rights-based channeling on others' parcels is possible. This contradictory assurance is dangerous because users may rely on the claimed protection and unknowingly trigger transactions where another parcel owner receives the rewards while their gotchi still goes on cooldown.
The skill declares shell-capable behavior and requires external binaries, but does not define any explicit tool scope such as permissions or allowed-tools. In an agent environment, that omission can let the runtime grant broader command execution than reviewers or users expect, increasing the chance of unintended system access, secret exposure, or execution of unsafe commands through supporting scripts.
The document recommends reverse engineering the backend API and monitoring network traffic to obtain signatures, which encourages bypass-style behavior around an anti-bot protection mechanism. In a skill whose stated purpose is to automate channeling and submit transactions, this guidance could lead users to capture authenticated traffic, violate service terms, expose tokens or session data, or build fragile automation against an unofficial interface.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
source "$SCRIPT_DIR/lib.sh"
require_bin cast
require_bin curl
require_bin jq
load_config
require_numeric "$GOTCHI_ID" "gotchi-id"
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
waitForConfirmation: true
}')"
RESPONSE="$(curl -sS -X POST "https://api.bankr.bot/agent/submit" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d "$REQUEST_PAYLOAD")"
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
waitForConfirmation: true
}')"
RESPONSE="$(curl -sS -X POST "https://api.bankr.bot/agent/submit" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d "$REQUEST_PAYLOAD")"
The function searches multiple unrelated local sources for a Bankr API key, including user systemd environment and other skill configuration directories, rather than requiring the credential to be provided explicitly for this skill. This broad credential discovery can cause unintended cross-skill secret reuse and silent consumption of sensitive tokens without user awareness, expanding the blast radius if the skill is modified, compromised, or misused.
The code accesses sensitive Bankr credentials from several local locations without any user-facing disclosure, consent flow, or even visible notice that secrets from outside this skill may be read. In an agent skill context, silent secret harvesting is especially risky because users may assume the skill only uses its own config, while the script can transparently pull credentials from broader user state.
The description says the skill performs 'daily harvesting from your REALM parcels,' which implies parcel-centric harvesting behavior. Later in the same document, the actual operation is explicitly a gotchi channeling transaction using channelAlchemica with both parcelId and gotchiId, so the wording overstates or mischaracterizes the action being performed.
No suspicious patterns detected.