Back to skill

Security audit

Shopify Theme & Apps Detector

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly coherent for public Shopify audits, but it has concrete network-safety and generated-report risks that warrant review before installation.

Install only if you are comfortable with a review-level skill that makes outbound requests to user-supplied sites and writes local HTML reports. Use it only on public storefront URLs you trust, avoid running it from sensitive networks, and treat generated reports as untrusted HTML unless the report-generation step escapes scanned values and disables or discloses remote assets.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (2)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/store-scanner.mjs:34
Finding

SSRF Protection Bypass Through Unvalidated Redirects and Incomplete IP Filtering

Content
View full analysis
= 16 && Number(hostname.split(".")[1]) <= 31) ) { throw new Error(`Access to private address "${hostname}" is blocked.`); } return parsed.href; } catch (err) { throw new Error(`Invalid or unsafe URL "${value}": ${err.message}`); } } ``` ```javascript async function fetchWithTimeout(url, opts = {}) { try { validateSafeUrl(url); } catch (e) { throw e; } const controller = new AbortController(); const timer = setTimeout(() => controller.abort(), TIMEOUT_MS); try { const res = await fetch(url, { ...opts, signal: controller.signal, redirect: 'follow' }); return res; } finally { clearTimeout(timer); } } ``` ### Technical Analysis The scanner accepts a user-selected URL and attempts to prevent access to private services by inspecting the URL hostname before making an HTTP request. This protection is incomplete. The filter only rejects a subset of literal IPv4 representations. It does not comprehensively reject: - IPv4 link-local addresses, including cloud metadata services such as `169.254.169.254`. - IPv6 loopback, private, link-local, mapped IPv4, multicast, and reserved addresses. - Alternative ...[truncated 2689 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
assets/report-template.html:432
Finding

Stored HTML and Script Injection in Generated Audit Reports

Content
View full analysis
Remediation
View remediation
`, `&`, single quotes, and double quotes - Closing tags - Event-handler attributes - `javascript:` and `data:` URLs 10. Document escaping as a mandatory report-generation rule in `SKILL.md`. A safe text encoder should at minimum encode all HTML-significant characters: ```javascript function escapeHtml(value) { return String(value) .replaceAll('&', '&') .replaceAll('<', '<') .replaceAll('>', '>') .replaceAll('"', '"') .replaceAll("'", '''); } ``` URL values should be validated separately: ```javascript function safeHttpUrl(value) { const parsed = new URL(value); if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') { throw new Error('Unsafe URL scheme'); } return parsed.href; } ``` A report that does not require JavaScript should use a policy similar to: ```html
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (10)

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · assets/report-template.html (reported line 387)May include surrounding context.

html
<body>

<!-- ══ MULTI-SOURCE FAVICON LOADER ═══════════════════════════════ -->
<script>
function loadFavicon(img, domain) {
  if (!domain || domain === 'unknown.com') { showFallback(img); return; }

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · assets/report-template.html (reported line 522)May include surrounding context.

html
<div class="apps-grid">

      <!-- ── App card template (repeat per app) ── -->
      <div class="app-card high">
        <div class="app-header">
          <div class="app-logo">

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill explicitly instructs use of a Node-based scanner against arbitrary public store URLs, which implies outbound network access, but it does not declare any tool scope or allowed-tools boundary. Missing scope declarations can let an agent invoke network-capable execution without clear policy constraints, increasing the chance of unintended external requests or misuse beyond the user’s expectation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The template automatically makes client-side requests to third-party services such as Clearbit and Google to fetch favicons based on store and app domains. This leaks browsing/report context and user IP metadata to external parties without disclosure or consent, which is a real privacy and data-sharing issue in a reporting tool.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This section extracts broad fingerprinting artifacts such as tracking IDs, DNS prefetch targets, window globals, CSS namespaces, data attributes, JSON-LD, comments, body classes, and metadata that extend beyond the stated purpose of identifying Shopify themes and detectable apps. While the targets are public pages, the resulting evidence bundle enables richer third-party profiling and technology fingerprinting than users may expect from the declared scope, creating unnecessary privacy and recon risk.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The page scanner aggregates extensive internal page data, including inline script snippets, comments, globals, CSS patterns, tracking identifiers, and structured data, then returns it as a JSON bundle. This creates a scalable reconnaissance tool that can expose implementation details, analytics identifiers, and embedded integrations unrelated to simple theme/app detection, increasing the usefulness of the skill for profiling or downstream targeting.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill requires generating an HTML report in the current working directory, but the user-facing description does not clearly warn about this file creation side effect. Unannounced writes are lower severity here because the artifact is the intended output, but they can still surprise users, overwrite existing files, or leave behind local files containing scanned data.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

The document declares lang="en", and all visible interface text in the template is written in English, with no indication that users can select another language or that the skill is intentionally limited to an English-only audience. This can violate language or locale policies when a skill forces a specific language without opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The example connect.facebook.net/en_US/fbevents.js embeds the en_US locale directly in natural-language guidance. Because this file is a reference document rather than a region-specific compliance artifact, the example can be read as prescribing a specific language/locale without offering alternatives or noting that locale may vary.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The scanner sends an Accept-Language: en-US,en;q=0.9 header on page fetches, which imposes a specific language/locale preference regardless of user choice. The policy allows locale constraints only when users can opt in or when the constraint is clearly documented and justified, which is not present here.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.