Back to skill

Security audit

Dataify Google Local

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly performs the advertised Google Local search, but it needs review because its code accepts API tokens on the command line and supports direct place-ID lookups despite saying it should not.

Review before installing. Use `DATAIFY_API_TOKEN` from your shell or secret manager instead of `--token`, avoid placing tokens in chat, commands, logs, or previews, and be aware that search queries and location fields are sent to Dataify. Also treat direct CID/Place ID lookup as outside the advertised boundary until the package aligns its docs and code.

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/google_local.py:164
Finding

API Token Exposure Through Command-Line Arguments

Content
View full analysis
str | None: token = clean_value(token_arg) or clean_value(os.environ.get("DATAIFY_API_TOKEN")) if not token: return None if not token.lower().startswith("bearer "): token = f"Bearer {token}" os.environ["DATAIFY_API_TOKEN"] = token return token ``` ### Technical Analysis The script permits a Dataify API token to be supplied directly through the `--token` command-line option. Command-line arguments are not an appropriate secret-transfer channel because they can be retained in shell history and, depending on the operating system and process isolation configuration, exposed through process-listing or process-inspection facilities. Although the script also supports the `DATAIFY_API_TOKEN` environment variable, the safer path does not eliminate the insecure command-line path. The documentation advises users not to paste tokens into chat, but the executable interface itself still accepts plaintext tokens as arguments. The token is legitimately transmitted over HTTPS to the documented Dataify endpoint. The vulnerability is therefore not unauthorized network exfiltration; it is the local exposure created before or during execution when the credential is placed in the process arguments. ### Attack Path 1. A user invokes the script using a command such as: ```bash python3 scripts/google_local.py --token DATAIFY_SECRET --q "coffee shops" ``` 2. The plaintext token becomes part of the command line. 3. The command may be saved in the user's shell history. On systems with permissive process inspection, it may also be visible w ...[truncated 880 chars]
Remediation
View remediation
str | None: token = clean_value(os.environ.get("DATAIFY_API_TOKEN")) if not token: return None return token if token.lower().startswith("bearer ") else f"Bearer {token}" ``` 5. Ensure documentation and examples exclusively demonstrate session-scoped environment-variable configuration and never include real credentials in commands, logs, diagnostic output, or error messages. 6. Recommend token rotation if a token has previously been supplied through the command line. ]]>
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 (17)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The skill description says it should not be used for known Place ID or detailed map record workflows, but the documented parameter mapping explicitly supports ludocid, which is a known place/customer identifier. This mismatch is dangerous because policy, review, and user expectations can be bypassed by hiding higher-risk functionality behind an apparently narrower description.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The skill description says it should not be used for known Place ID or detailed map record workflows, but the documented parameter mapping explicitly supports ludocid, which is a known place/customer identifier. This mismatch is dangerous because policy, review, and user expectations can be bypassed by hiding higher-risk functionality behind an apparently narrower description.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill clearly expects access to environment variables, local files/references, and outbound network calls, yet it declares no explicit tool scope or permission boundary. This creates an authorization and transparency gap: a host agent may grant broader capabilities than users expect, increasing the risk of unintended data access or exfiltration through the third-party API flow.

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 92)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 receive 50 free credits. 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
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.zh-CN.md (reported line 115)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 receive 50 free credits. 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 94)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 receive 50 free credits. 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.

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.zh-CN.md (reported line 117)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 receive 50 free credits. 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
91% confidence
Finding

The default prompt uses a broad trigger phrase, "Use $dataify-google-local to run a search query," without meaningful constraints on when the skill should be invoked or what kinds of local searches are appropriate. This can cause over-invocation or invocation in ambiguous contexts, increasing the chance of unintended data access, irrelevant tool use, or prompt-routing abuse in multi-skill environments.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The reference documentation exposes a ludocid parameter for direct place/CID lookup even though the skill description explicitly says the skill should not be used for known Place IDs or detailed map records. This creates a specification/implementation mismatch that can enable callers or downstream agents to bypass intended usage constraints and retrieve more targeted local-entity data than the skill policy allows.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill metadata explicitly says not to use a known Place ID or detailed map record, but the implementation accepts and even parses ludocid/CID inputs. This creates a policy bypass: callers can perform targeted lookups the skill contract appears to forbid, increasing the risk of collecting detailed information on a specific place contrary to intended restrictions.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The inline documentation advertises ludocid as a supported body parameter even though the skill description says not to use known Place IDs or detailed map records. This contradiction is dangerous because it guides integrators and agents toward prohibited targeted queries, making misuse more likely and undermining any policy safeguards based on the manifest.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
79% confidence
Finding

This code emits a full parameter table including current values gathered from --params-json and unknown CLI arguments. If users pass secrets such as API keys or credentials as parameters, the script will disclose them verbatim to stdout, and there is no warning, masking, or user-facing notice about that behavior in the file.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

该技能是中文文档,但示例命令在 L016 将 --hl en 作为直接示例,且 L034 也使用“语言英文”的自然语言请求。这会给执行者传达默认应使用英文界面的指示,而文档未在这些位置明确要求根据用户偏好选择语言。

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The token-missing message is presented only in Chinese, and other user-facing errors in the script also include Chinese text. This imposes a specific language on users without opt-in or documented locale justification, which fits the language/locale policy violation category.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The script emits user-visible text such as "未赋值" and Chinese validation errors, but does not provide a language selection mechanism or document a region-specific constraint. That creates a natural-language locale policy issue for users who did not opt into Chinese output.

Content

No source excerpt is available for this finding.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · scripts/google_local.py (reported line 532)May include surrounding context.

python
params[key] = cleaned

    for field in FIELDS:
        value = clean_value(getattr(args, field))
        if value is not None:
            params[field] = value

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

This code performs an HTTP POST to a third-party endpoint using parameters that may include search queries and geographic location. While the script name and purpose imply API usage, there is no explicit runtime disclosure, confirmation, or warning that user-provided data will be transmitted off-system.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.