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## 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
## 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.

Missing User Warnings

Medium
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.

External Transmission

Medium
Category
Data Exfiltration
Content
```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 '{
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.

Missing User Warnings

Medium
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.

External Transmission

Medium
Category
Data Exfiltration
Content
```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 '{
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.

External Transmission

Medium
Category
Data Exfiltration
Content
```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 '{
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.

External Transmission

Medium
Category
Data Exfiltration
Content
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
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.

External Transmission

Medium
Category
Data Exfiltration
Content
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
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.

External Transmission

Medium
Category
Data Exfiltration
Content
3. **任务完成后立即发送**:在轮询循环结束后,立即调用 message 工具发送 PDF
   ```bash
   # 下载 PDF 后立即发送
   curl -s -o /tmp/research_result.pdf "$PDF_URL"
   message action=send target=用户ID filePath=/tmp/research_result.pdf
   ```
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.

Context-Inappropriate Capability

Medium
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.

External Transmission

Medium
Category
Data Exfiltration
Content
```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 '{
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.

External Transmission

Medium
Category
Data Exfiltration
Content
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/
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.

Context-Inappropriate Capability

Low
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.

Static analysis

Detected: suspicious.generated_source_template_injection

User-controlled placeholder is embedded directly into generated source code.

Critical
Code
suspicious.generated_source_template_injection
Location
SKILL.md:49