Back to skill

Security audit

Dataify Price Intelligence

Security checks across malware telemetry and agentic risk

Overview

This price-comparison skill mostly performs Dataify price collection, but it bundles unrelated Amazon review scraping and handles the Dataify token in a way that can expose it in request URLs.

Review this skill before installing. Use a dedicated, revocable Dataify token, avoid running generated curl previews with untrusted input, and be aware that the bundle may add Amazon review-scraping behavior beyond price comparison. Rotate the token if it has already been used through this task monitor and you are concerned about URL logging.

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 (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/wait_for_task.py:32
Finding
API Token Exposed in HTTP Query Parameters<![CDATA[ ## Vulnerability Details **File Location**: `scripts/wait_for_task.py:32-33, 105-110, 124-128` **Duplicate Location**: `_dependencies/skills/dataify-task-operations/scripts/wait_for_task.py:32-33, 105-110, 124-128` **Vulnerability Type**: Sensitive credential exposure through URL query parameters **Risk Level**: High ### Vulnerable Code ```python def request_json(endpoint, params, api_key, timeout): url = endpoint + "?" + urllib.parse.urlencode(params) request = urllib.request.Request(url, method="GET") ``` The function is invoked with the long-lived API token included in `params`: ```python payload = request_json( STATUS_ENDPOINT, {"api_key": api_key, "task_id": task_id}, api_key, request_timeout, ) ``` The same behavior occurs when downloading completed task results: ```python if status == SUCCESS_STATUS: return request_json( DOWNLOAD_ENDPOINT, {"api_key": api_key, "task_id": task_id, "type": "json"}, api_key, request_timeout, ) ``` ### Technical Analysis The polling implementation encodes `DATAIFY_API_TOKEN` directly into request URLs, producing requests such as: ```text https://scraperapi.dataify.com/task_status?api_key=<token>&task_id=<task-id> ``` Although HTTPS protects the request while it is in transit, query strings are routinely captured by web server access logs, reverse proxies, API gateways, monitoring products, network debugging tools, and error telemetry. Consequently, placing a long-lived credential in the URL substantially increases its exposure surface. The response-body replacement performed elsewhere in the function only redacts the token if it appears in the response. It does not remove the token from the outbound request URL or from infrastructure logs. This behavior also conflicts with the Skill's documented safety requirement not to expose tokens in logs. Authentication is necessary for task monitoring, but placing the credential in the URL exceeds t ...[truncated 1269 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `api_key` from all query parameter dictionaries. 2. Authenticate using an HTTP authorization header: ```python def request_json(endpoint, params, api_key, timeout): url = endpoint + "?" + urllib.parse.urlencode(params) request = urllib.request.Request( url, headers={"Authorization": "Bearer {}".format(api_key)}, method="GET", ) ``` 3. If the provider does not support authorization headers, prefer a POST request with the credential in the body and explicitly configure all infrastructure to redact that field. 4. Ensure application, gateway, reverse-proxy, and observability logs redact authentication headers and sensitive parameters. 5. Avoid including credentials in exception messages, debug output, resume commands, or dry-run output. 6. Apply the same correction to both copies of `wait_for_task.py` to prevent the vulnerable bundled dependency from remaining executable. 7. Rotate API tokens that may already have been transmitted through query strings, and review historical logs for unintended credential retention. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/catalog_builder.py:68
Finding
Shell Injection in Generated Curl Preview<![CDATA[ ## Vulnerability Details **File Location**: `scripts/catalog_builder.py:68-78, 123-128` **Duplicate Location**: `_dependencies/skills/dataify-task-operations/scripts/catalog_builder.py:68-78, 123-128` **Vulnerability Type**: Command injection through unsafe shell-command generation **Risk Level**: Medium ### Vulnerable Code ```python def build_curl(tool, spider_parameters_json): return " \\\n".join([ "curl -X POST '{}'".format(BUILDER_URL), " -H 'Authorization: Bearer $DATAIFY_API_TOKEN'", " -H 'Content-Type: application/x-www-form-urlencoded'", " -d 'spider_name={}'".format(tool["spider_name"]), " -d 'spider_id={}'".format(tool["tool_sign"]), " -d 'spider_parameters={}'".format(spider_parameters_json), " -d 'spider_errors=true'", " -d 'file_name={{TasksID}}'", ]) ``` User-controlled parameter data reaches the generated command: ```python payload_json = json.dumps(rows, ensure_ascii=False, separators=(",", ":")) if args.preview: print(build_curl(tool, payload_json)) return 0 ``` ### Technical Analysis The preview generator inserts JSON containing user-controlled values into a shell command enclosed by single quotes: ```python " -d 'spider_parameters={}'".format(spider_parameters_json) ``` JSON encoding does not escape characters according to shell syntax. In particular, a single quote inside a JSON string terminates the shell's single-quoted argument. An attacker can then append shell operators and commands before reopening or completing the quote context. For example, a crafted parameter value conceptually containing: ```text '; touch /tmp/catalog-preview-executed; # ``` would be embedded into the displayed curl command without shell-safe escaping. The Python program only prints the command and does not execute it itself. Exploitation therefore requires a user, automation system, or agent to copy or execute the generated preview. Nevertheless, the ou ...[truncated 1442 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not represent untrusted request data as a copy-paste shell command. Prefer a structured, non-executable preview: ```python print(json.dumps({ "method": "POST", "url": BUILDER_URL, "headers": { "Authorization": "Bearer <redacted>", "Content-Type": "application/x-www-form-urlencoded", }, "form": { "spider_name": tool["spider_name"], "spider_id": tool["tool_sign"], "spider_parameters": rows, "spider_errors": "true", "file_name": "{{TasksID}}", }, }, ensure_ascii=False, indent=2)) ``` 2. If executable shell output is required, quote every dynamic argument using `shlex.quote` rather than manually adding single quotes: ```python import shlex argument = "spider_parameters={}".format(spider_parameters_json) line = " -d {}".format(shlex.quote(argument)) ``` 3. Apply shell-safe quoting to all dynamic fields, including catalog-derived `spider_name` and `tool_sign`. 4. Add tests containing single quotes, newlines, command substitutions, semicolons, backticks, and shell redirection characters. 5. Clearly mark any preview as non-executable unless it has been generated with platform-appropriate escaping. 6. Apply the correction to both the root and bundled dependency copies of `catalog_builder.py`. ]]>
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 (29)

Lp3

Medium
Category
MCP Least Privilege
Confidence
96% confidence
Finding
The skill instructs the agent to use shell execution, environment-variable access, file read/write, and networked scripts, but it does not declare permissions or constrain those capabilities in the manifest. That creates hidden operational power: a caller may believe this is a simple price-comparison skill while it can execute code, access local state, and make outbound requests, increasing the blast radius if the backing scripts are buggy or abused.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding
The skill is presented as a bounded price-intelligence tool, but the detected behavior indicates materially broader scraping and intelligence-gathering capabilities, including reviews, news, maps, and general page unlocking. This mismatch is dangerous because it defeats user and platform expectations about scope, consent, data handling, and external access, making over-collection or misuse more likely.

Description-Behavior Mismatch

High
Confidence
92% confidence
Finding
This dependency exposes a generic task-monitoring interface that is not obviously scoped to price-intelligence, creating a capability mismatch between the parent skill’s stated purpose and the referenced sub-skill. That mismatch can cause the agent to invoke broader task-handling behavior than intended, increasing the chance of unintended data flow, confusing orchestration, or abuse of long-running task results in contexts unrelated to price comparison.

Description-Behavior Mismatch

High
Confidence
94% confidence
Finding
This shared workflow supports review, lead, and brand intelligence modes even though the declared skill purpose is price intelligence. That scope expansion increases the chance that the skill is used to collect or process unrelated data, creating a capability mismatch that can bypass user expectations and governance boundaries.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
The code explicitly performs lead-generation and company qualification tasks, including identifying hiring signals and scoring companies. In a skill presented as price intelligence, this is an undisclosed secondary capability that can be used for prospecting and profiling beyond the user's stated intent.

Context-Inappropriate Capability

Medium
Confidence
94% confidence
Finding
The workflow includes review collection plus sentiment and theme analysis that are unrelated to simple price comparison. While not inherently dangerous, the hidden expansion in collection scope can cause unexpected data gathering and decision support outside the advertised function.

Context-Inappropriate Capability

Medium
Confidence
94% confidence
Finding
The code adds brand-monitoring and news-risk analysis logic, which goes beyond price monitoring into reputation and risk surveillance. In context, this undisclosed multifunction behavior makes the skill more dangerous because users and reviewers may approve it for a narrower purpose than it actually serves.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
This script is a generic task-submission wrapper that can invoke any catalog tool and wait for completion, not a narrowly scoped price-intelligence function. In an agent-skill setting, that broader-than-declared capability is dangerous because it expands what the skill can cause the platform to do and weakens least-privilege assumptions made by users and orchestrators.

Context-Inappropriate Capability

Medium
Confidence
97% confidence
Finding
The required --tool-sign argument is passed through to catalog lookup, allowing callers to select any tool present in the shared catalog rather than only price-comparison tools. In a multi-tool agent environment, this creates a capability-bypass issue where the skill can be repurposed for unrelated scraping or data operations inconsistent with its stated scope.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The dependency skill’s declared identity and purpose are for Amazon review/comment scraping, which does not match the parent skill’s stated price-intelligence function. This kind of capability drift can cause an agent to invoke a data-collection workflow outside the user’s expected scope, leading to unauthorized scraping, compliance issues, and incorrect task execution.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The workflow explicitly submits Amazon comment/review collection jobs and waits for final results, rather than producing normalized price findings. In context, this means the agent may perform unintended third-party data extraction under a misleading skill umbrella, increasing the risk of unauthorized behavior, user deception, and misuse of paid API actions.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The Builder request is hard-coded to `amazon.com` and `amazon_comment_by-url`, proving the operational behavior is review extraction rather than price intelligence. Hard-coded off-scope targets make accidental or deceptive invocation more likely and can trigger unintended external requests and billing against a user’s API token.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The embedded skill is for Amazon review scraping, which is materially unrelated to the parent skill's declared purpose of multi-seller price comparison. This kind of capability mismatch is dangerous because it can cause the agent to invoke data-collection behavior outside the user's expected scope, increasing the risk of unauthorized scraping, policy violations, and accidental exfiltration of user-supplied URLs or credentials to an external service.

Intent-Code Divergence

Medium
Confidence
88% confidence
Finding
The file contains contradictory instructions about whether to direct users to the Dataify Dashboard on successful completion. Conflicting security and UX guidance can cause inconsistent agent behavior, including unnecessary disclosure of third-party links, surprise navigation, or bypass of least-surprise controls around external services.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
The agent is scoped to collect Amazon comment data, but the parent skill is explicitly described as price intelligence. This capability mismatch can cause the orchestration layer to invoke a scraper that gathers non-price user-generated content, expanding data collection beyond the declared purpose and enabling unintended scraping behavior or policy bypass through misclassification.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
This script implements Amazon comment/review scraping task submission and optional result polling, which is materially unrelated to the declared price-intelligence purpose of comparing normalized prices across sellers. In a skill ecosystem, this kind of capability mismatch is dangerous because it can covertly expand data collection scope, trigger unintended scraping of user-supplied targets, and bypass user expectations or policy controls tied to the manifest.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
The hardcoded spider configuration targets a single Amazon product URL for comment scraping, even though the enclosing skill is explicitly scoped away from one-off raw product lookups and focused on price comparison. This increases risk by embedding an unjustified collection path that can be repurposed for off-scope scraping and makes the skill more dangerous in context because Amazon review extraction is not needed for price monitoring.

Description-Behavior Mismatch

Medium
Confidence
87% confidence
Finding
The shared workflow exposes review, lead, and brand-monitoring modes even though the skill is described as price intelligence. This scope expansion increases the attack and misuse surface, enabling collection and analysis flows unrelated to the declared purpose and potentially bypassing user expectations or platform policy boundaries.

Context-Inappropriate Capability

High
Confidence
94% confidence
Finding
Lead-generation logic is materially outside price-intelligence scope and targets company profiling sources such as LinkedIn and Crunchbase. In context, this makes the skill more dangerous because it supports a separate intelligence-gathering use case that can facilitate unauthorized prospecting or entity profiling under a misleading manifest.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
Review-intelligence collection is unrelated to the stated purpose of comparing prices. This broadens data collection behavior and can cause the skill to gather opinion/reputation content without users realizing the skill does more than pricing analysis.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
Brand/news monitoring capabilities are outside the advertised price-intelligence scope. This mismatch increases risk because the skill can perform broader reputational surveillance and news collection than a user or reviewer would expect from the manifest.

Vague Triggers

Medium
Confidence
76% confidence
Finding
The activation text is broad enough to trigger this operational skill in contexts beyond the user's likely intent, such as any mention of task IDs or token configuration. In an agentic system, overbroad invocation can cause unintended monitoring actions, credential-handling prompts, or workflow continuation without clear user authorization.

Vague Triggers

Medium
Confidence
95% confidence
Finding
Enabling implicit invocation without trigger constraints allows the agent platform to auto-select this task-monitoring skill in situations where the user did not explicitly request it. In a skill ecosystem, that can lead to unintended polling of external tasks, leakage of task results into unrelated conversations, or unnecessary privilege expansion through autonomous tool chaining.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
User-provided queries and source URLs are transmitted to external Dataify endpoints and scrapers, but execution-time disclosure is limited. This creates a privacy and data-handling risk because users may not realize their inputs are being sent off-platform to third-party services.

Missing User Warnings

Low
Confidence
75% confidence
Finding
The skill directs execution of a Python script that sends external network requests using a stored API token, but it does not clearly warn users that their inputs and credentials will be used for third-party transmission. In an agent setting, insufficient disclosure about outbound requests and credential use can undermine informed consent and lead to accidental use of sensitive stored tokens.

VirusTotal

VirusTotal findings are pending for this skill version.

View on VirusTotal

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
_dependencies/skills/dataify-task-operations/scripts/task_runtime.py:38

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/task_runtime.py:38