Back to skill

Security audit

Dataify Google Jobs

Security checks for vulnerabilities and agentic risk

Overview

This skill coherently submits Google Jobs searches to Dataify, but users should handle the Dataify API token carefully.

Install only if you intend to use Dataify for Google Jobs searches. Prefer setting DATAIFY_API_TOKEN in a session-scoped environment variable, do not pass tokens on the command line, and be aware that API calls may consume Dataify credits.

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

API Token Exposure Through Command-Line Arguments and Environment Reassignment

Content
View full analysis

Vulnerability Details

File Location: scripts/google_jobs.py, lines 164 and 437–443
Vulnerability Type: API credential exposure
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 supports passing the Dataify API token through the --token command-line option. Command-line arguments may be exposed through shell history, process inspection, endpoint telemetry, audit records, CI logs, or command logging by the invoking agent.

The function then writes the normalized, bearer-prefixed credential back into DATAIFY_API_TOKEN. This reassignment is unnecessary for making the API request and broadens the secret's presence within process state. It could expose the credential through environment diagnostics or to child processes added in future revisions.

The legitimate network transmission itself is not a vulnerability: the token is required for the declared functionality and is sent in the Authorization header to the fixed HTTPS endpoint https://scraperapi.dataify.com/request. The weakness concerns how the credential can be supplied and retained locally.

Attack Path

  1. A user or automation invokes the client with a plaintext credential:
    bash
    python3 scripts/google_jobs.py --token SECRET --q "software engineer jobs"
    
  2. The complete command is retained in shell history, process telemetry, an audit log, or an agent execution record.
  3. A local user, monitoring service, or log reader with access to that record obtain ...[truncated 721 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove the --token command-line option so credentials cannot be passed through process arguments.
  2. Read the token only from DATAIFY_API_TOKEN, a protected credential store, or a non-echoing standard-input prompt intended for interactive use.
  3. Do not assign the normalized authorization value back to os.environ. Keep it only in a local variable for the duration of the request.
  4. Ensure exceptions, debug output, request tracing, and telemetry redact Authorization and DATAIFY_API_TOKEN.
  5. Document a secure setup method using a session-scoped environment variable without printing its value.
  6. Rotate any token previously passed on the command line if command histories or execution logs may be accessible.
  7. Where supported, restrict the token by scope, rate, account permissions, and lifetime to reduce the impact of disclosure.
Vulnerability Patterns
  • 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
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (14)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared purpose is a narrow Google Jobs search skill, but the documented behavior includes local parsing/helper functionality rather than clearly bounded network retrieval. Description-behavior mismatches are dangerous because reviewers and users may trust the declared purpose while the actual capability surface is different, enabling unexpected processing paths and weakening oversight.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill advertises operational behavior that involves environment access, local file reads, and outbound API use, but it does not declare any explicit tool scope or permissions boundaries. This makes the skill harder to govern safely and can allow broader-than-expected capability use if the runtime permits implicit access.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

L042 instructs the agent to return the script output directly and not summarize, extract, clean, translate, or reformat the API response. Later, L078-L080 says the default behavior is to return trimmed, user-ready results and only return raw JSON/HTML when explicitly requested, which is the opposite of the earlier instruction. These directions actively conflict about whether output should be passed through unchanged or post-processed.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This file is a Chinese-language skill document, but the 'Account CTA policy' section is written as imperative English instructions and does not indicate that the user may choose their preferred language. That creates a locale/language policy concern because the skill effectively hard-codes a language for part of the interaction without opt-in or justification.

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 100)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 95)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 102)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 97)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
95% confidence
Finding

The user-facing defaults, parameter descriptions, and multiple runtime messages are written only in Chinese, which imposes a specific language/locale on users without any opt-in or alternative. The policy allows locale constraints only when clearly documented and justified, which is not present here.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The instruction says to use this skill for a user's 'Google Jobs request' without defining narrower trigger phrases, exclusions, or invocation boundaries. This is somewhat broad natural-language scope and could overlap with ordinary job-search requests without clarifying when this skill should or should not activate.

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_jobs.py (reported line 400)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

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The skill's manifest describes a job-search capability, but this function also retrieves authentication material from the process environment via DATAIFY_API_TOKEN. Reading ambient credentials is not part of the user-visible Google Jobs search behavior and is not declared in the manifest description.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

Beyond using a token to call the Dataify API, the function persists the normalized token into the environment, which is unrelated to searching Google Jobs listings. This is an additional capability with side effects not justified by the manifest's narrow search purpose.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

This code emits user-facing error messages only in Chinese for invalid JSON input, which imposes a specific language on users without opt-in. The policy allows locale constraints only when documented and justified or when users are given a choice, neither of which is present in this file.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.