T09 · Insecure Skill Coding Practices
- Location
scripts/hydrogen_validate.mjs:1589- Finding
Default Telemetry Uploads Complete User Source Code
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The Shopify docs and validation skill is coherent, but its default telemetry can send full submitted code and file metadata off the machine without clear disclosure.
Review this skill before installing if you work with proprietary Shopify code. Set OPT_OUT_INSTRUMENTATION=true before use if you do not want validation inputs, searches, filenames, paths, or metadata sent for Shopify telemetry. Be cautious with the optional MCP npx command and prefer pinned, reviewed dependencies.
scripts/hydrogen_validate.mjs:1589Default Telemetry Uploads Complete User Source Code
scripts/storefront_validate.mjs:18096Telemetry Destination Can Be Redirected to an Arbitrary or Cleartext Host
scripts/liquid_validate.mjs:194Liquid Validation Telemetry Discloses Local Filesystem Paths and File Lists
skill.md:60Documentation Recommends Unpinned Remote Package Execution Through npx
package.json:15Broad Dependency Version Ranges and Missing Lockfile Create Non-Reproducible Installs
Skill accesses MCP server configuration files (mcp.json). MCP configs contain server URLs, authentication tokens, and tool definitions — reading them allows the skill to discover and potentially abuse other tool integrations.
# Add the Shopify Dev MCP server to Codex
codex mcp add shopify-dev -- npx -y @shopify/shopify.ai dev-server
# List MCP servers
codex mcp list
# Remove if needed
This code performs an HTTP POST to a remote endpoint and includes the user's submitted code in the payload via remainingContext/code, but the behavior has no user-facing disclosure at the call site or CLI interface. Because the transmitted content may contain proprietary source code or sensitive data, this is a safety-relevant network operation lacking an explicit warning.
The reportValidation call passes the entire code payload along with model/client/artifact metadata, and reportValidation serializes and sends that context to an external /mcp/usage endpoint. Sending user-supplied source code off-host is not necessary for validation itself and materially expands the skill's capability beyond local checking.
Although no manifest is available, the implemented purpose in this file is clearly GraphQL validation, yet the script also performs network telemetry by POSTing validation results plus the submitted code and client identifiers to SHOPIFY_DEV_BASE_URL. Sending user-supplied GraphQL content to a remote endpoint is not an obvious or necessary requirement for local schema validation and materially expands the skill's capability.
The reportValidation function posts telemetry to /mcp/usage and includes remainingContext, which later contains the user's query. In this file there is no confirmation prompt, user-facing log, or inline warning disclosing that query/context data is transmitted for instrumentation.
This file's observable purpose is validating Customer GraphQL operations from --code, --file, or stdin, but it also performs a network POST to a remote /mcp/usage endpoint. The telemetry payload includes the full GraphQL code plus client/model metadata, which is an additional capability not inherently required to perform local validation.
This code sends the full code value to reportValidation, and reportValidation posts remainingContext to /mcp/usage, which includes the user's GraphQL operation. Although instrumentation can be disabled via an environment variable, there is no confirmation prompt or explicit user-facing disclosure when user-supplied query content is transmitted off-box.
The script posts telemetry to /mcp/usage and includes remainingContext, which later contains the user's query, but there is no confirmation prompt, user-facing log, or warning comment describing this transmission. Because user-provided search terms may contain sensitive information, silently sending them to a remote service is a missing-warning issue for a code file.
The file’s implemented purpose is validating GraphQL function operations, but it additionally posts telemetry to a remote URL using fetch, including the GraphQL code, API name, model, client name/version, artifact ID, and revision. Sending user-supplied code and metadata off-box is not an obvious requirement for local validation and represents an additional capability beyond pure validation.
This code sends telemetry via fetch() to /mcp/usage and includes the full code value in the JSON payload, which can contain user-supplied GraphQL operations. Although opt-out is supported through an environment variable, there is no confirmation prompt or direct user-facing disclosure in this code path before transmitting that data.
The script posts usage data to /mcp/usage, including remainingContext populated with the user's query and optional client identifiers. While there is an opt-out environment variable, the file contains no confirmation prompt, user-facing log, or explanatory comment disclosing that this data is sent off-host.
The performSearch function transmits the user-provided query to https://shopify.dev/assistant/search via POST. Although remote search is part of the tool's purpose, this file does not include any user-facing notice that entered queries leave the local system and are sent to Shopify infrastructure.
The file is a component/code validation CLI, but it also posts validation results and the submitted code/context to a remote endpoint via fetch. With no manifest available and the script's validation-focused naming/documentation, this outbound telemetry is an additional capability not required to perform local TypeScript validation.
The script posts instrumentation data to /mcp/usage, including remainingContext that later contains the user's query. In this file there is no confirmation prompt, print/log disclosure, or comment warning users that their query and client metadata may be transmitted for instrumentation.
The script's apparent purpose is local theme/code validation, but it also implements an unrelated network-reporting capability via reportValidation(). In stateless mode it transmits validation context including filename, filetype, and the full code content, which is not an obvious requirement of validation itself when no manifest purpose authorizes telemetry.
The script posts telemetry to a remote /mcp/usage endpoint and includes contextual data in the request body. In stateless mode, that context explicitly contains the full code content, filename, and filetype, but the file provides no confirmation prompt, user-facing log, or warning comment disclosing that this data is transmitted.
When --file is provided, the script reads the specified file into memory and later passes that content as code in reportValidation. Because the subsequent network transmission is silent and this file contains no prompt, log, or warning comment explaining that local file contents may be uploaded, users are not informed of a privacy-relevant action.
The script sends the user's search query in the reportValidation context, which is then posted to /mcp/usage by the instrumentation function. While an opt-out environment variable exists, there is no visible prompt, console disclosure, or explanatory comment at the call site warning users that their query will be transmitted for instrumentation.
This code sends the user's GraphQL operation (code) along with client metadata to a remote /mcp/usage endpoint via reportValidation. Although instrumentation can be disabled with an environment variable, there is no confirmation prompt or explicit user-facing disclosure near the transmission path, so users may not realize their query contents are being sent off-host.
The script posts validation data to /mcp/usage, including remainingContext populated later with the user's query, but there is no confirmation prompt, visible log/print, or explanatory comment warning that query metadata is transmitted. For code files, network calls that transmit user or system data should have some form of user disclosure unless clearly covered elsewhere, and this file does not provide one.
This file’s evident purpose is local GraphQL validation for Payments Apps operations, but it also performs a network POST to a remote usage endpoint and includes the validated code plus client/model metadata in the payload. Sending user-supplied GraphQL documents off-host is not an obvious or necessary requirement for validation itself, especially when the skill purpose is otherwise unknown and the CLI behavior does not prominently disclose this side effect.
When --file is used, the script reads arbitrary local file contents and later forwards the resulting code value to the remote instrumentation call. The script does not warn users that providing a local file causes its contents to be loaded and potentially sent off-host, which is a missing disclosure for file access combined with network transmission.
This code sends the validated GraphQL code and associated client metadata to a network endpoint via reportValidation, but the script provides no confirmation prompt, visible notice, or stdout/stderr disclosure that user-supplied operation contents will be transmitted. For a code file, outbound transmission of user data should have some explicit user-facing warning unless clearly disclosed elsewhere in the skill description.
The script posts telemetry to /mcp/usage via reportValidation, including the user's query in the serialized context and the search result or error message. Although instrumentation can be disabled by environment variable, there is no confirmation prompt, visible log/print disclosure, or inline user-facing warning that this data will be transmitted.
With no manifest available, the evident primary behavior is searching Shopify docs and printing results. In addition to that, the script posts usage data including the query and result payload to a separate /mcp/usage endpoint, which is a distinct telemetry capability not implied by simple document search functionality.
Detected: suspicious.env_credential_access