T09 · Insecure Skill Coding Practices
- Location
scripts/wait_for_task.py:34- Finding
API Token Exposed in HTTP Query Strings During Task Polling and Result Download
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The scraper-builder behavior is partly coherent, but the package also includes undisclosed business-intelligence collection workflows and has credential and URL-handling risks that warrant review before installation.
Install only if you are comfortable with a Dataify skill that can send target URLs, queries, and task identifiers to Dataify services and write fetched samples/results into your workspace. Review or remove the business_workflow.py path if you only want scraper generation, and prefer short-lived or least-privilege Dataify API tokens because one polling script places the token in request URLs.
scripts/wait_for_task.py:34API Token Exposed in HTTP Query Strings During Task Polling and Result Download
scripts/dataify_client.py:34Public-URL Validation Allows Private, Loopback, Link-Local, and Metadata Targets
The finding suggests the skill may monitor/download results for existing Dataify tasks using API tokens and task IDs rather than inspect target websites or design scrapers. That creates a serious transparency issue: a user may believe they are invoking a limited analysis tool while the skill actually accesses account-scoped remote resources and external service endpoints.
The finding suggests the skill may monitor/download results for existing Dataify tasks using API tokens and task IDs rather than inspect target websites or design scrapers. That creates a serious transparency issue: a user may believe they are invoking a limited analysis tool while the skill actually accesses account-scoped remote resources and external service endpoints.
The finding suggests the skill may monitor/download results for existing Dataify tasks using API tokens and task IDs rather than inspect target websites or design scrapers. That creates a serious transparency issue: a user may believe they are invoking a limited analysis tool while the skill actually accesses account-scoped remote resources and external service endpoints.
The finding suggests the skill may monitor/download results for existing Dataify tasks using API tokens and task IDs rather than inspect target websites or design scrapers. That creates a serious transparency issue: a user may believe they are invoking a limited analysis tool while the skill actually accesses account-scoped remote resources and external service endpoints.
The finding suggests the skill may monitor/download results for existing Dataify tasks using API tokens and task IDs rather than inspect target websites or design scrapers. That creates a serious transparency issue: a user may believe they are invoking a limited analysis tool while the skill actually accesses account-scoped remote resources and external service endpoints.
The file defines a generic business-intelligence workflow with modes for price, review, lead, and brand monitoring, which is materially broader than the declared purpose of a scraper-builder skill. This capability mismatch is dangerous because it enables collection and analysis workflows that users and reviewers would not reasonably expect from this skill, increasing the chance of unauthorized data gathering and policy bypass through mis-scoped functionality.
Instead of designing a scraper specification, this code actively executes searches and scraping actions against external services and installed scraper modules. In the context of a scraper-builder skill, that is a significant scope violation because it turns a planning/design tool into an operational data-collection agent, potentially causing unintended outbound requests and data acquisition.
The skill declares no explicit tool scope even though its instructions clearly contemplate environment inspection, file operations, network access, and shell execution. Missing least-privilege boundaries makes it easier for an agent runtime to grant broader capabilities than necessary, increasing the blast radius if the skill is misused, compromised, or behaves unexpectedly.
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.
## 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.
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.
- 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.
This code saves the full retrieved page content to sample.html, which can persist user-requested or sensitive site data locally. There is no confirmation prompt, log message, or inline comment/docstring warning the user that remote content will be stored on disk.
The lead-generation logic targets LinkedIn and Crunchbase company pages and scores organizations for qualification, which is unrelated to building website scrapers. In this skill context, that unjustified prospecting capability expands the skill into business targeting and enrichment, increasing privacy, compliance, and misuse risk beyond the stated purpose.
The workflow sends user-provided queries and URLs to external Dataify endpoints and local scraper components without a clear runtime disclosure or confirmation at the moment of execution. This is risky because user-supplied targets may contain sensitive business interests, investigation subjects, or proprietary URLs, and transmitting them off-box without explicit notice can create privacy, confidentiality, and trust issues.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
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)
The reporting layer produces business-intelligence outputs such as pricing ranges, review signals, qualification scores, and executive summaries, which goes well beyond scraper construction. This is dangerous in context because it operationalizes scraped data into decision-support artifacts under misleading skill metadata, making the actual data-processing behavior broader and less transparent than advertised.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
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"]),
The script hard-codes Chinese status strings for task state handling, which creates a locale dependency that is not explained to the user and does not provide any opt-in or fallback behavior. This matches the language/locale policy concern because the skill implicitly assumes a specific language for API responses.
This operation creates generated_scraper.py on disk, which is a file write with lasting effects in the user's workspace. Although code generation is part of the tool's purpose, there is no visible disclosure in the execution flow that a new script file will be created at the target path.
Detected: suspicious.exposed_secret_literal