Back to skill

Security audit

Etsy Autolist

Security checks for vulnerabilities and agentic risk

Overview

The skill is not clearly malicious, but it asks for Etsy credentials and can create shop drafts while its description overstates and misstates what the code actually does.

Review before installing. Only use this with an Etsy account where you are comfortable granting API write access, and inspect or edit the hardcoded LISTINGS data first because the script will create those specific draft listings rather than deriving listings from your own product files. The missing OAuth helper also means setup is incomplete as packaged.

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
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (13)

Tainted flow: 'ETSY_SHOP_ID' from os.environ.get (line 13, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/create_listings.py (reported line 75)May include surrounding context.

python
"state": "draft",
    }
    
    resp = requests.post(
        f"{BASE_URL}/applications/shops/{ETSY_SHOP_ID}/listings",
        headers=get_headers(),
        json=payload,

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The manifest overstates the skill's capabilities, claiming it creates listings from files, handles tagging, manages listings, and publishes drafts, while the documented behavior is much narrower. Security reviewers and users may trust the skill with sensitive credentials or business workflows under false assumptions, which increases the chance of misuse and unsafe operation.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
3. Save as secrets: `ETSY_CLIENT_KEY` and `ETSY_CLIENT_SECRET` in [Settings > Advanced](/?t=settings&s=advanced)
4. Get your Shop ID from your Etsy shop URL (etsy.com/shop/{shop_id})
5. Save as secret: `ETSY_SHOP_ID`
6. Run the OAuth helper to get your access token

## OAuth Setup (Required)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
3. Save as secrets: `ETSY_CLIENT_KEY` and `ETSY_CLIENT_SECRET` in [Settings > Advanced](/?t=settings&s=advanced)
4. Get your Shop ID from your Etsy shop URL (etsy.com/shop/{shop_id})
5. Save as secret: `ETSY_SHOP_ID`
6. Run the OAuth helper to get your access token

## OAuth Setup (Required)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
3. Save as secrets: `ETSY_CLIENT_KEY` and `ETSY_CLIENT_SECRET` in [Settings > Advanced](/?t=settings&s=advanced)
4. Get your Shop ID from your Etsy shop URL (etsy.com/shop/{shop_id})
5. Save as secret: `ETSY_SHOP_ID`
6. Run the OAuth helper to get your access token

## OAuth Setup (Required)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/create_listings.py (reported line 101)May include surrounding context.

python
3. Save as secrets: `ETSY_CLIENT_KEY` and `ETSY_CLIENT_SECRET` in [Settings > Advanced](/?t=settings&s=advanced)
4. Get your Shop ID from your Etsy shop URL (etsy.com/shop/{shop_id})
5. Save as secret: `ETSY_SHOP_ID`
6. Run the OAuth helper to get your access token

## OAuth Setup (Required)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding

The skill requests users to store secrets and use networked scripts, but the manifest does not declare any tool scope or permissions. This weakens transparency and reviewability, making it easier for a skill to access environment variables and external services without clear user expectation or policy enforcement.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The manifest says the skill 'Handles listing creation, tagging, pricing, and draft publishing,' which implies it performs publication-related actions. However, the in-file documentation states 'Manually publish drafts in your Etsy shop dashboard' and that the bot only creates drafts, indicating the skill does not itself publish listings. This is a direct description-behavior mismatch within the documented intent.

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 · scripts/create_listings.py (reported line 14)May include surrounding context.

python
ETSY_CLIENT_KEY = os.environ.get("ETSY_CLIENT_KEY", "")
ETSY_CLIENT_SECRET = os.environ.get("ETSY_CLIENT_SECRET", "")
ETSY_SHOP_ID = os.environ.get("ETSY_SHOP_ID", "")  # Your shop ID
BASE_URL = "https://api.etsy.com/v3"

# OAuth token (set manually after running oauth helper)
ETSY_ACCESS_TOKEN = os.environ.get("ETSY_ACCESS_TOKEN", "")

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The manifest says the skill creates listings from existing digital product files such as PDFs, templates, and spreadsheets, and manages listing metadata around those inputs. In this file, listings are predefined in code with static titles/descriptions and there is no code that reads, inspects, or derives listing data from existing product files, so the actual behavior is manual posting of hardcoded listings rather than file-based auto-creation.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

The file introduces the skill as 'Auto-create digital product listings on Etsy,' while the later 'After Creation' section states the bot creates only drafts and publishing must be done manually. This is not merely incomplete wording; it presents a broader automated listing-management intent up front that is contradicted by the later operational guidance.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

The manifest states the skill handles listing creation, tagging, pricing, and draft publishing. Here, the payload explicitly sets state to "draft" and the rest of the file only creates listings; there is no code to publish drafts, update listings, or perform broader listing management.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code performs an outbound HTTP POST to Etsy that transmits listing content and shop identifiers. While the script logs success and failure afterward, it does not disclose before the operation that data will be sent to Etsy, and the module docstring does not explicitly warn about that network transmission.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.