Back to skill

Security audit

earn-hunter

Security checks across malware telemetry and agentic risk

Overview

This is a disclosed OKX Earn monitoring skill, but it needs review because it creates persistent scheduled jobs and includes account-changing purchase, transfer, and redeem guidance.

Install only if you want a persistent OKX Earn monitor. Review the scheduler it creates, the ~/.okx/earn-hunter files, and any Telegram or Lark destination. Do not let the agent run subscribe, transfer, or redeem commands unless you separately confirm the exact asset, amount, term, and account impact; prefer the dedicated OKX execution skill or the OKX app for purchases.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (17)

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill clearly directs the agent to execute shell commands (`which`, `npm install`, `cp`, `chmod`, `crontab`, `launchctl`, `rm`) but does not declare corresponding permissions. This creates a trust and review gap: users or policy systems may not realize the skill can modify the host environment, install software, and persist scheduled jobs.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
This guide materially expands a monitoring/notification skill into operational trade orchestration, including redemption, fund transfer, purchase sequencing, and direct CLI fallback commands. In an agent setting, that scope creep is dangerous because a user invoking a passive monitoring skill could be steered into account-changing actions, increasing the chance of unauthorized or unintended asset movement.

Intent-Code Divergence

Medium
Confidence
97% confidence
Finding
The document claims earn-hunter does not directly execute write operations, but then embeds direct write-capable commands and operational fund-routing steps, creating a misleading trust boundary. That inconsistency can cause reviewers, users, or calling agents to underestimate the skill's ability to facilitate transfers, redemptions, and purchases, which raises the risk of unsafe automation and privilege misuse.

External Transmission

Medium
Category
Data Exfiltration
Content
TOKEN=$(printenv "${config.telegram.bot_token_env}")
CHAT_ID=$(printenv "${config.telegram.chat_id_env}")

curl -s "https://api.telegram.org/bot${TOKEN}/sendMessage" \
  -d "chat_id=${CHAT_ID}" \
  -d "text=${message}" \
  -d "parse_mode=HTML"
