Back to skill

Security audit

Shopify Product Uploader

Security checks for vulnerabilities and agentic risk

Overview

This Shopify uploader is purpose-aligned, but it asks users to paste a powerful store admin token into chat and keep it in long-term agent memory.

Review before installing. Use only with a dedicated Shopify custom app token scoped to the minimum workflows you need, rotate or revoke the token if exposed, and avoid using this skill unless OpenClaw provides isolated encrypted secret storage rather than ordinary chat/memory storage.

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
SKILL.md:30
Finding

Persistent Storage of a Privileged Shopify Access Token in Agent Memory

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 30–45
Vulnerability Type: Plaintext credential collection and persistent storage
Risk Level: High

Vulnerable Code Snippet

text
## Configuration (ask on first use if not set)
Before running any workflow, check that the following are configured in memory.
If missing, ask the user once and store in long-term memory:

SHOPIFY_STORE_HANDLE   # e.g. my-store (not the full URL)
SHOPIFY_ACCESS_TOKEN   # Admin API access token (starts with shpat_)
SHOPIFY_API_VERSION    # Default: 2025-01 (update annually)
DEFAULT_VENDOR         # Optional: store's default brand name
DEFAULT_CURRENCY       # Default: GBP
DEFAULT_LANGUAGE       # Default: en-GB
DEFAULT_STATUS         # Default: active (options: active | draft)
SHOPIFY_LOCATION_ID    # Fetched automatically on first inventory operation

Store these securely in memory under the key `shopify_config`.
Never log or repeat the access token back to the user.

Supporting instructions also direct the user to submit the credential through a conversational channel:

text
Set my Shopify config:
Store: my-store-name
Token: shpat_xxxxxxxxxxxxxxxxxxxx
Vendor: My Brand Name

This supporting snippet appears in CONFIG.md, lines 24–34.

Technical Analysis

The Skill instructs users to disclose a privileged Shopify Admin API access token in chat and then copies it into long-term agent memory. Although it says to store the token “securely” and never repeat it, the project defines no concrete secret-storage control, such as encryption at rest, a secrets-manager reference, access restrictions, automatic redaction, expiration, rotation, or deletion.

Sending the token as an authentication header to Shopify is necessary for the declared functionality. The insecure behavior is collecting the raw token through conversation and retaining it in general-purpose long-term memory rather than a dedicated credential store.

The documentation-only project canno ...[truncated 1881 chars]

Remediation
View remediation

Remediation Suggestions

  1. Do not accept raw API tokens through chat. Replace conversational credential entry with a protected configuration interface or deployment-time secret injection.

  2. Use a dedicated secrets manager. Store the token in an operating-system keychain, managed vault, or platform-native encrypted secret store. Long-term agent memory should contain only an opaque secret identifier.

  3. Apply automatic redaction. Detect Shopify token patterns such as shpat_... at input, telemetry, logging, error-reporting, transcript-export, and tool-output boundaries.

  4. Enforce destination validation. Before attaching the credential, construct the endpoint from a strictly validated store handle and require HTTPS with an exact Shopify-controlled hostname ending in .myshopify.com. Reject user-controlled URLs, embedded credentials, ports, path separators, and hostname suffix tricks.

  5. Minimize Shopify scopes. Request only scopes required by enabled workflows. For example, do not grant collection or inventory write access if those features are disabled. Separate destructive product-management capabilities where the platform permits it.

  6. Define credential lifecycle controls. Document token rotation, revocation, expiration where supported, secure removal, and incident-response procedures. Provide a command that deletes the secret from the credential store without exposing it.

  7. Prevent credential disclosure. Ensure the token cannot appear in confirmations, generated URLs, exception messages, debug output, reports, model context beyond the authenticated request, or subsequent memory retrieval.

  8. Correct the documentation. Remove unsupported assurances that memory storage is inherently secure or exclusively local. State the actual storage mechanism and its security boundaries.

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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (12)

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 · CONFIG.md (reported line 18)May include surrounding context.

md
- `write_collections` — assign products to collections
   - `read_collections` — list existing collections
