Back to skill

Security audit

ZeeLin Deep Research 深度研究

Security checks for vulnerabilities and agentic risk

Overview

This research skill appears purpose-aligned, but it sends user research content to an external service and gives automatic file and Feishu document sharing instructions with weak safeguards.

Review before installing. Use this only for research prompts and reports that are acceptable to send to ZeeLin and, where applicable, Feishu or the user's messaging channel. Avoid confidential, regulated, or proprietary material unless your organization approves those transfers. Prefer per-run private temporary directories, validate downloaded report URLs/files, confirm the recipient/channel before sending, and delete temporary files after delivery.

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
SKILL.md:303
Finding

Predictable Temporary Files Permit Symlink-Based File Overwrite and Cross-Run Interference

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:303-307, SKILL.md:357-360, SKILL.md:404-407, SKILL.md:513-515, and SKILL.md:579-586
Vulnerability Type: Predictable temporary file usage and unsafe extraction directory
Risk Level: Medium

Vulnerable Code

bash
PDF_URL=$(echo $REPORT_RESULT | jq -r '.data')
echo "PDF URL: $PDF_URL"

# 4. Download PDF file
curl -s -o /tmp/research_result.pdf "$PDF_URL"

The same predictable PDF path is used again:

bash
PDF_URL=$(echo $REPORT_RESULT | jq -r '.data')

# Download PDF file
curl -s -o /tmp/research_result.pdf "$PDF_URL"

The background execution example uses another fixed path:

bash
PDF_URL=$(curl -s 'https://desearch.zeelin.cn/api/conversation/to_report?sessionId=${SESSION_ID}&reportType=pdf' \
  -H 'x-api-key: ${API_KEY}' | jq -r '.data')
curl -s -o /tmp/report.pdf "$PDF_URL"

The Feishu workflow uses predictable input, output, and extraction paths:

bash
WORD_URL=$(echo $REPORT_RESULT | jq -r '.data')

# 4. Download Word file
curl -s -o /tmp/research.docx "$WORD_URL"

# 5. Extract text from the Word file
unzip -q /tmp/research.docx -d /tmp/research_docx/
sed 's/<[^>]*>//g' /tmp/research_docx/word/document.xml | tr -s ' \n' > /tmp/research.txt

Technical Analysis

The documented workflows write downloaded reports to fixed, shared paths under /tmp, including /tmp/research_result.pdf, /tmp/report.pdf, /tmp/research.docx, /tmp/research.txt, and /tmp/research_docx/. They do not securely create these paths, verify file ownership, reject symbolic links, or isolate concurrent executions.

On systems where another local process or user can create entries in /tmp, an attacker can pre-create one of the expected output files as a symbolic link to another file writable by the Agent. curl -o opens the resolved destination and can therefore overwrite the symlink target with down ...[truncated 2040 chars]

Remediation
View remediation

Remediation Suggestions

  1. Create a unique private temporary directory for every invocation:

    bash
    umask 077
    TMP_DIR=$(mktemp -d) || exit 1
    trap 'rm -rf -- "$TMP_DIR"' EXIT INT TERM
    
  2. Store all downloaded and generated files beneath that directory:

    bash
    PDF_PATH="$TMP_DIR/research_result.pdf"
    DOCX_PATH="$TMP_DIR/research.docx"
    EXTRACT_DIR="$TMP_DIR/research_docx"
    TEXT_PATH="$TMP_DIR/research.txt"
    
  3. Do not reuse fixed /tmp paths across users, tasks, or concurrent executions.

  4. Create output files with exclusive semantics where possible, and verify that destinations are regular files owned by the current Agent account. Reject symbolic links before processing or sending files.

  5. Create the extraction directory with restrictive permissions and ensure it did not exist previously:

    bash
    mkdir -m 700 "$EXTRACT_DIR" || exit 1
    unzip -q "$DOCX_PATH" -d "$EXTRACT_DIR"
    
  6. Validate downloaded reports before processing them, including HTTPS scheme, approved host, maximum size, expected MIME type, and format signature.

  7. Keep each task's temporary directory private until delivery is complete, then remove it through the cleanup trap.

  8. Before sending or publishing a report, confirm that the file is a non-symlink regular file located within the task-specific temporary directory.

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (13)

Tp2

High
Category
MCP Tool Poisoning
Confidence
85% confidence
Finding

Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill instructs sending user prompts, follow-up content, and session data to an external service but does not clearly warn users that their research queries will leave the local environment. This can expose confidential business plans, market analysis requests, or proprietary questions to a third-party processor without informed consent.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This command transmits user-provided research content and an API credential to an external domain. In a research skill this is expected functionality, but it is still a real data-transfer risk because user inputs may contain sensitive information and there is no built-in consent, redaction, or data-classification guardrail.

