Back to skill

Security audit

Looper

Security checks for vulnerabilities and agentic risk

Overview

This skill is a real Looper integration, but it gives agents broad authority to create accounts, store admin keys, and run persistent automations that can publish or change repositories.

Review this before installing. Only use it with an account and repositories you are comfortable letting Looper manage. Prefer pre-created keys stored in a secret manager, avoid inline passwords or API keys in prompts, confirm every GitHub connection and auto-publish loop, and do not set LOOPER_API_URL unless you fully trust the destination.

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

Error
Location
scripts/looper-api.sh:7
Finding

Administrator API Key Disclosure Through an Unvalidated API Base URL

Content
View full analysis

Vulnerability Details

File Location: scripts/looper-api.sh, lines 7–45
Vulnerability Type: Unvalidated destination for authenticated API requests
Risk Level: High

Vulnerable Code

bash
API_URL="${LOOPER_API_URL:-https://api.looper.bot}"
KEY="${LOOPER_ADMIN_KEY:-}"

if [ -z "$KEY" ]; then
  echo "Error: LOOPER_ADMIN_KEY not set. Sign up at POST $API_URL/api/signup" >&2
  exit 1
fi

case "${1:-help}" in
  loops)
    curl -s "$API_URL/api/loops" -H "Authorization: Bearer $KEY"
    ;;
  loop)
    # Usage: looper-api.sh loop <id>
    curl -s "$API_URL/api/loops/$2" -H "Authorization: Bearer $KEY"
    ;;
  runs)
    # Usage: looper-api.sh runs <loop-id>
    curl -s "$API_URL/api/loops/$2/runs" -H "Authorization: Bearer $KEY"
    ;;
  trigger)
    # Usage: looper-api.sh trigger <loop-id>
    curl -s -X POST "$API_URL/api/loops/$2/run" -H "Authorization: Bearer $KEY"
    ;;
  toggle)
    # Usage: looper-api.sh toggle <loop-id> true|false
    curl -s -X PATCH "$API_URL/api/loops/$2" \
      -H "Authorization: Bearer $KEY" \
      -H "Content-Type: application/json" \
      -d "{\"enabled\": $3}"
    ;;
  github)
    # Show GitHub connection status
    curl -s "$API_URL/api/github/status" -H "Authorization: Bearer $KEY"
    ;;
  tenant)
    # Show current tenant info
    curl -s "$API_URL/api/tenant" -H "Authorization: Bearer $KEY"
    ;;

Technical Analysis

The script accepts LOOPER_API_URL directly from the process environment and uses it as the destination for every API request. It then attaches the sensitive LOOPER_ADMIN_KEY to those requests through the Authorization: Bearer header.

No validation restricts the URL to the legitimate https://api.looper.bot origin. There are no checks for the HTTPS scheme, expected hostname, embedded credentials, or an approved development-host allowlist. Consequently, any party capable of controlling the script's environment can redirect authenticated requests to an attacker-controlled server ...[truncated 1769 chars]

Remediation
View remediation

Remediation Suggestions

  1. Remove arbitrary production endpoint overrides and use a fixed trusted origin:

    bash
    readonly API_URL="https://api.looper.bot"
    
  2. If endpoint configurability is required for testing, validate it before reading or transmitting the key. Enforce an explicit allowlist of complete origins:

    bash
    API_URL="${LOOPER_API_URL:-https://api.looper.bot}"
    
    case "$API_URL" in
      "https://api.looper.bot")
        ;;
      *)
        echo "Error: untrusted LOOPER_API_URL" >&2
        exit 1
        ;;
    esac
    
  3. Maintain separate test credentials for non-production endpoints. Never send a production administrator key to development, staging, localhost, or user-defined hosts.

  4. Configure curl defensively:

    • Require HTTPS for authenticated production requests.
    • Use --fail-with-body --show-error.
    • Avoid following redirects, or explicitly prevent forwarding credentials across origins.
    • Reject URLs containing embedded credentials or unexpected ports.
  5. Minimize credential privileges. Prefer narrowly scoped API keys over an administrator key when commands only require loop-management permissions.

  6. Rotate any LOOPER_ADMIN_KEY that may have been used while LOOPER_API_URL pointed to an untrusted endpoint, then review loop, key, tenant, and integration activity for unauthorized changes.

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • 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 (26)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The description presents the skill as a general automation/content tool, but the document primarily enables administrative control over a third-party account, including signup, key issuance, GitHub connection, loop management, and external publishing. This mismatch can cause the skill to be selected in contexts where users do not expect credential provisioning, repository modification, or automated posting.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
96% confidence
Finding

