Back to skill

Security audit

Dataify Agent Onboarding

Security checks for vulnerabilities and agentic risk

Overview

The skill supports Dataify setup, but it also ships broader task-running/search/scraping helpers and one task-waiting path exposes the API token in URL query strings.

Review this before installing if you only wanted simple setup help. Use it only with a Dataify token you are willing to let these scripts use for Dataify API calls, expect queries/URLs/task parameters to be sent to Dataify, and be aware that task waiting currently places the token in request URLs. Prefer a token with limited scope or easy rotation, and avoid running the broader workflow scripts unless you explicitly want those reports and local output files.

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

Warning
Location
scripts/wait_for_task.py:35
Finding

API Token Exposed in URL Query Strings

Content
View full analysis

Vulnerability Details

File Location: scripts/wait_for_task.py, lines 35–39, with vulnerable calls at lines 103–107 and 129–133
Vulnerability Type: Sensitive credential exposure through URL query parameters
Risk Level: Medium

Complete Code Snippet

python
def request_json(endpoint, params, api_key, timeout):
    url = endpoint + "?" + urllib.parse.urlencode(params)
    request = urllib.request.Request(url, method="GET")
    try:
        with urllib.request.urlopen(request, timeout=timeout) as response:
            content = response.read()

The function receives the API credential inside params at both call sites:

python
payload = request_json(
    STATUS_ENDPOINT,
    {"api_key": api_key, "task_id": task_id},
    api_key,
    request_timeout,
)
python
return request_json(
    DOWNLOAD_ENDPOINT,
    {"api_key": api_key, "task_id": task_id, "type": "json"},
    api_key,
    request_timeout,
)

Technical Analysis

The task polling and download requests place DATAIFY_API_TOKEN directly in the URL query string. Although the endpoints use HTTPS, HTTPS only protects the request while it is in transit. It does not prevent the complete URL from being recorded by the Dataify service, reverse proxies, load balancers, web-server access logs, observability products, exception telemetry, or debugging tools.

The response-body redaction performed later in the function does not protect the request URL:

python
if api_key:
    text = text.replace(api_key, "<redacted>")

This replacement only sanitizes returned response text. It cannot remove credentials already captured from the outbound URL.

Using a secret as a query parameter also gives the credential broader exposure than required. Other project requests authenticate through an Authorization: Bearer header, demonstrating a safer design that should also be used here.

Attack Path

  1. A user configures a valid DATAIFY_API_TOKEN in the process environmen ...[truncated 1295 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove api_key from all query-parameter mappings.
  2. Send the credential in 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",
    )
    with urllib.request.urlopen(request, timeout=timeout) as response:
        # Process the response.
        ...
  1. Change the call sites to include only non-secret parameters:
python
payload = request_json(
    STATUS_ENDPOINT,
    {"task_id": task_id},
    api_key,
    request_timeout,
)
python
return request_json(
    DOWNLOAD_ENDPOINT,
    {"task_id": task_id, "type": "json"},
    api_key,
    request_timeout,
)
  1. If these API endpoints do not support authorization headers, update the service contract to support them. As a temporary fallback, use a POST body rather than a query string, while recognizing that authorization headers remain preferable.
  2. Ensure HTTP clients, proxies, and telemetry systems redact Authorization headers.
  3. Review existing access, proxy, and observability logs for leaked tokens. Apply restricted retention and access controls, purge exposed records where feasible, and rotate affected credentials.
  4. Add automated tests asserting that generated request URLs never contain api_key, token, or the configured credential value.
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
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (25)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Polling task-status and download endpoints and printing completed JSON results makes the skill an operational result-retrieval tool, not merely an onboarding helper. In this context, hidden retrieval behavior can expose external data handling, cost incurrence, and output risks that would not be expected from a first-time setup skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Polling task-status and download endpoints and printing completed JSON results makes the skill an operational result-retrieval tool, not merely an onboarding helper. In this context, hidden retrieval behavior can expose external data handling, cost incurrence, and output risks that would not be expected from a first-time setup skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Polling task-status and download endpoints and printing completed JSON results makes the skill an operational result-retrieval tool, not merely an onboarding helper. In this context, hidden retrieval behavior can expose external data handling, cost incurrence, and output risks that would not be expected from a first-time setup skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Polling task-status and download endpoints and printing completed JSON results makes the skill an operational result-retrieval tool, not merely an onboarding helper. In this context, hidden retrieval behavior can expose external data handling, cost incurrence, and output risks that would not be expected from a first-time setup skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Polling task-status and download endpoints and printing completed JSON results makes the skill an operational result-retrieval tool, not merely an onboarding helper. In this context, hidden retrieval behavior can expose external data handling, cost incurrence, and output risks that would not be expected from a first-time setup skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Polling task-status and download endpoints and printing completed JSON results makes the skill an operational result-retrieval tool, not merely an onboarding helper. In this context, hidden retrieval behavior can expose external data handling, cost incurrence, and output risks that would not be expected from a first-time setup skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Polling task-status and download endpoints and printing completed JSON results makes the skill an operational result-retrieval tool, not merely an onboarding helper. In this context, hidden retrieval behavior can expose external data handling, cost incurrence, and output risks that would not be expected from a first-time setup skill.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

