Back to skill

Security audit

Dataify Bing Videos

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to perform the promised Bing Videos search, but its API-token handling and setup guidance are riskier than users should accept without review.

Review before installing. Use a short-lived or least-privilege Dataify token, avoid passing it with --token, and prefer a session-scoped environment variable over writing it to .bashrc, .zshrc, or persistent user environment settings. Do not submit sensitive queries unless you are comfortable sending them to Dataify's service.

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/bing_videos.py:706
Finding

API Token Exposure Through Command-Line Arguments and Environment Mutation

Content
View full analysis
str: token = args.token or os.getenv("DATAIFY_API_TOKEN") if not token: raise MissingTokenError( "Missing DATAIFY_API_TOKEN." ) token = token.strip() if not token.lower().startswith("bearer "): token = f"Bearer {token}" os.environ["DATAIFY_API_TOKEN"] = token return token ``` ```python parser.add_argument("--token", help="API token for this run. Bearer prefix is added when missing.") ``` The displayed exception text is translated for report-language consistency; the executable source contains an equivalent localized missing-token message. ### Technical Analysis The script permits users or an agent to provide the Dataify API credential through the `--token` command-line option. Command-line arguments are not an appropriate secret transport because they may be exposed through: - Shell history files. - Process inspection utilities and operating-system process metadata. - Command telemetry, terminal logs, or agent execution logs. - Debugging and monitoring systems that capture process arguments. This command-line mechanism is unnecessary because the script already supports the documented `DATAIFY_API_TOKEN` environment variable. After resolving the token, the script also writes the normalized bearer credential back to `os.environ`. This mutation is not required to issue the request because `call_api` receives the token directly as a function argument. Any child process subsequently created by the same Python process would inherit the credential unless its environment were explicitly restricted. Although the current script does not create child processes, retaining this mutation unnecessa ...[truncated 1711 chars]
Remediation
View remediation
str: token = os.getenv("DATAIFY_API_TOKEN") if not token: raise MissingTokenError("DATAIFY_API_TOKEN is not configured.") token = token.strip() if not token.lower().startswith("bearer "): token = f"Bearer {token}" return token ``` The parser declaration for `--token` should then be removed, and the caller should invoke `resolve_token()` without passing command-line credentials. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.zh-CN.md:21
Finding

Persistent Plaintext API Token Storage Recommended in Shell Startup Files

Content
View full analysis
> ~/.bashrc source ~/.bashrc ``` ```bash echo 'export DATAIFY_API_TOKEN="your_token_here"' >> ~/.zshrc source ~/.zshrc ``` The surrounding documentation recommends permanent environment-variable configuration rather than session-scoped configuration. ### Technical Analysis The localized Skill documentation recommends storing the API token persistently in user-level environment configuration or plaintext shell startup files. On bash and zsh, the token is written directly into `.bashrc` or `.zshrc`. The setup command itself may also be retained in shell history. This approach creates a long-lived plaintext copy of a reusable credential. Shell startup files may be read by local applications running under the same user, included in workstation backups, collected by diagnostic tools, or accidentally disclosed with configuration files. Persistent user-level environment variables also make the credential available to a broader set of future processes than is necessary for a single API operation. This guidance exceeds minimum privilege and persistence requirements for the Skill's declared read-only video-search functionality. It also conflicts with the policy later in the same file that directs the agent to present a session-scoped setup command first and to discuss persistent setup only when requested. This is unsafe credential persistence guidance rather than a system backdoor: the instructions do not install a service, scheduled task, or malicious startup hook. ### Attack Path 1. A user follows the documented se ...[truncated 1084 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
Findings (17)

Tainted flow: 'request' from os.getenv (line 733, 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/bing_videos.py (reported line 735)May include surrounding context.

python
request = urllib.request.Request(DEFAULT_ENDPOINT, data=data, headers=headers, method="POST")
    try:
        with urllib.request.urlopen(request, timeout=timeout) as response:
            raw = response.read()
            text = raw.decode(response.headers.get_content_charset() or "utf-8", errors="replace")
            return 200 <= response.status < 300, text

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
94% confidence
Finding

The skill invokes environment access (DATAIFY_API_TOKEN) and performs live network calls, but it does not declare any explicit tool scope or allowed-tools boundary. That creates a permission ambiguity where an agent may execute capabilities broader than a reviewer or runtime policy expects, increasing the risk of unintended secret access and outbound requests.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill contains conflicting result-handling directives: one section says to return the live script output directly without summarization or reformatting, while another says to return a compact user-facing result by default and expose raw output only on request. Conflicting instructions are dangerous because agents may choose the less safe behavior inconsistently, potentially exposing full raw responses, embedded HTML, or metadata that should have been filtered.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The title Bing Videos 中文版 and the file content are entirely Chinese, but the document does not indicate that language selection is optional or that the skill is intentionally restricted to a Chinese locale. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern unless the locale constraint is explicitly justified.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill recommends persisting an API token in shell startup files and the Windows user environment without adequately warning that these locations are plaintext and broadly accessible to local processes, backups, and shell history or profile inspection. While this is a common convenience pattern, it increases the chance of credential leakage and long-lived token exposure.

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 103)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 105)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
94% confidence
Finding

The reference documents that queries are sent to https://scraperapi.dataify.com/request with a bearer token, but it does not clearly warn users that their search terms and any account-associated API usage data are transmitted to an external third-party service. In an agent-skill context, users may assume searches are local or first-party, so this omission can lead to unintended disclosure of sensitive queries, regulated data, or organization-specific research activity.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

User-facing natural-language strings in FIELD_DESCRIPTIONS are written in Chinese, and the missing-token error message is also Chinese-only. This imposes a language choice on users without opt-in or documentation that the skill is intended only for Chinese-speaking users.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The script parses natural-language user input and transmits the resulting search terms and filters to a third-party service without any explicit disclosure or consent mechanism in code. In a skill context, users may assume they are interacting with a local Bing wrapper, while their queries are actually being sent to Dataify, creating a privacy and data-handling risk especially if prompts contain sensitive or regulated information.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The example invocations use Chinese-language prompt text, which can imply a language preference in the skill's natural-language guidance. The file does not explicitly state that users may choose their own language for prompts, so this may conflict with a policy requiring language choice or opt-in.

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/bing_videos.py (reported line 617)May include surrounding context.

python
def apply_overrides(payload: dict[str, str], args: argparse.Namespace) -> dict[str, str]:
    for key in ["q", "json", "mkt", "cc", "setlang", "first", "length", "date", "resolution", "source_site", "price"]:
        value = getattr(args, key, None)
        if value is not None:
            payload[key] = value

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The code not only reads the API token from the environment but also writes the normalized Bearer token back into os.environ, increasing its lifetime and exposure to other in-process components, subprocesses, diagnostics, or accidental logging. While not an immediate exploit on its own, this broadens the credential exposure surface beyond what is necessary for a single request.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

The manifest describes a narrowly scoped video-search skill, but the missing-token error message includes promotional account-signup language about free credits. That capability is not needed to perform Bing Videos search and is not justified by the stated purpose of the skill.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.