Back to skill

Security audit

Dataify Google Play

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed Google Play search integration that sends requested search parameters to Dataify using a Dataify token, with some credential-handling cautions but no evidence of hidden or destructive behavior.

Install only if you are comfortable sending Google Play search terms and related parameters to Dataify and using Dataify credits. Prefer setting DATAIFY_API_TOKEN in a session-scoped environment variable rather than passing tokens on the command line, and review the request when searches could be broad, multi-page, or credit-intensive.

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/google_play.py:289
Finding

API Token Exposure Through Command-Line Arguments and Process Environment Mutation

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 the Dataify API token to be supplied through the `--token` command-line argument. Command-line secrets may be retained in shell history and can be visible to local process-monitoring tools or other users with sufficient process-inspection access. After reading the credential, `get_authorization()` writes the normalized bearer credential back to `os.environ`. This mutation is unnecessary for the HTTP request and expands the credential's exposure surface. Any subsequently launched child process would inherit the modified environment by default. It also changes the variable from a raw token to an authorization-header value prefixed with `Bearer `, creating an undocumented side effect. Reading `DATAIFY_API_TOKEN` is necessary for the declared API integration, but accepting it through process arguments and rewriting it into the environment exceed the minimum credential-handling behavior needed to perform the request. ### Attack Path 1. A user runs the script with `--token SECRET`. 2. The token is recorded in shell history or exposed through process argument inspection while the process is active. 3. The script writes `Bearer SECRET` into `DATAIFY_API_TOKEN`. 4. A local process with environment-inspection privileges, or a child process launched later in the same process context, obtains the ...[truncated 712 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}" ``` 6. Document that credentials should be set through session-scoped environment configuration and should never be passed directly in a shell command. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/google_play.py:554
Finding

Bearer Credential May Be Forwarded During Cross-Origin HTTP Redirects

Content
View full analysis
int: body = urllib.parse.urlencode(params).encode("utf-8") request = urllib.request.Request( API_URL, data=body, headers={ "Authorization": authorization, "Content-Type": "application/x-www-form-urlencoded", "Accept": "*/*", }, method="POST", ) try: with urllib.request.urlopen(request, timeout=timeout) as response: sys.stdout.buffer.write(response.read()) return 0 ``` ### Technical Analysis The initial destination is a hard-coded HTTPS endpoint, which appropriately restricts ordinary requests to the documented Dataify service. However, `urllib.request.urlopen()` uses default redirect handling, and the script does not independently enforce a same-origin redirect policy or remove the `Authorization` header when the destination changes. Because the request contains a bearer credential, redirects must be treated as a security boundary. If the trusted endpoint, its upstream infrastructure, or its DNS/TLS termination layer is compromised or misconfigured and responds with a redirect to another origin, the default request machinery may construct a redirected request carrying headers from the original request. This creates a potential credential-disclosure path. Sending the authorization header to the documented Dataify endpoint is necessary for the Skill's declared functionality. Allowing authenticated redirects without destination validation is not necessary and exceeds minimum network privilege. ### Attack Path 1. The script creates an HTTPS request to `https://scraperapi.dataify.com/request` with the Dataify bearer token in the `Auth ...[truncated 1144 chars]
Remediation
View remediation
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 (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The skill claims it will perform Google Play searches via the Dataify scraper flow, but the analyzed behavior indicates it instead parses local documentation and scripts and renders parameter previews without actually executing the search action. This mismatch is dangerous because operators may grant trust, permissions, or rely on outputs under false assumptions about what the skill does, undermining auditability and creating room for deceptive or broken execution paths.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The trigger condition is broad and loosely bounded: phrases like “调用 Google Play” or “应用商店搜索/排名” can match many ordinary requests and cause this skill to activate when the user did not specifically intend Dataify-powered Google Play scraping. In an agent setting, overbroad routing can lead to unintended third-party API use, unnecessary credential prompts, and possible disclosure of user intent to an external service.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
79% confidence
Finding

示例命令在 L17 固定使用 --gl us --hl en,而文档未说明这些语言/地区设置仅为示例,也未强调应以用户偏好为准。对于自然语言指令型技能,这种固定 locale 呈现可能诱导代理在未获用户选择时默认使用英语和美国地区。

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 94)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 89)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 96)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 91)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.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The script embeds user-facing descriptions, error messages, and CLI help context in Chinese, which effectively imposes a specific language experience. The policy allows locale constraints only when justified or when users are given a language choice, neither of which is present here.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This code posts the normalized request parameters to Dataify's external API, which may include user-provided search terms and locale selections. Although the script description says it calls the Dataify API, there is no runtime disclosure, confirmation, or privacy warning before transmitting the data.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

The markdown includes a sample invocation containing a Chinese-language request string, but the skill does not state that multilingual input is supported generally or that Chinese is only an example. Under the policy, natural-language guidance that appears to force or privilege a specific language without opt-in can be a locale-policy issue.

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_play.py (reported line 478)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

Static analysis

No suspicious patterns detected.