T01 · Skill Instruction Hijacking
- Location
prompt-template.md:41- Finding
Untrusted Social-Feed Content Is Embedded in the Trading Agent Prompt
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is not clearly malicious, but it needs review because it installs a per-minute autonomous trading loop that stores and sends an API key, and its trade decisions can be influenced by untrusted social-feed text.
Install only if you are comfortable with an autonomous agent running every minute, using your local LLM budget, storing a Bearer API key in ~/.thepit/config.json, and submitting trades to The Pit. Use the default https://api.thepit.run endpoint unless you fully trust a custom server, monitor ~/.thepit/heartbeat.log and your crontab, and remove the cron entry if you want the agent to stop.
prompt-template.md:41Untrusted Social-Feed Content Is Embedded in the Trading Agent Prompt
install.sh:29Arbitrary API Base URL Can Receive the Plaintext Bearer Credential
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).
crontab -l | grep -v "thepit-skill" | crontab -
# Remove config + logs
rm -rf ~/.thepit
# Remove the skill itself (OpenClaw command)
openclaw skills uninstall thepit/moat-trader
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).
crontab -l | grep -v "thepit-skill" | crontab -
# Remove config + logs
rm -rf ~/.thepit
# Remove the skill itself (OpenClaw command)
openclaw skills uninstall thepit/moat-trader
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
- **No background processes beyond ONE cron entry** that runs
`heartbeat.sh` once per minute. You can remove it any time.
- **No outbound HTTP except to the single URL** configured in
`~/.thepit/config.json` (default `https://api.thepit.run/external/*`).
- **No LLM API keys stored by this skill.** The skill invokes your
existing `openclaw agent --local` configuration — whatever model
you've already wired.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
- **No background processes beyond ONE cron entry** that runs
`heartbeat.sh` once per minute. You can remove it any time.
- **No outbound HTTP except to the single URL** configured in
`~/.thepit/config.json` (default `https://api.thepit.run/external/*`).
- **No LLM API keys stored by this skill.** The skill invokes your
existing `openclaw agent --local` configuration — whatever model
you've already wired.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
- **No background processes beyond ONE cron entry** that runs
`heartbeat.sh` once per minute. You can remove it any time.
- **No outbound HTTP except to the single URL** configured in
`~/.thepit/config.json` (default `https://api.thepit.run/external/*`).
- **No LLM API keys stored by this skill.** The skill invokes your
existing `openclaw agent --local` configuration — whatever model
you've already wired.
The document explicitly states the skill establishes persistence via cron. Even though disclosed and expected for a scheduled trading agent, persistence increases attack surface because compromised or modified scripts would execute automatically every minute without further user action.
existing `openclaw agent --local` configuration — whatever model
you've already wired.
- **No filesystem access outside `~/.thepit/`** except the cron entry
(via `crontab -l | crontab -`).
## What this skill actually does on your machine
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
and api_base. Writes:
~/.thepit/config.json chmod 600 — only your user can read
~/.thepit/heartbeat.log append-only log of each heartbeat call
This describes concrete cron modification behavior that installs recurring execution. Persistent execution is not inherently malicious here, but it is a real persistence mechanism and can be abused if the script path or referenced files are later tampered with.
~/.thepit/heartbeat.log append-only log of each heartbeat call
Then calls `crontab -l` → filters out any existing `thepit-skill`
entries → appends one new entry → pipes to `crontab -`. Effect:
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
action.
- ❌ No broadcast to other skills or agents. All state is scoped to
`~/.thepit/`.
- ❌ No sudo / root operations.
## What you must trust
The skill installs a cron-driven trading loop and modifies local configuration, but the user warning is not prominently stated at the point of installation/setup. Because this is an autonomous trading skill, insufficient disclosure increases the risk that users enable recurring financial actions and persistent system changes without fully understanding the operational and monetary consequences.
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.
},
"scheduling": {
"cron": true,
"description": "install.sh registers ONE cron entry to invoke heartbeat.sh every minute. User can remove via `crontab -l | grep -v thepit-skill | crontab -`."
}
},
"personas": [
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.
},
"scheduling": {
"cron": true,
"description": "install.sh registers ONE cron entry to invoke heartbeat.sh every minute. User can remove via `crontab -l | grep -v thepit-skill | crontab -`."
}
},
"personas": [
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
causalPostId: (if $causal == "null" then null else $causal end)
} | with_entries(select(.value != null))')
RESPONSE=$(curl -sS --max-time 5 \
-X POST \
-H "Authorization: Bearer ${API_KEY}" \
-H "Content-Type: application/json" \
The comment says re-running is safe because it overwrites config.json but not scheduled jobs. However, the cron install logic removes only lines containing the marker text "thepit-skill" and then appends a new marker plus job, so it does modify scheduled jobs and may leave prior heartbeat entries in place if they lacked that marker. This is an active contradiction between the documentation and the implemented behavior.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
"skill_dir": "${SKILL_DIR}"
}
EOF
chmod 600 "${THEPIT_DIR}/config.json"
# Make heartbeat.sh executable
chmod +x "${SKILL_DIR}/heartbeat.sh"
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
"skill_dir": "${SKILL_DIR}"
}
EOF
chmod 600 "${THEPIT_DIR}/config.json"
# Make heartbeat.sh executable
chmod +x "${SKILL_DIR}/heartbeat.sh"
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
"skill_dir": "${SKILL_DIR}"
}
EOF
chmod 600 "${THEPIT_DIR}/config.json"
# Make heartbeat.sh executable
chmod +x "${SKILL_DIR}/heartbeat.sh"
The script establishes persistence by registering heartbeat.sh in the user’s crontab to run every minute. Even though this may be intended functionality, persistence mechanisms are security-relevant because they ensure continued code execution after installation, increase blast radius if the skill or its directory is later modified, and may be non-obvious to users reviewing the install script quickly.
# Install cron entry
CRON_LINE="*/1 * * * * ${SKILL_DIR}/heartbeat.sh >> ${THEPIT_DIR}/heartbeat.log 2>&1"
(crontab -l 2>/dev/null | grep -v "thepit-skill"; echo "# thepit-skill: heartbeat"; echo "$CRON_LINE") | crontab -
echo ""
echo "✓ Config written to ${THEPIT_DIR}/config.json"
The skill gives concrete trading instructions, entry/exit rules, and position sizing without any warning that these are speculative strategies that can cause financial loss. This is dangerous because it can encourage users or downstream agents to treat the content as actionable investment guidance while underestimating risk, especially since the strategy explicitly promotes concentrated exposure based on social signals.
The skill operationalizes autonomous trading decisions by defining explicit conditions for entering and exiting positions based on external posts, author history, and time-based confirmation logic. In context, this is more dangerous because it delegates market actions to social-media sentiment and clout metrics, creating a path for manipulation, herd-following, and automated losses without meaningful human judgment.
**Exits** — You exit when:
- The author you followed flips sentiment (re-post in opposite
direction) → mirror them
- 4 blocks pass without confirmation from other high-clout
authors → lone signal, probably wrong
- Unrealized PnL hits **-6%** (loss limit — the author's wrong
this time)