Confidence
88% confidence
Finding
curl -s "https://api.telegram.org/bot${TOKEN}/sendMessage" \ -d "chat_id=${CHAT_ID}" \ -d "text=${message}" \ -d "parse_mode=HTML" ``` TG message formatting: use plain text + emoji. Avoid Markd

External Transmission

Medium
Category
Data Exfiltration
Content
TOKEN=$(printenv "${config.telegram.bot_token_env}")
CHAT_ID=$(printenv "${config.telegram.chat_id_env}")

curl -s "https://api.telegram.org/bot${TOKEN}/sendMessage" \
  -d "chat_id=${CHAT_ID}" \
  -d "text=${message}" \
  -d "parse_mode=HTML"
Confidence
88% confidence
Finding
https://api.telegram.org/

External Transmission

Medium
Category
Data Exfiltration
Content
# 期望返回 ok: true + bot info

# Step 2: 验证 chat_id 有效性
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getChat?chat_id=${TELEGRAM_CHAT_ID}"
# 期望返回 ok: true + chat info

# Step 3: 重发测试消息
Confidence
84% confidence
Finding
https://api.telegram.org/

External Transmission

Medium
Category
Data Exfiltration
Content
# 期望返回 ok: true + chat info

# Step 3: 重发测试消息
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
  -d "chat_id=${TELEGRAM_CHAT_ID}" \
  -d "text=🔧 Earn Hunter 排障测试消息" \
  -d "parse_mode=HTML"
Confidence
90% confidence
Finding
https://api.telegram.org/

External Transmission

Medium
Category
Data Exfiltration
Content
fi

  local resp
  resp=$(curl -s -X POST "$webhook" -H "Content-Type: application/json" -d "$payload" 2>/dev/null)
  if echo "$resp" | jq -e '.StatusCode == 0 or .code == 0' >/dev/null 2>&1; then
    log_notify "LARK" "OK" "$detail sent"
    return 0
Confidence
80% confidence
Finding
curl -s -X POST "$webhook" -H "Content-Type: application/json" -d

Session Persistence

Medium
Category
Rogue Agent
Content
- Use `action: "list"` to find the job id.

**OS-crontab platforms (`cron`):**
- **Pause:** `crontab -l | grep -v 'earn-hunter' | crontab -`
- **Resume:** Re-add the crontab entry (same as Activation Step 5).

**macOS LaunchAgent (`launchagent`):**
Confidence
96% confidence
Finding
crontab -l

Session Persistence

Medium
Category
Rogue Agent
Content
- No API key + `okx auth status --json` → `"status":"logged_in"` → **OAuth mode**. No `--profile` flag needed.
   - Neither → **stop**. Load `okx-cex-auth` skill and follow login steps.
5. Init config and state:
   - If `~/.okx/earn-hunter/` directory does not exist → `mkdir -p ~/.okx/earn-hunter`
   - If `~/.okx/earn-hunter/config.json` does not exist → copy `{baseDir}/config/default.json` to it
   - If `~/.okx/earn-hunter/state.json` does not exist → write `{"flash":{},"fixed":{},"flexible":{},"consecutive_failures":0,"last_error":""}`
   - If `~/.okx/earn-hunter/platform.json` does not exist → run [Platform Detection](#platform-detection-active-probe--user-confirmation)
Confidence
88% confidence
Finding
mkdir -p ~/.okx/earn-hunter` - If `~/.okx/earn-hunter/config.json` does not exist → copy `{baseDir}/config/default.json` to it - If `~/.okx/earn-hunter/state.json` does not exist → write `{"flas

Session Persistence

Medium
Category
Rogue Agent
Content
### Step 1 — Platform Detection & Confirmation

See [Platform Detection](#platform-detection-active-probe--user-confirmation). Probe environment → ask user to confirm → write `platform.json`.

### Step 2 — Detect Notification Channel & Confirm
Confidence
87% confidence
Finding
write `platform.json`. ### Step 2 — Detect Notification Channel & Confirm **Must actively check available channels before proceeding.** Do NOT silently fall back to session. On OS-crontab platforms

Session Persistence

Medium
Category
Rogue Agent
Content
LOG_FILE="$HOME/.okx/earn-hunter/cron.log"
INTERVAL=3600  # derive from scheduler.interval: "1h"→3600, "30m"→1800, "10m"→600

cat > ~/Library/LaunchAgents/com.okx.earn-hunter.plist << PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
Confidence
97% confidence
Finding
plist

Session Persistence

Medium
Category
Rogue Agent
Content
LOG_FILE="$HOME/.okx/earn-hunter/cron.log"
INTERVAL=3600  # derive from scheduler.interval: "1h"→3600, "30m"→1800, "10m"→600

cat > ~/Library/LaunchAgents/com.okx.earn-hunter.plist << PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
Confidence
97% confidence
Finding
PLIST

Session Persistence

Medium
Category
Rogue Agent
Content
<key>RunAtLoad</key>
    <true/>
</dict>
</plist>
PLIST

launchctl load ~/Library/LaunchAgents/com.okx.earn-hunter.plist
Confidence
95% confidence
Finding
plist

Session Persistence

Medium
Category
Rogue Agent
Content
### Lark Webhook Setup

1. "Create a custom bot in a Lark group → get the webhook URL"
2. "Save it to config:"
   Read `~/.okx/earn-hunter/platform.json` → set `.notify.lark_webhook` to the webhook URL → write back.
Confidence
80% confidence
Finding
Create a custom bot in a Lark group → get the webhook URL" 2. "Save it to config:" Read `~/.okx/earn-hunter/platform.json` → set `.notify.lark_webhook` to the webhook URL → write back. ## Smoke Te

Tool Parameter Abuse

High
Category
Tool Misuse
Content
When user says "卸载" / "uninstall":
1. Stop the scheduler (same as Pause). For LaunchAgent, also remove the plist:
   `launchctl unload ~/Library/LaunchAgents/com.okx.earn-hunter.plist && rm -f ~/Library/LaunchAgents/com.okx.earn-hunter.plist`
2. Ask: "是否保留配置和历史数据?"
   - Yes → only remove scheduler
   - No → also remove `~/.okx/earn-hunter/` directory
Confidence
84% confidence
Finding
rm -f ~/Library/LaunchAgents/

Chaining Abuse

High
Category
Tool Misuse
Content
When user says "卸载" / "uninstall":
1. Stop the scheduler (same as Pause). For LaunchAgent, also remove the plist:
   `launchctl unload ~/Library/LaunchAgents/com.okx.earn-hunter.plist && rm -f ~/Library/LaunchAgents/com.okx.earn-hunter.plist`
2. Ask: "是否保留配置和历史数据?"
   - Yes → only remove scheduler
   - No → also remove `~/.okx/earn-hunter/` directory
Confidence
81% confidence
Finding
&& rm -

VirusTotal

64/64 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.