The skill documents shell-based network operations but does not declare any tool scope or permission boundaries. That makes it easier for an agent runtime to invoke outbound commands and account-modifying API calls without an explicit least-privilege contract, increasing the chance of unintended external actions.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill uses broad activation wording such as content creation, code improvement, social posting, and recurring workflows, which can cause over-selection for many common requests. In this case that is risky because the selected skill carries powerful external side effects including account creation, GitHub linkage, and automated publishing.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
92% confidence
Finding

The signup example transmits user email and password to an external third-party service and returns a privileged admin key. External transmission is expected for this integration, but it is still security-relevant because it handles account credentials and bootstraps privileged access to Looper.

Content

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

1. Sign Up

bash
curl -X POST https://api.looper.bot/api/signup \
  -H "Content-Type: application/json" \
  -d '{"email": "you@example.com", "password": "your-password"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
92% confidence
Finding

The signup example transmits user email and password to an external third-party service and returns a privileged admin key. External transmission is expected for this integration, but it is still security-relevant because it handles account credentials and bootstraps privileged access to Looper.

Content

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

1. Sign Up

bash
curl -X POST https://api.looper.bot/api/signup \
  -H "Content-Type: application/json" \
  -d '{"email": "you@example.com", "password": "your-password"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

The login example transmits account credentials to an external service to retrieve tenant-related access context. While expected for authentication, it remains sensitive because credentials may be exposed in shell history, logs, or misuse by an over-permissioned agent.

Content

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

2. Login (if you need tenant info later)

bash
curl -X POST https://api.looper.bot/api/login \
  -H "Content-Type: application/json" \
  -d '{"email": "you@example.com", "password": "your-password"}'

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The Blog Kit and Social Kit sections describe scheduled generation and auto mode publishing/committing, but do not clearly warn that they can directly modify a GitHub repository or publish to external platforms. Without that warning, an agent or user may treat these examples as routine content assistance rather than autonomous external write operations.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

This API call sends a privileged bearer token and configures a scheduled loop that can automatically generate and commit content into a GitHub repository. In this skill's context, the external transmission is more dangerous because it enables persistent automated repository modification on a schedule.

Content

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

Generates and commits blog posts to your GitHub repo on a schedule.

bash
curl -X POST https://api.looper.bot/api/loops \
  -H "Authorization: Bearer <key>" \
  -H "Content-Type: application/json" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
87% confidence
Finding

The analyze loop creation sends repository-targeting configuration and a privileged token to an external service for recurring code review or changes. Even if framed as analysis, it can influence code workflows and may later propose or apply modifications depending on service behavior.

Content

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

Reviews your codebase and suggests or applies improvements.

bash
curl -X POST https://api.looper.bot/api/loops \
  -H "Authorization: Bearer <key>" \
  -H "Content-Type: application/json" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

The Social Kit example transmits configuration for third-party posting, including another service API key embedded inside the prompt payload, and enables auto mode publishing. This is especially dangerous because it mixes secrets with generated content inputs and can result in unattended publication to external platforms.

Content

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

Social Kit template ID: 7431b897-396f-4542-8e32-d8d1c5e445a2

bash
curl -X POST https://api.looper.bot/api/loops \
  -H "Authorization: Bearer <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 · SKILL.md (reported line 143)May include surrounding context.

List your loops

bash
curl -s https://api.looper.bot/api/loops \
  -H "Authorization: Bearer <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 149)May include surrounding context.

List your loops

bash
curl -s https://api.looper.bot/api/loops \
  -H "Authorization: Bearer <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 155)May include surrounding context.