This file implements broad business-intelligence collection, scraping, analysis, and reporting workflows that materially exceed the declared onboarding/setup purpose of the skill. In an onboarding context, this scope expansion is dangerous because it enables undisclosed external data collection and decision support actions under the cover of an apparently benign setup skill, increasing the chance of misuse and user surprise.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The onboarding skill can generate actions for competitor, brand, review, lead, and scraping workflows, including external search and URL collection capabilities unrelated to first-time setup. Because the declared skill purpose is onboarding, embedding these capabilities makes the mismatch more dangerous: users or orchestrators may invoke the skill expecting safe setup assistance while it can perform materially different intelligence-gathering operations.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

This code allows the caller to choose any catalog tool via --tool-sign and submit arbitrary parameter sets to the remote Dataify Builder API, which goes well beyond the stated onboarding/setup purpose of the skill. In a skill advertised as first-time setup and routing assistance, this creates a scope mismatch that can be abused to perform general scraping or remote task execution under the user's token without clear policy boundaries.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The submit path turns this onboarding skill into a general-purpose remote task runner: it reads a bearer token from the environment, submits arbitrary builder jobs, and optionally waits for final results. Because the manifest positions this as onboarding assistance rather than a general execution interface, the capability is unexpectedly powerful and increases the risk of unauthorized or misleading use of the user's Dataify account.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
86% confidence
Finding

The skill declares no explicit tool restrictions even though its behavior implies access to environment variables, files, network, and shell execution. In an agent setting, missing scope boundaries increases the blast radius of prompt injection or implementation mistakes, because the runtime may grant broader capabilities than are necessary for simple onboarding and verification.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

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

md
## Account CTA policy

- Show a prominent Dataify account CTA only when the API token is missing, rejected/invalid, or the account has insufficient credits.
- For a missing token, offer https://dashboard.dataify.com/login?utm_source=skill and state: New accounts get 50 free credits, enough for about 6,000 trial results, valid for 7 days, and only successful requests are billed. Never ask the user to paste the token into chat.
- Detect the current operating system and shell. Show only the matching session-scoped setup command first (`export` for macOS/Linux shells, `$env:` for Windows PowerShell, or `set` for Windows Command Prompt). Show other platforms or persistent setup only when detection is ambiguous or the user asks.
- After the user says the token is configured, verify only whether `DATAIFY_API_TOKEN` is present; never print its value. If verification succeeds, continue the original task without asking the user to repeat it.
- Explain that persistent shell changes may require a new terminal or restarting the agent application. Do not recommend a project `.env` unless the execution path explicitly loads it, and ensure `.env` is ignored by version control.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

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

