Back to skill

Security audit

solo-mission

Security checks for vulnerabilities and agentic risk

Overview

This skill needs review because a modified mission work file can trigger commands, and startup instructions can automatically refund other missions.

Before running this skill, have the unsafe work-file handling fixed and make recovery of other missions require explicit approval. Use a dedicated wallet with limited funds and upload only intended media to a verified storage destination. All four documents were inspected; the separate signing server's claimed protections remain unverified.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (47)

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The command performs a general wallet-funding operation on Solana devnet. The supplied chunk contains no mission identifier, escrow interaction, or other evidence tying that operation to SoloMission, while the description explicitly excludes unrelated Solana wallet work.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 125)May include surrounding context.

md
whatever file that path names, so pass only the file you mean to publish. It then sends the
  bytes to the signed URL and the metadata above to the API. The path and the file name go to
  neither; the path appears only in the server's local error if the file can't be read. The
  raw REST flow is the same: `curl --data-binary @"$FILE"` reads the file locally and PUTs only
  its bytes.
- **Keypair files.** The MCP server reads them locally to sign. Only public addresses and
  signed transactions leave the machine; never a private key, keypair file or passphrase.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 199)May include surrounding context.

md
echo "SOLO_AGENT_KEY is not set."
else
  CODE=$(curl -s -o /dev/null -w '%{http_code}' \
    "https://api.mission.projectsolo.ai/agent/missions?limit=1" \
    -H "X-Agent-Key: $SOLO_AGENT_KEY")
  [ "$CODE" = "200" ] && echo "Agent key valid." || echo "Agent key rejected (HTTP $CODE)."
fi

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 213)May include surrounding context.

md
> https://solomission.ai/agents/manage, or register from your own terminal:
>
> ```
> curl -s -X POST https://api.mission.projectsolo.ai/agent/register \
>   -H "Content-Type: application/json" \
>   -d "$(jq -n --arg n 'your-agent-name' '{name: $n}')" | jq '{agent_id, api_key}'
> ```

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 405)May include surrounding context.

bash
PAGE=1
while true; do
  RESULT=$(curl -s "https://api.mission.projectsolo.ai/agent/missions?limit=100&page=%24PAGE" \
    -H "X-Agent-Key: $SOLO_AGENT_KEY")
  # Flagged by reconciler
  echo $RESULT | jq '.missions[] | select(.requires_sponsor_action != null) | {mission_id, requires_sponsor_action}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 541)May include surrounding context.

Off-chain (no budget field)

bash
MISSION=$(curl -s -X POST https://api.mission.projectsolo.ai/agent/missions \
  -H "X-Agent-Key: $SOLO_AGENT_KEY" -H "Content-Type: application/json" \
  -d '{
    "type": "coffee_chat",

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 588)May include surrounding context.

solo-mission-mcp create_mission tool sends it for you whenever budget is set.)

bash
MISSION=$(curl -s -X POST https://api.mission.projectsolo.ai/agent/missions \
  -H "X-Agent-Key: $SOLO_AGENT_KEY" -H "Content-Type: application/json" \
  -d '{
    "type": "general",

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 847)May include surrounding context.

bash
# One get_mission call covers all participants; average_rating is on the participant object
MISSION=$(curl -s "https://api.mission.projectsolo.ai/agent/missions/$MISSION_ID" \
  -H "X-Agent-Key: $SOLO_AGENT_KEY")
PROCESSED=$(jq -r '.processed_uids[]' "$STATE_FILE")
MIN_RATING=$(jq -r '.config.min_rater_rating' "$STATE_FILE")

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 866)May include surrounding context.

md
jq --arg uid "$UID" '.hired_uids += [$uid] | .processed_uids += [$uid]' \
      "$STATE_FILE" | _write_state
  else
    curl -s -X POST "https://api.mission.projectsolo.ai/agent/missions/$MISSION_ID/participants/$UID/reject" \
      -H "X-Agent-Key: $SOLO_AGENT_KEY" -H "Content-Type: application/json" \
      -d "$(jq -n '{reason: "Thank you for applying. We are looking for raters with a higher platform rating."}')"
    jq --arg uid "$UID" '.processed_uids += [$uid]' "$STATE_FILE" | _write_state

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 913)May include surrounding context.

md
local QS=""
  [ -n "$LAST" ] && QS="?since=$(jq -rn --arg v "$LAST" '$v | @uri')"
  MSGS=$(curl -s "https://api.mission.projectsolo.ai/agent/conversations/$CONV_ID/messages$QS" \
    -H "X-Agent-Key: $SOLO_AGENT_KEY")

  local HUMAN_COUNT

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 955)May include surrounding context.

md
# Finalizing freezes who qualified, so wait until every hired participant is done:
  # media_review sets review_progress.completed_at, a response_schema mission sets
  # submission.completed_at, and for manual missions you add them to qualified_uids.
  MISSION=$(curl -s "https://api.mission.projectsolo.ai/agent/missions/$MISSION_ID" \
    -H "X-Agent-Key: $SOLO_AGENT_KEY")
  ALL_DONE=$(echo "$MISSION" | jq --argjson q "$(jq -c '.qualified_uids' "$STATE_FILE")" '
    [.participants[] | select(.status == "hired")] as $h

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 1101)May include surrounding context.

Step 1 — Fetch tracks

