Back to skill

Security audit

Dataify Live Research

Security checks for vulnerabilities and agentic risk

Overview

The main live-research workflow is coherent, but the package includes under-disclosed business-intelligence scripts and credential/preview handling risks that warrant Review before installation.

Review this skill before installing. The core research path sends your research question and fetched URLs through Dataify and stores local evidence files, which fits its purpose. The package also contains broader business-intelligence helpers and unsafe preview/token handling, so avoid using the extra scripts with sensitive or untrusted inputs and do not paste API tokens into chat or logs.

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

Warning
Location
scripts/wait_for_task.py:35
Finding
API Token Exposed in HTTP Query Strings## Vulnerability Details **File Location**: `scripts/wait_for_task.py:35-37`, `scripts/wait_for_task.py:102-107`, and `scripts/wait_for_task.py:126-132` **Vulnerability Type**: Sensitive credential exposure through URL query parameters **Risk Level**: Medium ### Vulnerable Code ```python def request_json(endpoint, params, api_key, timeout): url = endpoint + "?" + urllib.parse.urlencode(params) request = urllib.request.Request(url, method="GET") ``` ```python payload = request_json( STATUS_ENDPOINT, {"api_key": api_key, "task_id": task_id}, api_key, request_timeout, ) ``` ```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 API token is placed in the `api_key` query parameter for both task-status and result-download requests. `request_json()` serializes this parameter into the request URL. HTTPS encrypts the URL while it is in transit, but it does not prevent URLs from being captured by endpoint access logs, reverse proxies, network monitoring products, application telemetry, browser-like debugging facilities, or error-reporting systems. Query strings are commonly logged in their entirety. The subsequent replacement of the API key in the response body does not protect the request URL: ```python if api_key: text = text.replace(api_key, "<redacted>") ``` This redaction occurs only after the response has been received and therefore cannot remove the credential from infrastructure logs generated while handling the request. The network operation itself is necessary for task completion, but transmitting the credential in a URL exceeds the minimum exposure required. Other project clients already use an `Authorization: Bearer` header, demonstrating that header-based authentica ...[truncated 1203 chars]
Remediation
## Remediation Suggestions 1. Remove `api_key` from all query parameter dictionaries. 2. Transmit the credential through an authorization header: ```python request = urllib.request.Request( endpoint + "?" + urllib.parse.urlencode(params), headers={"Authorization": "Bearer {}".format(api_key)}, method="GET", ) ``` 3. Ensure redirect handling does not forward the authorization header to a different origin. Reject redirects whose scheme or hostname differs from the expected Dataify endpoint. 4. Retain only `task_id` and `type` as query parameters. 5. Add tests asserting that generated URLs never contain the token or an `api_key` parameter. 6. Review and sanitize existing proxy, gateway, and application logs, then rotate credentials that may already have been recorded. 7. Apply consistent bearer-token normalization before constructing the header so an existing `Bearer ` prefix is not duplicated.

T09 · Insecure Skill Coding Practices

Error
Location
scripts/catalog_builder.py:67
Finding
Shell Command Injection in Generated Curl Preview## Vulnerability Details **File Location**: `scripts/catalog_builder.py:67-77` **Vulnerability Type**: Shell command injection through unsafe command generation **Risk Level**: High ### 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}}'", ]) ``` The preview is generated from user-supplied parameters here: ```python payload_json = json.dumps(rows, ensure_ascii=False, separators=(",", ":")) if args.preview: print(build_curl(tool, payload_json)) return 0 ``` ### Technical Analysis `spider_parameters_json` contains values loaded from `--params-json` or `--values-file`. It is interpolated directly into a shell command between single quotes. No shell escaping is applied. JSON permits apostrophes inside string values because JSON strings use double quotes. An attacker can therefore include a single quote that terminates the shell argument, followed by shell syntax and another quote to restore parsing. The generated text is not executed automatically by this script, but it is explicitly formatted as a ready-to-run curl command. Copying it into a POSIX shell converts untrusted catalog parameters into executable shell syntax. For example, a conceptual parameter value containing: ```text '; attacker-controlled-command; echo ' ``` breaks out of the `-d 'spider_parameters=...'` argument when the preview is executed. Select-label mapping and required-field validation do not neutralize shell metacharacters. They va ...[truncated 1422 chars]
Remediation
## Remediation Suggestions 1. Prefer a non-executable structured preview, such as JSON containing the endpoint, headers with redacted authorization, and form fields. 2. If shell output is required, apply `shlex.quote()` independently to every dynamic argument: ```python import shlex arguments = [ "curl", "-X", "POST", 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}}", ] preview = " ".join(shlex.quote(argument) for argument in arguments) ``` 3. Do not attempt to escape only apostrophes manually; use a standard shell-quoting function. 4. Clearly label generated command text as display-only and warn that it contains user-controlled values. 5. Add tests using apostrophes, command substitutions, semicolons, newlines, backticks, and shell redirection characters. 6. Where feasible, avoid shell commands entirely and use the existing `urllib.request` submission implementation for actual requests.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (6)

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill instructs the agent to use shell, network, environment-variable access, and file operations, but no permissions are declared. That creates a transparency and governance gap: a user or platform may believe the skill is low-risk research-only behavior while it can actually execute code, access tokens, write state, and make outbound requests.

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding
The documented purpose limits the skill to open-ended research briefs, but the behavior reportedly extends into competitor analysis, scraping workflows, lead intelligence, brand monitoring, and structured raw data collection. This mismatch is dangerous because it can bypass user expectations, policy review, and safety gating for higher-risk collection and surveillance-like use cases.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The workflow explicitly accepts --competitor and incorporates competitor terms into search generation, despite the manifest stating the skill should not be used for competitor-specific analysis. This creates a policy-bypass capability that can enable collection and packaging of competitive intelligence the surrounding product claims to prohibit.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The lead workflow performs prospecting and qualification by searching company profiles and assigning qualification scores, which goes beyond a neutral cited research brief. In context, this is a scope and governance issue because the code enables targeted sales-intelligence behavior not described or justified by the skill's stated purpose.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
Preview mode prints a fully formed curl command that includes the complete request payload, which may contain sensitive research inputs or proprietary query parameters. Because preview output is commonly copied to terminals, logs, tickets, or chat, this creates an avoidable disclosure path even though it does not directly expose the API token value itself.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
This code performs live network searches and remote page fetches automatically via `search(...)` and `unlock(...)` during normal execution, but it does not provide any explicit user-facing disclosure, confirmation, or logging designed to warn the operator that external requests will be made. In a research skill, this can expose sensitive user questions, trigger unintended outbound traffic, and contact third-party sites without informed consent, especially when run in autopilot or resumed modes.

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

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