md
- Show a prominent Dataify account CTA only when the API token is missing, rejected/invalid, or the account has insufficient credits.
- For a missing token, offer https://dashboard.dataify.com/login?utm_source=skill and state: New accounts get 50 free credits, enough for about 6,000 trial results, valid for 7 days, and only successful requests are billed. Never ask the user to paste the token into chat.
- Detect the current operating system and shell. Show only the matching session-scoped setup command first (`export` for macOS/Linux shells, `$env:` for Windows PowerShell, or `set` for Windows Command Prompt). Show other platforms or persistent setup only when detection is ambiguous or the user asks.
- After the user says the token is configured, verify only whether `DATAIFY_API_TOKEN` is present; never print its value. If verification succeeds, continue the original task without asking the user to repeat it.
- Explain that persistent shell changes may require a new terminal or restarting the agent application. Do not recommend a project `.env` unless the execution path explicitly loads it, and ensure `.env` is ignored by version control.
- For an invalid token, direct the user to API-key management without implying that a new registration is required. For insufficient credits, direct the user to balance or recharge management.
- During normal submission, processing, and successful completion, do not promote registration or the Dashboard. Never expose the token or include it in CTA attribution parameters.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The default prompt is broad enough to authorize both environment setup and continuation of the user's original task without clear boundaries, which can cause the skill to activate in contexts beyond initial onboarding. In an agentic system, this increases the chance of unintended tool use, over-collection of environment details, or workflow changes that the user did not explicitly scope for onboarding.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · references/access-paths.md (reported line 7)May include surrounding context.

md
- Skills/scripts: preferred for an installed skill-aware agent or terminal automation.
- REST: preferred when adding Dataify directly to application code.

Do not ask the user to configure all three. Recommend the smallest path that completes the stated goal.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The direct_request fallback sends user queries and target URLs to external Dataify endpoints, but this file provides no explicit runtime disclosure or consent flow for that transmission. In an onboarding skill, that mismatch is more concerning because users reasonably expect setup help, not background export of task content to third-party services.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/business_workflow.py (reported line 180)May include surrounding context.

python
def execute_action(action: dict[str, Any], token: str) -> subprocess.CompletedProcess[str]:
    invocation = command(action)
    if len(invocation) > 1 and Path(invocation[1]).exists():
        return subprocess.run(invocation, capture_output=True, text=True, encoding="utf-8", errors="replace", check=False)
    if action.get('capability', '').startswith('scraper-'):
        return subprocess.CompletedProcess([], 1, '', 'Required platform scraper is not installed; install it before executing this action.')
    return direct_request(action, token)

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script transforms collected external data into reputation, pricing, lead-qualification, and acceptance-gating outputs, which are operational business decisions rather than onboarding tasks. In this context, the danger is hidden capability expansion: a setup skill is making consequential judgments and storing reports, which can lead to unauthorized profiling or analysis beyond user expectations.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/catalog_builder.py (reported line 70)May include surrounding context.

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"]),

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file exposes general-purpose search() and unlock() primitives that go beyond the stated onboarding/setup-only purpose of the skill. In an agent setting, this creates capability drift: another prompt path or tool invocation could repurpose the skill for broad web search and scraping, expanding data access and external interaction beyond what users and reviewers expect.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The unlock() function provides webpage unlocking/scraping with JS rendering and redirect following, which is a materially more powerful capability than onboarding flow assistance. In the context of an onboarding-only skill, this hidden or unjustified scraping capability increases the risk of misuse for broad content extraction, bypass-oriented fetching, and exfiltration of third-party web content under the cover of a benign setup tool.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The script requires task statuses to equal the Chinese strings "处理中", "成功", and "失败". This imposes a specific locale assumption in behavior without any user opt-in or documented justification, which matches the language/locale policy violation category.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The workflow writes JSON state and report artifacts to disk, and elsewhere also persists raw collection outputs, without any clear user-facing notice in this file about what will be stored or where. While not inherently malicious, silent persistence can expose sensitive queries, URLs, or collected data to other local users, backups, or later unintended reuse.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

The manifest describes a skill for setting up and verifying a first Dataify workflow and routing the user to an integration path. This helper implements a separate product telemetry capability by reading an environment variable and appending events to a filesystem path, which is not an obvious requirement of onboarding or workflow verification.

Content

No source excerpt is available for this finding.

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