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

Content
View full analysis

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
View 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"
  1. Reject invalid entries in add rather than allowing unsafe values to enter persistent configuration.
  2. Treat network failures and unknown responses as unknown, not full, so that request failures do not corrupt monitoring state.
  3. 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.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

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.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · config/testflight-codes.json (reported line 682)May include surrounding context.

json
"auxSqon8": "Stream - An RSS Reader",
  "j0WQVihy": "Stream Status",
  "BTZRrfEX": "Strike",
  "dGjdmtXH": "sudo crabs",
  "D2nUIMEN": "Swaptize App",
  "FT9n1ncG": "SweeLOL",
  "Ib5WleeA": "T7 Chicken Plus",

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.