Back to skill

Security audit

ZeeLin Search 智灵搜索

Security checks for vulnerabilities and agentic risk

Overview

This skill appears to be a real Zeelin search integration, but it needs review because it handles API credentials and stores full search results with weak safeguards.

Review before installing. Configure the API key outside the chat, verify the Zeelin API URL before use, avoid sensitive searches unless you accept sending them to the service, and periodically delete exported JSON result files.

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:13
Finding

API Credential Disclosure Through an Unvalidated Configurable Endpoint

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:13-18, SKILL.md:30-32, SKILL.md:80-81, SKILL.md:92-93; references/zenlin_search_api.md:58-74, references/zenlin_search_api.md:495-508
Vulnerability Type: Credential disclosure through an unvalidated destination
Risk Level: High

Vulnerable Code Snippet

The following is an English rendering of the relevant Skill instructions:

text
1. Read templates/config.json to obtain Zeelin_Api_Url,
   Zeelin_Api_Key, and Zeelin_Website_Url.
2. Check whether Zeelin_Api_Key is configured.
3. Do not check or mention Zeelin_Api_Url or Zeelin_Website_Url;
   these values are preset by the user.

Generate a timestamp and an HMAC-SHA256 signature using Zeelin_Api_Key.

Send a POST request:
  URL: Zeelin_Api_Url
  Headers:
    Content-Type: application/json; charset=utf-8
    app-key: ${Zeelin_Api_Key}
    sign: ${sign}
    timestamp: ${timestamp}

The configured endpoint is currently:

json
{
  "Zeelin_Website_Url": "https://skills.zeelin.cn",
  "Zeelin_Api_Url": "https://skills.zeelin.cn/v2/api/es/search/natural",
  "Zeelin_Api_Key": ""
}

Technical Analysis

The Skill reads the request destination from a mutable configuration file and transmits Zeelin_Api_Key directly in the app-key header. At the same time, its instructions explicitly prohibit checking or warning about the configured API URL.

No requirement enforces the expected skills.zeelin.cn hostname, HTTPS, an approved path, safe DNS resolution, or same-origin redirect handling. Consequently, a modified configuration can direct the authenticated request to an attacker-controlled endpoint. The HMAC signature does not prevent this disclosure because the API key itself is also transmitted as a header.

A maliciously modified Skill package, deployment template, or configuration file could set Zeelin_Api_Url before a user supplies a valid key. The next search wou ...[truncated 1255 chars]

Remediation
View remediation

Remediation Suggestions

  1. Replace the unrestricted configurable endpoint with a fixed, trusted API origin wherever possible.
  2. If configurability is required, enforce an exact allowlist for scheme, hostname, port, and path, such as:
    • Scheme: https
    • Hostname: skills.zeelin.cn
    • Port: 443
    • Path: /v2/api/es/search/natural
  3. Reject HTTP, IP-literal destinations, user-information components, nonstandard ports, and private, loopback, link-local, or metadata-service addresses.
  4. Resolve and validate the destination address immediately before connecting to mitigate DNS rebinding.
  5. Disable redirects for authenticated requests or permit only explicitly approved same-origin redirects. Never forward credentials across origins.
  6. Validate TLS certificates and hostnames without bypasses.
  7. Remove the instruction that forbids endpoint validation. Fail closed and warn the user when the configured endpoint differs from the approved service.
  8. Avoid transmitting the secret itself as an application identifier if the API protocol can be redesigned. Prefer a non-secret key identifier with a separate signing secret.
  9. Redact app-key and sign values from request diagnostics and logs.
  10. Rotate any key that may already have been sent to an untrusted endpoint.

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:74
Finding

Unsafe Collection of API Keys Through Conversation Input

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:74-78
Vulnerability Type: Sensitive credential exposure through chat history
Risk Level: Medium

Vulnerable Code Snippet

The following is an English rendering of the complete relevant instruction block:

text
If Zeelin_Api_Key is not configured, explain how to configure it, including:
  - Steps for visiting the official website
  - Instructions for obtaining the key
  - The exact configuration-file location and method
  - A configuration example showing where to enter Zeelin_Api_Key,
    or allow the user to enter it directly in the conversation so
    the Skill can configure it automatically

Technical Analysis

