Back to skill

Security audit

Dataify Google Flights

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to perform the advertised flight-search API workflow, but it needs review because it handles a paid API token and includes unsafe persistent token setup guidance.

Review this before installing if you use a real Dataify account. Prefer a session-scoped DATAIFY_API_TOKEN or a secret manager, avoid putting the token in shell startup files or command-line arguments, and understand that flight routes, dates, passenger counts, filters, and API credits are sent to Dataify when live searches run.

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
SKILL.zh-CN.md:21
Finding

Persistent Plaintext Storage of the Dataify API Token

Content
View full analysis

Vulnerability Details

File Location: SKILL.zh-CN.md:21-48
Vulnerability Type: Persistent plaintext credential storage
Risk Level: Medium

Vulnerable Code

powershell
[Environment]::SetEnvironmentVariable("DATAIFY_API_TOKEN", "your_token_here", "User")
powershell
$env:DATAIFY_API_TOKEN = "your_token_here"
bash
echo 'export DATAIFY_API_TOKEN="your_token_here"' >> ~/.bashrc
source ~/.bashrc
bash
echo 'export DATAIFY_API_TOKEN="your_token_here"' >> ~/.zshrc
source ~/.zshrc

Technical Analysis

The localized Skill instructions recommend storing the Dataify API token persistently in a user-level environment variable or directly in shell initialization files. In the macOS/Linux examples, the token is written as plaintext into .bashrc or .zshrc.

This persistence is not necessary for the declared flight-search functionality. A session-scoped environment variable is sufficient for executing an API request. The recommendation also conflicts with the safer policy in SKILL.md:80-84, which requires session-scoped setup to be shown first and discourages unnecessary persistent secret storage.

Shell initialization files may be exposed through local account compromise, overly permissive file permissions, workstation backups, support bundles, configuration synchronization, or accidental repository inclusion. User-level environment variables can similarly be accessed by processes running in the same user context.

This is classified as T09: Insecure Skill Coding Practices, rather than system persistence, because the persisted data is a credential and not an installed backdoor or startup execution hook.

Attack Path

  1. A user follows the localized setup instructions.
  2. The user replaces your_token_here with a valid Dataify API token.
  3. The token is stored persistently in a shell profile or user environment.
  4. A malicious process, another act ...[truncated 873 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove the recommendation to store plaintext tokens in .bashrc, .zshrc, or persistent user environment variables.
  2. Make session-scoped environment variables the default:
    bash
    export DATAIFY_API_TOKEN="..."
    
    or:
    powershell
    $env:DATAIFY_API_TOKEN = "..."
    
  3. For persistent storage, recommend an operating-system credential manager or secret-management facility instead of shell configuration files.
  4. Keep the English and localized Skill instructions synchronized so both enforce the account CTA policy in SKILL.md.
  5. Tell users never to paste tokens into chat, commit them to source control, include them in support logs, or place them in command history.
  6. Document token rotation and revocation procedures for suspected exposure.

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/google_flights.py:682
Finding

API Token Accepted Through a Command-Line Argument

Content
View full analysis

Vulnerability Details

File Location: scripts/google_flights.py:682 and scripts/google_flights.py:750-755
Vulnerability Type: Credential exposure through process arguments and shell history
Risk Level: Medium

Vulnerable Code

python
parser.add_argument("--token", help="Dataify API token. Bearer prefix is optional.")
python
def get_authorization(token_arg: str | None) -> 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 allows an API token to be supplied using the --token command-line option. Command-line secrets can be captured in shell history, terminal session logs, process-monitoring software, diagnostic reports, audit tooling, or process metadata visible to other local processes where operating-system policy permits it.

The command-line credential path is unnecessary because the script already supports DATAIFY_API_TOKEN. The implementation also copies the normalized bearer token into the process environment. Although this does not modify the parent shell or create cross-session persistence, it can unnecessarily broaden exposure to child processes if the program is later extended to launch subprocesses.

No evidence indicates that the script logs or transmits the token anywhere other than the fixed Dataify endpoint. The flaw is the insecure credential input channel, not an undisclosed exfiltration mechanism.

Attack Path

  1. A user runs the script with a valid token, for example:
    bash
    python3 scripts/google_flights.py --token "secret-token" --params-json '{...}'
    
  2. The complete command is retained in shell history, terminal telemetry, process accounting, or a process listing.

...[truncated 819 chars]

Remediation
View remediation

Remediation Suggestions

  1. Remove or formally deprecate the --token command-line option.
  2. Read the token from DATAIFY_API_TOKEN or an operating-system credential manager.
  3. If interactive entry is required, use a hidden prompt such as Python's getpass.getpass() rather than a visible command-line argument.
  4. Avoid rewriting DATAIFY_API_TOKEN inside the process environment when the authorization value can remain in a local variable.
  5. Ensure error messages, dry-run output, debug output, and exception handling never print authorization headers or token values.
  6. Advise existing users who previously supplied tokens on the command line to clear relevant shell history and rotate potentially exposed tokens.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • 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
Findings (22)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description says the skill searches Google Flights for fares and itineraries. However, this code chunk is an internal preview/inspection utility: it reads reference markdown files, infers defaults, parses JSON/CLI params, and prints a table of parameters. There is no flight-search logic, no network access, no Google Flights interaction, and no travel-specific behavior. This is a materially different primary purpose from the declared description, so it is a mismatch.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
with `python3`. Run it from this skill directory, or use the absolute path to `scripts/google_flights.py`.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
with `python3`. Run it from this skill directory, or use the absolute path to `scripts/google_flights.py`.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
with `python3`. Run it from this skill directory, or use the absolute path to `scripts/google_flights.py`.

YARA rule 'backdoor_persistence': Backdoor persistence with malicious payloads (shell commands, SSH key injection, hidden root users) [malware]

High
Category
YARA Match
Confidence
75% confidence
Finding

YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).