Content

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

bash
API_KEY="${DESEARCH_API_KEY}"
curl -s -X POST "https://desearch.zeelin.cn/api/conversation/anew" \
  -H "Content-Type: application/json" \
  -H "x-api-key: ${API_KEY}" \
  -d '{

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill directs downloading generated reports into local temporary storage and forwarding them onward without warning about local persistence, access controls, or cleanup. Sensitive report contents may remain on disk, be readable by other processes, or be accidentally reused or exfiltrated later.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This repeated API submission pattern again sends user content to an external service during error-handling examples. Repetition throughout the skill normalizes outbound sharing without any accompanying privacy control, increasing the chance operators will transmit sensitive requests by default.

Content

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

bash
# 检查返回码
RESULT=$(curl -s -X POST "https://desearch.zeelin.cn/api/conversation/anew" \
  -H "Content-Type: application/json" \
  -H "x-api-key: ${API_KEY}" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

The full task-flow example submits content externally and persists identifiers for later retrieval. This is functionally aligned with the skill, but still creates a real confidentiality concern because it encourages broad use of a remote processor for potentially sensitive research workloads.

Content

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

bash
# 1. 创建任务
API_KEY="${DESEARCH_API_KEY}"
RESULT=$(curl -s -X POST "https://desearch.zeelin.cn/api/conversation/anew" \
  -H "Content-Type: application/json" \
  -H "x-api-key: ${API_KEY}" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

The workflow downloads a remotely hosted report to a local file and then sends that file to a user through another channel, creating multiple transfer hops. Each hop increases exposure risk, especially if the report contains proprietary research or if the downloaded URL or file is not validated and cleaned up.

Content

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

md
echo "PDF URL: $PDF_URL"

# 4. 下载 PDF 文件
curl -s -o /tmp/research_result.pdf "$PDF_URL"

# 5. 发送 PDF 文件给用户
message action=send target=用户ID filePath=/tmp/research_result.pdf

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

The skill explicitly mandates downloading and sending a PDF rather than returning text, forcing local file handling and outbound redistribution even when unnecessary. This makes the context more dangerous because it removes safer alternatives and encourages broader data propagation.

Content

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

md
PDF_URL=$(echo $REPORT_RESULT | jq -r '.data')

# 下载 PDF 文件
curl -s -o /tmp/research_result.pdf "$PDF_URL"

# 发送 PDF 文件给用户
message action=send target=用户ID filePath=/tmp/research_result.pdf

External Transmission

Medium
Category
Data Exfiltration
Confidence
92% confidence
Finding

This automation guidance instructs immediate file delivery after polling completion, emphasizing unattended end-to-end transfer of generated reports. Automated retransmission of potentially sensitive content without a final user confirmation or destination check raises accidental disclosure risk.

Content

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

  1. 任务完成后立即发送:在轮询循环结束后,立即调用 message 工具发送 PDF
    bash
    # 下载 PDF 后立即发送
    curl -s -o /tmp/research_result.pdf "$PDF_URL"
    message action=send target=用户ID filePath=/tmp/research_result.pdf
    

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill expands beyond research submission into automated Feishu document creation, content extraction from downloaded reports, and outbound delivery. That creates additional data exposure paths and grants the skill messaging/document-manipulation capability that can redistribute sensitive report contents without clear minimization, consent, or destination validation.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This Feishu-specific workflow again sends the user's research request to the external research API. The additional document-publication context increases the blast radius because the resulting content is intended for onward publication into a collaboration platform.

Content

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

bash
# 1. 创建任务
API_KEY="${DESEARCH_API_KEY}"
RESULT=$(curl -s -X POST "https://desearch.zeelin.cn/api/conversation/anew" \
  -H "Content-Type: application/json" \
  -H "x-api-key: ${API_KEY}" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
91% confidence
Finding

The skill downloads a generated Word document, extracts its contents, and writes them into a Feishu document. This materially increases exposure because report contents are copied across systems and transformed locally, with no guidance on sanitization, permission scoping, retention, or handling of malicious or sensitive embedded content.

Content

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

md
WORD_URL=$(echo $REPORT_RESULT | jq -r '.data')

# 4. 下载 Word 文件
curl -s -o /tmp/research.docx "$WORD_URL"

# 5. 解压 Word 文件提取文字内容
unzip -q /tmp/research.docx -d /tmp/research_docx/

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The manifest presents the skill as a research assistant, but these instructions introduce OpenClaw-specific background execution, long-running process control, and polling orchestration via exec and process. While useful operationally, such job-control capability is not part of the user-facing research purpose described in the manifest.

Content

No source excerpt is available for this finding.