Back to skill

Security audit

TestFlight Seat Monitor

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a coherent TestFlight monitor, but it can save and repeatedly fetch arbitrary URLs instead of only TestFlight links.

Review before installing. Use it only with TestFlight URLs you personally trust, avoid importing shared batch-config.json files, and prefer a version that strictly validates https://testflight.apple.com/join/<code> and disables unsafe redirects before enabling scheduled checks.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
lib/check-single.sh:17
Finding
Insufficient URL Validation Enables Blind Server-Side Request Forgery## Vulnerability Details **File Location**: `testflight-monitor.sh:81-86`, `lib/check-single.sh:17-31`, and `lib/check-batch.sh:23-42` **Vulnerability Type**: Blind server-side request forgery caused by unrestricted URL fetching **Risk Level**: Medium ### Vulnerable Code `testflight-monitor.sh:81-86`: ```bash add) [[ $# -lt 2 ]] && { echo "Error: add requires a URL"; exit 1; } URL="$2" jq --arg url "$URL" '.links += [$url] | .links |= unique' "$SCRIPT_DIR/config/batch-config.json" > "$SCRIPT_DIR/config/batch-config.json.tmp" mv "$SCRIPT_DIR/config/batch-config.json.tmp" "$SCRIPT_DIR/config/batch-config.json" echo "✓ Added: $URL" ``` `lib/check-single.sh:17-31`: ```bash # Extract code from URL CODE=$(echo "$URL" | grep -oE '[A-Za-z0-9]{8}$' || true) if [[ -z "$CODE" ]]; then echo "Error: Invalid TestFlight URL: $URL" >&2 exit 1 fi # Look up app name APP_NAME=$("$LOOKUP" "$CODE" 2>/dev/null || echo "Beta $CODE") echo "Checking $URL..." # Fetch the page HTML=$(curl -sSL -H "User-Agent: Mozilla/5.0" "$URL" 2>&1 || true) ``` `lib/check-batch.sh:23-42`: ```bash # Read tracked links from config TRACKED_LINKS=$(jq -r '.links[]' "$CONFIG_FILE" 2>/dev/null || echo "") if [[ -z "$TRACKED_LINKS" ]]; then echo "No TestFlight URLs configured for monitoring." echo "Add URLs with: testflight-monitor.sh add <url>" exit 0 fi CHANGES=() while IFS= read -r URL; do # Extract code from URL CODE=$(echo "$URL" | grep -oE '[A-Za-z0-9]{8}$') # Look up app name APP_NAME=$("$LOOKUP" "$CODE" 2>/dev/null || echo "$CODE") # Check current status (suppress output) if bash "$CHECKER" "$URL" 2>&1 | grep -q "AVAILABLE"; then ``` ### Technical Analysis The checker treats a URL as valid whenever its final eight characters are alphanumeric. It does not require: - The `https` scheme - The exact `testflight.apple.com` host - The expected `/join/` path - The absence of embedded credentials or nonstandard ports - A public destination address - A saf ...[truncated 2500 chars]
Remediation
## Remediation Suggestions 1. Validate URLs before storing them and again immediately before every network request. 2. Require the exact expected structure: - Scheme: `https` - Host: `testflight.apple.com` - Port: default HTTPS port only - Path: exactly `/join/[A-Za-z0-9]{8}` - No username, password, fragment, or unexpected query parameters 3. Use a proper URL parser rather than a suffix-only regular expression. 4. Disable redirects with `--max-redirs 0`. If redirects are operationally required, validate every redirect target against the same strict origin policy. 5. Reject destinations resolving to loopback, private, link-local, multicast, reserved, and cloud metadata address ranges. Revalidate after DNS resolution to reduce DNS rebinding risk. 6. Add network safety limits such as: ```bash curl \ --fail \ --silent \ --show-error \ --connect-timeout 5 \ --max-time 15 \ --max-redirs 0 \ --proto '=https' \ --max-filesize 1048576 \ -H "User-Agent: Mozilla/5.0" \ "$URL" ``` 7. Reject invalid entries in `add` rather than allowing unsafe values to enter persistent configuration. 8. Treat network failures and unknown responses as `unknown`, not `full`, so that request failures do not corrupt monitoring state. 9. Consider enforcing outbound network policy at the runtime or container layer so the Skill can reach only the required Apple hostname.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (9)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The supplied code does only a narrow lookup function: it reads local JSON files and maps a provided TestFlight code to an app name. While this partially aligns with the phrase 'smart app lookups,' it does not implement the core declared purpose of monitoring TestFlight beta slot availability, performing silent batch checks, or alerting when slots open. The actual primary behavior is a local identifier lookup utility, which is materially narrower and different from the overall description.

Lp3

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding
The skill documents shell-based execution and cron-driven automation but does not declare any tool scope or allowed tools. This weakens the trust boundary for review and deployment because users and platforms cannot easily tell that shell access is required, increasing the chance of over-privileged or unexpectedly executable skills being installed.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
"auxSqon8": "Stream - An RSS Reader",
  "j0WQVihy": "Stream Status",
  "BTZRrfEX": "Strike",
  "dGjdmtXH": "sudo crabs",
  "D2nUIMEN": "Swaptize App",
  "FT9n1ncG": "SweeLOL",
  "Ib5WleeA": "T7 Chicken Plus",
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Missing User Warnings

Medium
Confidence
78% confidence
Finding
The phrase 'silent batch checking' suggests background or repeated activity without explicit user-facing disclosure of frequency, trigger conditions, or visibility. In a monitoring skill, undisclosed silent operation can lead to unexpected network activity, resource consumption, and user unawareness about ongoing checks, which increases the risk of misuse or deceptive behavior even if the core function is not overtly malicious.

Missing User Warnings

Low
Confidence
82% confidence
Finding
This markdown file explains that the skill tracks status in `config/batch-state.json` and elsewhere instructs users to add/remove monitored URLs, which implies ongoing writes to local files. The README does not explicitly warn users that running the skill will modify local configuration/state data, which is a user-data-affecting behavior under the markdown warning criterion.

Missing User Warnings

Low
Confidence
89% confidence
Finding
The skill encourages automated polling and lookup-table updates using curl against third-party services, but it does not clearly warn users that these operations generate outbound network traffic. In scheduled or isolated environments, undisclosed network activity can surprise users, leak usage patterns or monitored beta interests, and complicate policy compliance.

Natural-Language Policy Violations

Low
Confidence
80% confidence
Finding
This JSON file mixes English and non-English app names, including many Chinese-language titles, but provides no natural-language statement explaining locale targeting or offering a language/locale choice. Under the policy rule for language or locale constraints, forcing mixed or locale-specific naming without opt-in or justification can create ambiguity for users and downstream systems.

Vague Triggers

Low
Confidence
85% confidence
Finding
The manifest description says the skill will 'Monitor TestFlight beta availability with smart app lookups and silent batch checking,' but it does not define when the skill should be invoked or what specific user requests should trigger it. In a manifest file, this kind of broad capability wording can lead to ambiguous activation because there are no explicit trigger phrases, scope limits, or exclusion conditions.

Static analysis

No suspicious patterns detected.