Back to skill

Security audit

Auto Deep Research

Security checks for vulnerabilities and agentic risk

Overview

This research skill is mostly purpose-aligned, but its helper scripts can write to unrestricted file paths and may overwrite user-writable files if misused.

Review before installing. Use this only for research topics you are comfortable sending to external search/page-reading services, and avoid passing custom output paths to the helper scripts unless they are inside a dedicated research output directory. The package does not show deception or credential theft, but its file-write behavior should be tightened before use in sensitive workspaces.

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

Warning
Location
scripts/search.sh:6
Finding
Unrestricted Output Path Allows Arbitrary File Overwrite in Search Script<![CDATA[ ## Vulnerability Details **File Location**: `scripts/search.sh`, lines 6-22 **Vulnerability Type**: Unrestricted file write and file truncation **Risk Level**: Medium ### Vulnerable Code ```bash MAX_RESULTS="${2:-5}" OUTPUT_FILE="${3:-search_results.json}" if [ -z "$QUERY" ]; then echo "Usage: search.sh <query> [max_results] [output_file]" exit 1 fi # 优先用 Tavily,其次 DuckDuckGo if [ -n "$TAVILY_API_KEY" ]; then curl -s "https://api.tavily.com/search" \ -H "Authorization: Bearer $TAVILY_API_KEY" \ -H "Content-Type: application/json" \ -d "{\"query\": \"$QUERY\", \"max_results\": $MAX_RESULTS}" \ > "$OUTPUT_FILE" else # DuckDuckGo 免费 curl -s "https://api.duckduckgo.com/?q=$(echo "$QUERY" | urlencode)&format=json&no_html=1" \ > "$OUTPUT_FILE" fi ``` ### Technical Analysis The third positional argument is used directly as the destination of a shell redirection. Although the variable is quoted and therefore does not permit shell metacharacter injection, the script does not restrict the path to an approved output directory. Shell redirection opens the specified file with truncation before `curl` writes its response. Absolute paths, relative traversal paths such as `../../file`, and paths reached through symbolic links are accepted. Consequently, a caller that controls the script arguments can truncate or replace any file writable by the account running the Skill. ### Attack Path 1. An attacker supplies a research request or workflow input that influences the output-file argument. 2. The Agent invokes the script with a path outside the intended research directory, for example: ```bash ./scripts/search.sh "query" 5 "../../writable-configuration-file" ``` 3. The shell resolves the traversal path and opens the target using truncating redirection. 4. The target is emptied and then populated with the external API response, or left empty if the request produces no output. 5. Subsequent tools or sessions that depend on ...[truncated 638 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Remove the caller-controlled output-path argument if it is not required. - Create a dedicated research-output directory and resolve all output files beneath it. - Reject absolute paths and path components containing `..`. - Canonicalize both the approved directory and requested destination, then verify that the destination remains inside the approved directory. - Reject symbolic-link destinations or open files using protections equivalent to `O_NOFOLLOW`. - Use restrictive permissions and atomic file creation. - Consider writing to a securely created temporary file and moving it into place only after a successful API response. - Return an error when the request fails instead of silently creating or truncating an output file. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/read_page.sh:5
Finding
Unrestricted Output Path Allows Arbitrary File Overwrite in Page Reader<![CDATA[ ## Vulnerability Details **File Location**: `scripts/read_page.sh`, lines 5-13 **Vulnerability Type**: Unrestricted file write and file truncation **Risk Level**: Medium ### Vulnerable Code ```bash OUTPUT_FILE="${2:-page.md}" if [ -z "$URL" ]; then echo "Usage: read_page.sh <url> [output_file]" exit 1 fi # Jina Reader API curl -s "https://r.jina.ai/readability/page?url=$URL" > "$OUTPUT_FILE" ``` ### Technical Analysis The second positional argument is accepted as an unrestricted filesystem destination. The quoted redirection prevents command injection but still permits absolute paths, directory traversal, and destinations reached through symbolic links. The target is opened with truncation before page content is written. The script performs no canonical-path check, output-directory restriction, symbolic-link defense, ownership verification, or confirmation that the destination is an ordinary newly created file. ### Attack Path 1. An attacker causes the Agent to read a page while supplying or influencing the output path. 2. The Agent invokes the script with a traversal or absolute destination, for example: ```bash ./scripts/read_page.sh "https://example.test/page" "../../writable-agent-state.md" ``` 3. Shell redirection truncates the resolved target. 4. Content returned by Jina Reader is written into that file. 5. The overwritten file may cause denial of service or influence a later component that trusts or interprets its contents. ### Impact Assessment An attacker can corrupt or replace files writable by the Skill's operating-system account. The vulnerability does not itself cross operating-system permission boundaries, but it violates expected output isolation. Potentially affected assets include project source files, research state, Agent configuration, user configuration, and other writable files. If a downstream process executes or interprets the overwritten file, the impact could extend beyond data loss, although such a ...[truncated 73 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Constrain downloaded pages to a dedicated output directory. - Reject absolute paths, `..` path traversal, and destinations outside the canonical approved directory. - Do not follow symbolic links when creating output files. - Generate output filenames internally rather than accepting arbitrary paths from callers. - Create files with restrictive permissions and use atomic writes. - Download into a secure temporary file first and move it into place only after checking the HTTP result. - Configure `curl` to fail on HTTP errors, report failures, and apply appropriate connection and transfer timeouts. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
scripts/search.sh:4
Finding
Unsafe JSON Construction Permits Tavily Request-Body Manipulation<![CDATA[ ## Vulnerability Details **File Location**: `scripts/search.sh`, lines 4-18 **Vulnerability Type**: Improper input validation and unsafe JSON construction **Risk Level**: Low ### Vulnerable Code ```bash QUERY="$1" MAX_RESULTS="${2:-5}" OUTPUT_FILE="${3:-search_results.json}" if [ -z "$QUERY" ]; then echo "Usage: search.sh <query> [max_results] [output_file]" exit 1 fi # 优先用 Tavily,其次 DuckDuckGo if [ -n "$TAVILY_API_KEY" ]; then curl -s "https://api.tavily.com/search" \ -H "Authorization: Bearer $TAVILY_API_KEY" \ -H "Content-Type: application/json" \ -d "{\"query\": \"$QUERY\", \"max_results\": $MAX_RESULTS}" \ > "$OUTPUT_FILE" ``` ### Technical Analysis The script constructs JSON through direct shell-string interpolation. `QUERY` is inserted without JSON escaping, so quotation marks, backslashes, and control characters can terminate or alter the intended string value. `MAX_RESULTS` is inserted as a raw JSON token without checking that it is a bounded integer. Because the shell variables remain inside a quoted shell argument, this issue does not establish shell command injection. It does, however, allow malformed JSON or manipulation of the logical request body sent to Tavily. A crafted query can close the original JSON string and introduce additional properties, while a crafted result-limit argument can introduce arbitrary JSON tokens. ### Attack Path 1. An attacker supplies a query containing JSON syntax or controls the `max_results` argument. 2. The script directly interpolates that input into the `curl -d` argument. 3. The resulting body differs from the intended two-field JSON object or is syntactically invalid. 4. Tavily rejects the request or processes attacker-influenced request fields. 5. Repeated malformed or expanded requests can disrupt research operations or consume API quota. For example, an input containing embedded quotation marks can alter the JSON structure even though it cannot escape into a new shell ...[truncated 476 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Construct request bodies with a JSON serializer instead of string interpolation. - Validate `MAX_RESULTS` as a decimal integer and enforce a reasonable range before invoking `curl`. - For example: ```bash if ! [[ "$MAX_RESULTS" =~ ^[0-9]+$ ]] || (( MAX_RESULTS < 1 || MAX_RESULTS > 20 )); then echo "max_results must be an integer from 1 to 20" >&2 exit 1 fi PAYLOAD="$(jq -n \ --arg query "$QUERY" \ --argjson max_results "$MAX_RESULTS" \ '{query: $query, max_results: $max_results}')" curl --fail-with-body --silent --show-error \ "https://api.tavily.com/search" \ -H "Authorization: Bearer $TAVILY_API_KEY" \ -H "Content-Type: application/json" \ --data-binary "$PAYLOAD" ``` - Check `curl` exit status and HTTP failures before treating the output as a valid search result. - Add tests covering quotation marks, backslashes, line breaks, Unicode, and invalid result-limit values. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (20)

Credential Access

High
Category
Privilege Escalation
Content
```bash
git clone https://github.com/Pancat009/auto-deep-research-skill
cd auto-deep-research-skill
cp env.example .env
```

配置 API Key(至少一个):
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
```bash
git clone https://github.com/Pancat009/auto-deep-research-skill
cd auto-deep-research-skill
cp env.example .env
```

配置 API Key(至少一个):
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
声明描述的是一个完整的深度研究能力:围绕主题调查、比较、追踪、趋势分析,并通过问题拆分、多轮搜索、多个独立来源交叉验证后输出结构化结论。实际提供的代码片段只是一个简单的网页读取封装脚本,功能是把指定 URL 通过 Jina Reader API 转换并保存为文件。它没有展示搜索、研究编排、来源验证、报告生成或结论校验等核心能力。因此代码的实际主要用途与声明的主要用途存在实质性差异,应判定为不匹配。

Lp3

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding
The skill clearly instructs use of shell scripts and curl-based network operations, but it does not declare any explicit tool scope or allowed-tools boundary. This creates an authorization gap where an agent may execute shell/network actions more broadly than the user expects, increasing the chance of unintended command execution or unsafe environment access.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The skill instructs sending search queries and fetched URLs to third-party services such as Tavily, DuckDuckGo, and Jina without any privacy warning or consent flow. User prompts, topics, and target URLs may contain sensitive or proprietary information, so silent transmission to external providers creates a real confidentiality risk.

External Transmission

Medium
Category
Data Exfiltration
Content
**手动调用**:
```bash
# Tavily(需要 API key)
curl "https://api.tavily.com/search" \
  -H "Authorization: Bearer $TAVILY_API_KEY" \
  -d '{"query": "query", "max_results": 5}'
Confidence
93% confidence
Finding
This instruction explicitly transmits user-derived search content to an external API over the network. In a research skill, that behavior is expected, but it is still security-relevant because sensitive prompts, investigative targets, or internal topics may be disclosed to a third party if used without safeguards.

External Transmission

Medium
Category
Data Exfiltration
Content
**手动调用**:
```bash
# Tavily(需要 API key)
curl "https://api.tavily.com/search" \
  -H "Authorization: Bearer $TAVILY_API_KEY" \
  -d '{"query": "query", "max_results": 5}'
Confidence
93% confidence
Finding
This instruction explicitly transmits user-derived search content to an external API over the network. In a research skill, that behavior is expected, but it is still security-relevant because sensitive prompts, investigative targets, or internal topics may be disclosed to a third party if used without safeguards.

External Transmission

Medium
Category
Data Exfiltration
Content
-d '{"query": "query", "max_results": 5}'

# DuckDuckGo(免费,搜索网页内容)
curl "https://api.duckduckgo.com/?q=query&format=json"
# 如果curl失效,则用 Python duckduckgo-search 库或 SearXNG
```
Confidence
92% confidence
Finding
This call sends the query to DuckDuckGo, which is an external transmission of potentially sensitive user research content. In context the skill is designed for web research, so the behavior is expected, but the danger increases because the skill provides no privacy warning, consent gate, or guidance against sending confidential data.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
This markdown file presents all instructions and examples exclusively in Chinese, which can amount to a language/locale policy violation when no user opt-in or scope justification is provided. The file does not indicate that the skill is region-specific or that users can choose another language.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
This markdown file contains all user-facing guidance in Chinese and does not indicate that language selection is optional or limited to a specific region-specific use case. The policy requires flagging language or locale constraints when a skill forces a specific language without user opt-in.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The script sends any user-supplied URL to the external Jina Reader service, which discloses the browsing target to a third party without any notice, consent flow, or validation. In a research skill, users may pass internal, sensitive, or unannounced URLs, creating privacy leakage and possible exposure of internal resources or confidential investigation targets.

External Transmission

Medium
Category
Data Exfiltration
Content
# 优先用 Tavily,其次 DuckDuckGo
if [ -n "$TAVILY_API_KEY" ]; then
  curl -s "https://api.tavily.com/search" \
    -H "Authorization: Bearer $TAVILY_API_KEY" \
    -H "Content-Type: application/json" \
    -d "{\"query\": \"$QUERY\", \"max_results\": $MAX_RESULTS}" \
Confidence
96% confidence
Finding
This line transmits user-controlled query content and an API credential to an external search provider. While expected for a search skill, it is still a genuine external data exposure point: sensitive prompts, internal investigation topics, or personal data may be disclosed to a third party, and the skill context makes this more sensitive because 'deep research' workflows often involve confidential subject matter.

External Transmission

Medium
Category
Data Exfiltration
Content
# 优先用 Tavily,其次 DuckDuckGo
if [ -n "$TAVILY_API_KEY" ]; then
  curl -s "https://api.tavily.com/search" \
    -H "Authorization: Bearer $TAVILY_API_KEY" \
    -H "Content-Type: application/json" \
    -d "{\"query\": \"$QUERY\", \"max_results\": $MAX_RESULTS}" \
Confidence
96% confidence
Finding
This line transmits user-controlled query content and an API credential to an external search provider. While expected for a search skill, it is still a genuine external data exposure point: sensitive prompts, internal investigation topics, or personal data may be disclosed to a third party, and the skill context makes this more sensitive because 'deep research' workflows often involve confidential subject matter.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The script sends the user's raw search query to third-party services (Tavily or DuckDuckGo) without any notice, consent flow, or opportunity to redact sensitive content. In a deep-research skill, users may submit proprietary, personal, or investigative queries, so silent external transmission creates a real privacy and data-handling risk even though the behavior is core to the feature.

External Transmission

Medium
Category
Data Exfiltration
Content
> "$OUTPUT_FILE"
else
  # DuckDuckGo 免费
 curl -s "https://api.duckduckgo.com/?q=$(echo "$QUERY" | urlencode)&format=json&no_html=1" \
    > "$OUTPUT_FILE"
fi
Confidence
95% confidence
Finding
The fallback request sends the user's search query to DuckDuckGo without any user-facing disclosure or sensitivity checks. This is a real privacy issue because the fallback broadens external exposure to another provider, potentially without the user's knowledge, and deep-research queries may contain sensitive investigative or organizational information.

Missing User Warnings

Low
Confidence
88% confidence
Finding
This markdown file explicitly states that each research run creates an `output/{topic-slug}/` directory containing state, notes, sources, and a final report. Because these are persistent writes of user-provided research topics and gathered content, the skill description should disclose this behavior more clearly as a user-facing warning or notice.

Natural-Language Policy Violations

Low
Confidence
84% confidence
Finding
The description is entirely in Chinese and presents the skill behavior in that language without indicating that the user may choose another language. This can be a natural-language policy issue when a skill effectively forces a specific language or locale without opt-in.

Missing User Warnings

Low
Confidence
91% confidence
Finding
The skill directs creation of persistent local files and directories under output/ without warning the user or constraining where data is written. Unexpected filesystem writes can expose sensitive research topics, overwrite prior artifacts, or create persistence that other tools and agents may later consume incorrectly.

Natural-Language Policy Violations

Low
Confidence
75% confidence
Finding
The inline comment includes Chinese text ('封装 Jina Reader API') in a file that otherwise uses English, which can impose a language expectation on maintainers or reviewers without any stated opt-in or locale justification. Under the stated policy, forcing a specific language without user choice can be a natural-language policy concern.

Natural-Language Policy Violations

Low
Confidence
78% confidence
Finding
The script contains natural-language comments in Chinese only, such as the file description and provider notes, without offering a language choice or documenting a justified locale restriction. This can violate language/locale policy when the skill is not clearly intended to be Chinese-only.

Static analysis

No suspicious patterns detected.