List your loops

bash
curl -s https://api.looper.bot/api/loops \
  -H "Authorization: Bearer <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 208)May include surrounding context.

List your loops

bash
curl -s https://api.looper.bot/api/loops \
  -H "Authorization: Bearer <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 216)May include surrounding context.

List your loops

bash
curl -s https://api.looper.bot/api/loops \
  -H "Authorization: Bearer <key>"

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

Toggling loop state is a mutating external action performed with a privileged token. In this skill's context, this can disable or enable automated workflows that publish content or affect repositories, so it should not be treated as a routine low-risk request.

Content

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

Toggle loop on/off

bash
curl -X PATCH https://api.looper.bot/api/loops/<loop-id> \
  -H "Authorization: Bearer <key>" \
  -H "Content-Type: application/json" \
  -d '{"enabled": false}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
92% confidence
Finding

Triggering a run manually is a mutating action that can immediately cause content generation, repository modification, or social posting depending on loop configuration. The danger is amplified because the effect may be indirect but externally visible and operationally significant.

Content

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

Trigger a run manually

bash
curl -X POST https://api.looper.bot/api/loops/<loop-id>/run \
  -H "Authorization: Bearer <key>"

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

Updating loop settings is a privileged external mutation that can alter schedules, models, and behavior of persistent automations. In practice, such changes may increase autonomy or cost, or expand the scope of future external actions without further review.

Content

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

Update loop settings

bash
curl -X PATCH https://api.looper.bot/api/loops/<loop-id> \
  -H "Authorization: Bearer <key>" \
  -H "Content-Type: application/json" \
  -d '{"schedule": "0 8 * * *", "model": "gpt-4o"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

Deleting a loop is a destructive external action authorized by the admin key. Although intended for management, it can remove business-critical automations or audit continuity if triggered unintentionally or by an over-broadly activated skill.

Content

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

Delete a loop

bash
curl -X DELETE https://api.looper.bot/api/loops/<loop-id> \
  -H "Authorization: Bearer <key>"

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

The GitHub connect flow sends a privileged bearer token to Looper and initiates OAuth linkage to a source-code account. In context this is intended behavior, but it is sensitive because it can extend the service's control over repositories and enable downstream automated modifications.

Content

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

bash
# Get OAuth URL
curl -s https://api.looper.bot/api/github/connect \
  -H "Authorization: Bearer <key>"

# Visit the returned URL to authorize, then check status:

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

The GitHub connect flow sends a privileged bearer token to Looper and initiates OAuth linkage to a source-code account. In context this is intended behavior, but it is sensitive because it can extend the service's control over repositories and enable downstream automated modifications.

Content

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

bash
# Get OAuth URL
curl -s https://api.looper.bot/api/github/connect \
  -H "Authorization: Bearer <key>"

# Visit the returned URL to authorize, then check status:

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

Generating a new API key is a privileged credential-creation action against an external service. This is high impact because it can expand access paths, create unmanaged secrets, and undermine auditability if an agent creates credentials without strong controls.

Content

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

md
-H "Authorization: Bearer <key>"

# Generate a new key
curl -X POST https://api.looper.bot/api/keys \
  -H "Authorization: Bearer <key>" \
  -H "Content-Type: application/json" \
  -d '{"name": "CI Key"}'

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The adoption flow instructs the agent to create a new third-party account and persist a newly issued admin key, effectively expanding the skill from workflow management into credential provisioning. This is dangerous because it enables unattended creation and long-term storage of privileged secrets that can later control publishing, repository actions, and other account functions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The adoption instructions tell the agent to obtain and save a Looper admin key but omit basic secret-handling safeguards. Because the key authorizes broad account actions, failure to warn about secure storage and non-disclosure increases the risk of credential leakage through logs, files, prompts, or downstream systems.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The file header says 'tenant-scoped operations only', suggesting limited-scope actions. However, the script requires LOOPER_ADMIN_KEY and uses it to perform privileged API actions such as triggering runs, toggling loop state, and retrieving tenant/account information, which is broader than the comment implies.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.