5. Click "Save" then "Install app"
6. Copy the "Admin API access token" (starts with `shpat_`)
   ⚠️ You only see this once — save it somewhere safe

---

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 · CONFIG.md (reported line 86)May include surrounding context.

md
- `write_collections` — assign products to collections
   - `read_collections` — list existing collections
5. Click "Save" then "Install app"
6. Copy the "Admin API access token" (starts with `shpat_`)
   ⚠️ You only see this once — save it somewhere safe

---

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The guide explicitly instructs users to paste a private Shopify Admin API token into chat, which is a highly sensitive credential that grants product, inventory, and collection management access. Even if the system claims to store it 'securely in memory,' transmitting admin credentials through a chat interface materially increases the risk of leakage through logs, prompt history, debugging, or downstream integrations.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
96% confidence
Finding

The setup section explicitly guides the user to obtain a Shopify Admin API access token and provide it to the bot. Because the token grants privileged API access, any exposure via chat history, local memory, debugging output, or compromise of the bot environment could enable unauthorized product manipulation, inventory changes, and broader store abuse.

Content

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

md
## Setup

1. Create a Shopify Custom App with `write_products`, `read_products`, `write_inventory`, `write_collections` scopes
2. Copy your Admin API access token
3. Tell your OpenClaw bot: `Set my Shopify config: Store: my-store, Token: shpat_xxx`
4. Start uploading

Credential Access

High
Category
Privilege Escalation
Confidence
84% confidence
Finding

The skill instructs users to provide a Shopify Admin API access token and store it in agent memory for reuse. Even though it says not to log the token, long-term memory storage of high-privilege credentials expands the attack surface: other skills, prompt-injection paths, memory disclosure bugs, or accidental retrieval could expose credentials that grant administrative control over the store.

Content

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

text
SHOPIFY_STORE_HANDLE   # e.g. my-store (not the full URL)
SHOPIFY_ACCESS_TOKEN   # Admin API access token (starts with shpat_)
SHOPIFY_API_VERSION    # Default: 2025-01 (update annually)
DEFAULT_VENDOR         # Optional: store's default brand name
DEFAULT_CURRENCY       # Default: GBP

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

The explicit instruction to store the access token securely in memory under a predictable key (shopify_config) creates a clear secret-discovery target. In an agent environment, predictable secret locations make prompt injection, cross-skill access, or debugging/memory inspection more dangerous because an attacker knows exactly what to request or probe for.

Content

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

text

Store these securely in memory under the key `shopify_config`.
Never log or repeat the access token back to the user.

### Fetching location ID automatically
On first use of any inventory operation, fetch and store the primary location:

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The quality benchmark explicitly requires "UK English throughout," which is a language/locale constraint stated as a blanket rule. This can violate language/locale policy because it forces a specific locale without offering the user a choice or explaining a justified region-specific requirement.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README instructs users to paste a Shopify Admin API token directly into the bot, but does not warn that this is a highly sensitive credential with product, inventory, and collection write access. In an agent-based system, providing admin tokens to conversational memory materially increases the risk of credential exposure through logs, prompt leakage, memory retrieval, or misuse by other skills/components.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The overview states that the skill automatically generates titles, descriptions, and tags in UK English, and later rules reinforce "UK English always." This forces a specific locale rather than offering user choice or limiting it to clearly justified region-specific use.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The activation section includes broad phrases like "add to my store" and explicitly allows "or similar" matches, which can cause the skill to trigger on ambiguous user requests. In a high-impact commerce skill that can create, update, archive, or delete products, accidental activation increases the chance of unintended administrative actions or premature collection of sensitive configuration such as store identifiers and API tokens.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The destructive-action triggers include generic terms such as "remove," "hide from store," and "take down," which are common in ordinary conversation and may match requests not intended for Shopify administration. Because this workflow can archive, unpublish, or permanently delete products, ambiguous triggering materially raises the risk of unauthorized or mistaken destructive changes.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The SEO rules say "UK English always" and "Prices in GBP (£) — never USD," which imposes language and locale behavior across all uses. This is a natural-language policy issue unless the skill is explicitly restricted to UK-only stores or provides a user/store-level locale choice.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.