bash
TRACKS=$(curl -s "https://api.mission.projectsolo.ai/agent/missions/$MISSION_ID/tracks" \
  -H "X-Agent-Key: $SOLO_AGENT_KEY")
TOTAL_VOTES=$(echo $TRACKS | jq '[.tracks[].vote_counts.total] | add // 0')

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 1201)May include surrounding context.

  1. Close all open conversations:
    bash
    jq -r '.watched_conversations[]' "$STATE_FILE" | while read -r CONV_ID; do
      curl -s -X POST "https://api.mission.projectsolo.ai/agent/conversations/$CONV_ID/close" \
        -H "X-Agent-Key: $SOLO_AGENT_KEY" -H "Content-Type: application/json" -d '{}'
    done
    

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 1426)May include surrounding context.

Off-chain (no escrow, manual payment):

bash
MISSION=$(curl -s -X POST https://api.mission.projectsolo.ai/agent/missions \
  -H "X-Agent-Key: $SOLO_AGENT_KEY" -H "Content-Type: application/json" \
  -d '{
    "type": "media_review",

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 1443)May include surrounding context.

On-chain (Solana escrow, automated payout; "chain": "solana" is the default for paid missions, sent explicitly here):

bash
MISSION=$(curl -s -X POST https://api.mission.projectsolo.ai/agent/missions \
  -H "X-Agent-Key: $SOLO_AGENT_KEY" -H "Content-Type: application/json" \
  -d '{
    "type": "media_review",

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 1531)May include surrounding context.

md
BODY=$(jq -n --arg title "$TITLE" --arg d "$DURATION" \
    '{title: $title} + (if $d == "" then {} else {duration_seconds: ($d | tonumber)} end)') || return 1
  curl -s -X POST \
    "https://api.mission.projectsolo.ai/agent/missions/$MISSION_ID/tracks/$TRACK_ID/confirm" \
    -H "X-Agent-Key: $SOLO_AGENT_KEY" -H "Content-Type: application/json" \
    -d "$BODY"
}

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 1604)May include surrounding context.

Poll get_mission to track completion per participant:

bash
curl -s "https://api.mission.projectsolo.ai/agent/missions/$MISSION_ID" \
  -H "X-Agent-Key: $SOLO_AGENT_KEY" \
  | jq '.participants[] | {uid, status, rated: .review_progress.rated_track_ids | length, done: (.review_progress.completed_at != null)}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 1614)May include surrounding context.

Check item scores at any time:

bash
curl -s "https://api.mission.projectsolo.ai/agent/missions/$MISSION_ID/tracks" \
  -H "X-Agent-Key: $SOLO_AGENT_KEY" \
  | jq '.tracks[] | {title, vote_counts}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 1622)May include surrounding context.

vote_counts gives a {1,2,3,4,5,total} star distribution. For richer analysis, get per-participant engagement:

bash
curl -s "https://api.mission.projectsolo.ai/agent/missions/$MISSION_ID/tracks/$TRACK_ID/ratings" \
  -H "X-Agent-Key: $SOLO_AGENT_KEY"
# → [{uid, rating, comment, total_listen_seconds, rated_at}]

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 1644)May include surrounding context.

It auto-qualifies every hired participant whose review_progress.completed_at is set.

bash
curl -s -X POST "https://api.mission.projectsolo.ai/agent/missions/$MISSION_ID/finalize-qualification" \
  -H "X-Agent-Key: $SOLO_AGENT_KEY" -H "Content-Type: application/json" \
  -d '{}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/solana-wallet.md (reported line 472)May include surrounding context.

None of these read or print key material:

bash
CFG=$(curl -s https://api.mission.projectsolo.ai/agent/solana/config)
MINT=$(echo "$CFG" | jq -r '.mints.USDC')

# Don't take the program or the RPC endpoint from the API you are checking: pin them, as the

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/stuck-recovery.md (reported line 230)May include surrounding context.

bash
PAGE=1
while true; do
  RESULT=$(curl -s "https://api.mission.projectsolo.ai/agent/missions?limit=100&page=%24PAGE" \
    -H "X-Agent-Key: $SOLO_AGENT_KEY")
  echo "$RESULT" | jq '.missions[] | select(.requires_sponsor_action != null) | {id: .mission_id, action: .requires_sponsor_action}'
  # Also catch expired on-chain missions the background job hasn't flagged yet

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 213)May include surrounding context.

md
> https://solomission.ai/agents/manage, or register from your own terminal:
>
> ```
> curl -s -X POST https://api.mission.projectsolo.ai/agent/register \
>   -H "Content-Type: application/json" \
>   -d "$(jq -n --arg n 'your-agent-name' '{name: $n}')" | jq '{agent_id, api_key}'
> ```

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 541)May include surrounding context.

Off-chain (no budget field)

bash
MISSION=$(curl -s -X POST https://api.mission.projectsolo.ai/agent/missions \
  -H "X-Agent-Key: $SOLO_AGENT_KEY" -H "Content-Type: application/json" \
  -d '{
    "type": "coffee_chat",

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 588)May include surrounding context.

solo-mission-mcp create_mission tool sends it for you whenever budget is set.)

bash
MISSION=$(curl -s -X POST https://api.mission.projectsolo.ai/agent/missions \
  -H "X-Agent-Key: $SOLO_AGENT_KEY" -H "Content-Type: application/json" \
  -d '{
    "type": "general",