Back to skill

Security audit

Dataify DuckDuckGo Search

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent Dataify-backed DuckDuckGo search helper, but it needs review because its documented command pattern can allow shell command injection and its token handling is broader than necessary.

Review before installing. Use it only if you are comfortable sending search queries and a Dataify API token to Dataify, avoid putting secrets or private internal text in search requests, and do not invoke the documented command by interpolating untrusted text through a shell; pass arguments safely or require the publisher to fix the invocation and token handling.

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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:14
Finding

Shell Command Injection Through Untrusted Request Interpolation

Content
View full analysis
" --preview ``` ### Technical Analysis The Skill instructs the agent to interpolate the user's complete request into a shell command enclosed in double quotes. Shell double quotes do not neutralize command substitution using `$(...)` or backticks. An attacker can therefore include shell metacharacters in a search request, causing the shell to execute a local command before the Python interpreter receives the argument. The Python script uses `argparse`, which would safely accept the request if it were launched through an argument-array API. The vulnerability is introduced by the documented shell invocation rather than by the argument parser. ### Attack Path 1. An attacker submits a search request containing shell command substitution, such as a request whose query includes `$(attacker_command)`. 2. The agent follows the Skill instructions and inserts the complete request into the documented command. 3. The command is evaluated by a shell. 4. The shell evaluates the command substitution before starting Python. 5. The injected command executes with the same operating-system privileges as the agent process. 6. Python subsequently receives the command output as part of the request argument, potentially concealing the local execution within an otherwise normal search operation. ### Impact Assessment Successful exploitation permits arbitrary local command execution under the agent's account. The attacker could read files accessible to that account, modify the project workspace, access environment variables and credentials, invoke network utilities, or execute additional programs. The vulnerability does not independently grant elevated operating-system privileges, but it exposes all privileges already held by the ...[truncated 132 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/duckduckgo_search.py:555
Finding

API Token Accepted Through a Command-Line Argument

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
scripts/duckduckgo_search.py:523
Finding

API Token Unnecessarily Copied Into the Process Environment

Content
View full analysis
Remediation
View remediation
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
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (15)

Tainted flow: 'request' from os.environ.get (line 531, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/duckduckgo_search.py (reported line 541)May include surrounding context.

python
method="POST",
    )
    try:
        with urllib.request.urlopen(request, timeout=120) as response:
            sys.stdout.buffer.write(response.read())
            return 0
    except urllib.error.HTTPError as exc:

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The skill claims to perform a DuckDuckGo search, but actually routes requests through a third-party Dataify scraping API, includes token-handling/account onboarding behavior, and does not enforce the stated prohibition on use for Google/Bing/Yandex requests. This mismatch can mislead users and operators about data flow, trust boundaries, credential use, and policy compliance.

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 14)May include surrounding context.

md
python3 scripts/duckduckgo_search.py --request "<user request>" --preview

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
python3 scripts/duckduckgo_search.py --request "<user request>" --preview

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
python3 scripts/duckduckgo_search.py --request "<user request>" --preview

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill instructs the agent to run a bundled Python script that uses environment variables and network access, but the manifest declares no corresponding tool scope or permissions. This weakens policy enforcement and reviewability, making it easier for a seemingly simple search skill to access secrets and make outbound requests without explicit disclosure.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

L50 instructs the agent to return the script stdout directly and explicitly says not to summarize, pretty-print, filter, or otherwise process the API response. But L54-L56 then instruct returning a compact user-facing result by default and only returning raw JSON or HTML when explicitly requested, which conflicts with the earlier requirement to pass stdout through unchanged.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The instruction to pass the user's complete request verbatim to the external search script can disclose sensitive data the user included incidentally, such as personal identifiers, secrets, internal URLs, or proprietary context. Because the skill forwards data to a third-party service, the skill context makes this more dangerous than a local-only transformation: users may not expect all surrounding prompt text to be transmitted externally.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

L51 says to return the script's stdout directly and explicitly forbids summarizing, translating, pretty-printing, filtering, or other processing. But L55-L57 instruct presenting streamlined results, hiding response wrappers by default, and only returning raw JSON/HTML when the user explicitly asks, which is the opposite behavior. These instructions actively conflict and create intent-code/documentation divergence within the skill guidance.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

The file is a Chinese-localized skill instruction set and directs the agent to return output in a fixed presentation style, but nowhere offers the user a language or locale choice. This can violate language/locale policy when users may expect responses in their own preferred language unless they explicitly opted into Chinese.

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 77)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 72)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 79)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 74)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.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The manifest says this skill runs a DuckDuckGo web search, which justifies making the search API call, but this function also reads credentials from the environment, prompts interactively for a token, and includes marketing text directing the user to register for a Dataify account with free credits. That account-acquisition and promotional behavior is not part of the stated search purpose and is not necessary to perform search semantics themselves.

Content

No source excerpt is available for this finding.