Content

Scanner excerpt · SKILL.zh-CN.md (reported line 40)May include surrounding context.

量,而不是只在当前终端临时设置。

Windows PowerShell,当前用户永久设置:

powershell
[Environment]::SetEnvironmentVariable("DATAIFY_API_TOKEN", "your_token_here", "User")

然后重新打开 PowerShell。如果当前会话也要立即生效,再执行:

powershell
$env:DATAIFY_API_TOKEN = "your_token_here"

macOS 或 Linux,bash 永久设置:

bash
echo 'export DATAIFY_API_TOKEN="your_token_here"' >> ~/.bashrc
source ~/.bashrc

macOS 或 Linux,zsh 永久设置:

bash
echo 'export DATAIFY_API_TOKEN="your_token_here"' >> ~/.zshrc
source ~/.zshrc

参考文件

  • references/ 目录下的 API 文档包含完整的字段列表和说明。
  • 当字段行为、允许的值或响应格式不明确时,请查阅参考文档。

注意事项

  • 始终使用 Content-Type: application/x-www-form-urlencoded 提交 API 请求。
  • 保持请求值为字符串类型。
  • 省略用户未请求的可选字段。

结果呈现

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill invokes a Python script, reads reference files, checks environment variables, and ultimately performs outbound API requests, yet it declares no explicit tool scope or permission boundaries. This increases the chance that an agent platform will grant broader-than-intended access or that reviewers will underestimate the skill's capabilities, which is a real security governance issue even if the actions are expected for the workflow.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The instruction mandates exactly the Chinese column names 参数名, 当前值, 默认值, 说明 for output formatting. This is a language/locale constraint presented as unconditional behavior, and the file does not indicate user opt-in or a justified region-specific requirement.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

L03 将触发条件写为“搜索航班价格/行程”,这类表述接近日常自然请求,且未给出明确边界、限定上下文或反例。虽然“调用 Google Flights”较具体,但与宽泛短语并列后,整体触发范围仍偏模糊,可能匹配到普通对话中的航班咨询。

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 81)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 80)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 83)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 82)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.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The document instructs the skill to send an Authorization bearer token and user flight-search parameters to a third-party endpoint, but it provides no privacy notice, data-handling constraints, or user-consent guidance. In a travel-search skill, this means potentially sensitive itinerary and location data is transmitted off-platform without clear disclosure, creating privacy and compliance risk even if the API use is functionally intended.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The file hard-codes language aliases and later auto-detects a language from natural-language input to set the hl parameter. This can impose a locale choice implicitly rather than explicitly offering the user a language/locale selection, which matches the policy concern for forced language handling without opt-in.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The script reads the API token from DATAIFY_API_TOKEN and then writes the normalized bearer token back into the process environment. Persisting credentials in environment state beyond the immediate lookup broadens exposure to child processes, debugging output, crash dumps, or other code running in the same process, which exceeds the narrow needs of a flight-search helper.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The token-handling logic reads credentials from DATAIFY_API_TOKEN and rewrites the environment variable with a bearer-prefixed version without warning. Mutating credential-bearing environment variables can unintentionally expose secrets to subprocesses or unrelated components and is especially risky in shared agent runtimes.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The script sends user-supplied itinerary and passenger details to an external third-party API without an execution-time notice or confirmation. Travel dates, routes, passenger counts, and preferences can be sensitive personal data, and silent transmission increases the risk of unintended disclosure, especially in agent-mediated use where users may not realize a third party is involved.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script prints all current parameter values directly to stdout in a Markdown table, with no masking or allow/deny list for sensitive fields. Even though it skips an exact field named 'Authorization' when discovering documented fields, user-supplied parameters passed via --params-json or unknown CLI args are still echoed verbatim, so secrets such as API keys, session tokens, or personal travel data could be exposed in terminal logs, CI logs, or chat transcripts.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The instruction maps language-related phrases directly to fixed hl locale values such as zh-cn and en, which can impose a language/locale choice rather than explicitly offering or confirming it with the user. The policy allows locale constraints when user choice or opt-in is explicit, which is not stated here.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The top-level docstring claims the script merely calls the Dataify Google Flights API and prints the raw response body, while the implementation includes substantial additional behavior such as parsing free-form requests, normalizing many fields, validating business rules, generating markdown/JSON dry-run previews, and handling credentials. This documentation understates and misrepresents what the code actually does, creating an intent-code divergence.

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_flights.py (reported line 643)May include surrounding context.

python
params[normalized_key] = cleaned

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

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The script raises user-visible error messages only in Chinese for invalid JSON and type validation failures. This imposes a specific language on all users without opt-in or documented locale justification, which matches the language policy violation criteria.

Content

No source excerpt is available for this finding.