Back to skill

Security audit

StartupPan

Security checks for vulnerabilities and agentic risk

Overview

This skill is openly for StartupPan voting and commenting, but it includes an ungated script that can automatically post votes and public comments under the user's API key.

Review before installing. Only use this with a StartupPan API key you are comfortable using for public actions, and avoid running the auto-engagement script unless you intend it to vote and post comments immediately on multiple debates.

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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (10)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The skill description frames the capability as general interaction with the platform, but the body promotes automated voting/commenting for XP and direct bearer-token API use. This mismatch is dangerous because it conceals automating engagement and influence operations, which could violate platform rules, mislead users about behavior, and cause unauthorized or manipulative actions under the user's credentials.

Credential Access

High
Category
Privilege Escalation
Content
#!/usr/bin/env bash
# StartupPan auto-engagement: vote + comment on debates
# Usage: ./engage.sh [count] [env_file]
# Requires: STARTUPPAN_API_KEY in environment or .env file

set -euo pipefail
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

External Script Fetching

High
Category
Supply Chain
Content
AUTH="Authorization: Bearer $STARTUPPAN_API_KEY"

echo "📊 Fetching debates..."
DEBATES=$(curl -s -H "$AUTH" "$BASE/debates")

if ! echo "$DEBATES" | python3 -c "import sys,json; json.load(sys.stdin)" 2>/dev/null; then
  echo "❌ Failed to fetch debates" >&2
Confidence
90% confidence
Finding
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill requires shell-capable binaries (`curl`, `python3`) but does not declare any explicit tool scope or allowed-tools policy. That makes the operational boundary unclear and can enable broader command execution than a reviewer or user would reasonably expect, increasing the chance of unintended network calls or misuse of secrets.

External Transmission

Medium
Category
Data Exfiltration
Content
env:
        - STARTUPPAN_API_KEY
      bins:
        - curl
        - python3
---
Confidence
88% confidence
Finding
The skill is explicitly designed to send authenticated requests to an external service using `curl` and an API key, which creates a real external transmission path for user actions and potentially sensitive content. In context this is expected behavior, but it still carries security risk because comments, votes, and bearer credentials are tied to a third-party platform and could be mishandled, over-shared, or triggered without sufficient user awareness.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The document says comments 'should be in Korean for community engagement,' which imposes a language preference as an instruction rather than presenting it as an optional user choice. Under the policy, forcing or directing a specific language without opt-in is a natural-language policy concern unless clearly justified as a region-specific constraint.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The script automatically submits votes and posts comments to a live third-party platform with no interactive confirmation, dry-run mode, or explicit user acknowledgement. In the context of a debate and leaderboard platform, this enables unattended opinion manipulation and unintended actions under the user's credentials, creating policy, reputational, and account-abuse risk.

External Transmission

Medium
Category
Data Exfiltration
Content
echo "🗳️ [$SIDE] $TITLE"

  # Vote
  VOTE_RES=$(curl -s -X POST -H "$AUTH" -H "Content-Type: application/json" \
    -d "{\"side\": \"$SIDE\"}" "$BASE/debates/$DID/vote" 2>/dev/null || echo '{"error":"failed"}')
  echo "  Vote: $(echo "$VOTE_RES" | python3 -c 'import sys,json; d=json.load(sys.stdin); print(d.get("message", d.get("error","ok")))' 2>/dev/null || echo 'sent')"
  VOTED=$((VOTED + 1))
Confidence
91% confidence
Finding
This POST request transmits a vote to an external service using the user's bearer token. External transmission is expected for the skill's purpose, but it is still security-relevant because it performs state-changing actions on behalf of the user and can be abused for unauthorized or unintended engagement if the script is run carelessly or embedded in a broader agent workflow.

External Transmission

Medium
Category
Data Exfiltration
Content
COMMENT="리스크 관리 없는 성장은 결국 무너집니다. 냉정하게 봐야 할 시점."
  fi

  COMMENT_RES=$(curl -s -X POST -H "$AUTH" -H "Content-Type: application/json" \
    -d "{\"debate_id\": \"$DID\", \"body\": \"$COMMENT\", \"side\": \"$SIDE\"}" \
    "$BASE/comments" 2>/dev/null || echo '{"error":"failed"}')
  echo "  Comment: $(echo "$COMMENT_RES" | python3 -c 'import sys,json; d=json.load(sys.stdin); print(d.get("message", d.get("error","ok")))' 2>/dev/null || echo 'sent')"
Confidence
93% confidence
Finding
This POST request sends a generated comment body and debate identifier to a third-party service, again using the user's API token. Because it publishes visible content externally, it carries integrity and reputational risk and can facilitate spam-like or manipulative behavior when automated across multiple debates.

Natural-Language Policy Violations

Low
Confidence
98% confidence
Finding
The script always posts predefined Korean comments, forcing a specific language/locale in generated user-facing content. There is no opt-in, configuration, or documentation indicating that the skill is intentionally limited to Korean-language operation.