The Skill explicitly permits users to submit an API key in the conversation. Conversation content may be retained in model transcripts, observability systems, debugging logs, browser history, support exports, or other integrations. It may also remain visible to tools or participants that can access the session.

A chat interface is therefore not an appropriate secret-entry channel unless the hosting platform provides a dedicated secret field that is excluded from model context, logs, and transcripts. The audited project does not specify such controls, masking, retention restrictions, or redaction.

Automatically copying a credential from conversation history into configuration also creates multiple copies of the secret: one in the transcript and another in the configuration file.

Attack Path

  1. The Skill detects that Zeelin_Api_Key is empty.
  2. Following its instructions, it offers to accept the key directly in the conversation.
  3. The user pastes a valid API key into the chat.
  4. The key becomes part of the conversation context and may be retained in logs, transcripts, exports, or monitoring systems.
  5. A person, integration, or compromised component with access to those records obtains the key.
  6. The exposed key is ...[truncated 536 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove the option to enter Zeelin_Api_Key directly in ordinary conversation.
  2. Use a platform-provided secret manager or protected credential-entry interface that does not expose the value to model context or transcripts.
  3. If local configuration is necessary, instruct the user to edit the file outside the conversation.
  4. Store the configuration with restrictive permissions, such as directory mode 0700 and file mode 0600 on compatible systems.
  5. Never echo, display, or log the API key after entry.
  6. Add automatic redaction for accidental occurrences of the key in diagnostic output and error messages.
  7. Document credential rotation procedures for users who previously posted a key in chat.
  8. Prefer short-lived, narrowly scoped credentials where supported.

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:87
Finding

Mandatory Persistence of Complete API Responses Without Defined Privacy Controls

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:87-90; references/zenlin_search_api.md:355-363, references/zenlin_search_api.md:516-519
Vulnerability Type: Insecure local storage and unnecessary retention of response data
Risk Level: Medium

Vulnerable Code Snippet

The following is an English rendering of the relevant Skill requirements:

text
All data must be stored as JSON files in the user directory.
The user must be told the JSON file path.
File format: JSON
File name: zeelin_search_results_YYYYMMDD_HHMMSS.json
File content: the complete JSON response returned by the API.

The API reference further requires:

text
If records are successfully found, all final search results must be
output to the user as a file.

1. Display a preview in the conversation.
2. Write all complete results as a JSON file in the user directory.
3. Tell the user that the file was generated and disclose its path.

Technical Analysis

The Skill mandates persistent storage of every complete successful API response. Responses can contain the query context, article titles, authors, media identifiers, UUIDs, timestamps, URLs, sentiment classifications, and potentially additional fields returned by the live service.

The instructions do not require user consent, data minimization, restrictive file permissions, an application-specific private directory, atomic creation, symbolic-link protection, collision handling, encryption, retention limits, or deletion controls.

The timestamp-based filename is predictable. If file creation is implemented without exclusive and no-follow semantics, an attacker with suitable local access could potentially pre-create a symbolic link or otherwise influence the destination. Even without such manipulation, permissive default file or directory permissions may expose the stored data to other local processes or users.

Attack Path

A confidentiality exposure can occur ...[truncated 1819 chars]

Remediation
View remediation

Remediation Suggestions

  1. Do not persist results by default. Ask for explicit user consent before writing the complete response.
  2. Offer a preview-only mode and permit users to select which fields or records are exported.
  3. Use a dedicated application data directory rather than an unspecified user-directory location.
  4. Create the directory with mode 0700 and response files with mode 0600 on compatible systems.
  5. Create files atomically with exclusive-create and no-follow protections. Reject symbolic links and non-regular destination files.
  6. Use cryptographically random filename components instead of relying only on timestamps.
  7. Canonicalize the destination and verify that it remains inside the approved output directory.
  8. Apply data minimization by excluding unnecessary identifiers and metadata unless the user explicitly requests a complete export.
  9. Define retention and secure-deletion controls, and tell the user how to remove generated files.
  10. Avoid displaying the full local path when doing so would disclose sensitive account or directory names to shared transcripts.
  11. Consider encryption at rest when exported responses can contain sensitive information.
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
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (17)

Vague Triggers

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The trigger phrases are excessively broad and include generic terms like '舆情', '新闻报道', and '最新趋势', which can cause the skill to activate for many ordinary user requests that do not clearly indicate intent to use this specific integration. In this context, over-triggering is risky because the skill reads local configuration, calls an external API, and may persist returned data to disk, increasing the chance of unintended data disclosure or unauthorized outbound requests.

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The ellipsis-style trigger patterns ('...舆情', '...热点话题', etc.) are ambiguous and do not define what text before the suffix qualifies, making activation scope effectively unbounded. Because this skill performs network access and stores full API responses, ambiguous triggering materially increases the risk of accidental invocation and unnecessary collection or persistence of user-related query data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill instructs saving the complete API response JSON in the user's directory without any privacy notice, minimization rule, retention limit, or consent step. Full response payloads may contain sensitive query results, metadata, links, or user-interest information, and persisting them by default increases exposure to local disclosure, accidental sharing, or long-term retention risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

The instruction requires use of Chinese-supported encoding and the file content is written as a Chinese-only workflow, but it does not indicate that language behavior is optional or user-selected. This can constitute a locale/language policy issue when the skill is used in contexts where users have not opted into a specific language.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The entire skill specification is written to operate in Chinese and includes fixed Chinese interaction examples and output expectations, but it does not state that this locale restriction is optional or region-specific. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The document explicitly instructs the skill to inspect conversation history and inherit prior parameters for later queries. That expands data handling beyond a single-turn NL-to-JSON transform into stateful reuse of earlier user data, which can cause unintended retention or replay of prior subjects, sources, or time ranges without fresh user confirmation. In this skill context, that is meaningfully risky because the inherited data is then used to drive an external search workflow and may surface prior query context back to the user or onward to the API.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The instructions require reusing prior query parameters from conversation history without notifying the user that previous data will be carried forward. This can lead to silent reuse of user-provided topics, entities, time windows, or other search constraints, causing privacy surprises and potentially disclosing stale or sensitive prior context in subsequent outputs or API requests. The risk is heightened here because the downstream action is an external search call, so reused context can leave the local conversation boundary.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The context inheritance rules say to retain and reuse all prior parameters from the conversation history, including the entire other object. That creates a concrete data persistence and re-exposure risk: information from one turn can be silently carried into a later turn, echoed back in generated JSON, or transmitted to the search API even if the user did not restate it. In a search skill handling topics that may include sensitive entities or monitoring targets, this broad reuse increases the chance of unintended disclosure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

The skill instructs reading and using an API key for external requests but provides no guidance on safe credential handling, masking, logging avoidance, or user awareness that the key will authenticate calls to a third-party service. In context, the nearby requirement to print request parameters heightens the risk that secrets or authentication metadata could be exposed in logs or UI.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation expands the skill from a search/query function into persistent local file output of complete results, which is a capability increase not clearly reflected in the manifest description. This is dangerous because users may invoke what appears to be a retrieval skill without expecting local storage of potentially sensitive search results on disk.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

Requiring complete API-returned results to be exposed to the user as a file enforces unrestricted disclosure of all returned data regardless of sensitivity or need. If the backend returns more information than should be surfaced, this instruction bypasses data minimization and can leak personal, internal, or licensed content.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill mandates writing full search results to a user-directory file without warning about privacy, retention, or local disclosure risks. Search results may include sensitive, proprietary, or regulated data, and storing them in a predictable user-accessible location increases the chance of unintended exposure.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Writing the complete JSON response to the user directory and revealing its exact path materially increases disclosure risk by creating a durable copy in an accessible location. This can expose data to other local users, backup systems, indexing services, or later unintended sharing.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The mandated flow of previewing results and then exporting all complete results normalizes broad data disclosure as part of ordinary usage. In a search skill context, that is more dangerous because returned content may vary widely and could include sensitive records that should be summarized rather than fully replicated.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
94% confidence
Finding

The prompts and expected outputs are written entirely in Chinese and repeatedly require use of a Chinese-language search capability, but the file does not state that the skill is region- or language-specific or that users can opt into this locale. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The success-display section says to show all returned results, while later guidance says to show only the first 5 results if more data exists. These instructions cannot both be followed as written, creating an intent/documentation divergence that can mislead an implementing agent about expected behavior.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

This line says the displayed total should be the current page's result count rather than the overall total, but the response schema earlier defines data.total as the total hit count. That creates a contradiction between the documented API semantics and the required presentation behavior.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.