Back to skill

Security audit

一键将任意文章结构化总结到个人飞书知识库

Security checks for vulnerabilities and agentic risk

Overview

This Feishu archiving skill is not clearly malicious, but it automatically fetches arbitrary URLs and stores article or chat-derived content in Feishu with broad shell authority and weak safeguards.

Install only if you are comfortable with automatic public-web fetching and automatic Feishu writes under your account. Prefer running it with explicit command-style invocation, review chat/article content before archival, restrict URLs to trusted public sites, and replace sourced shell config plus unpinned/global dependencies before using it with sensitive conversations or business data.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (4)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
fetch-article.js:3
Finding

Unrestricted URL Navigation Enables Server-Side Request Forgery

Content
View full analysis
'); process.exit(1); } ``` ```javascript await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 }); ``` The workflow passes the supplied URL directly to this script: ```bash node "${CLAUDE_SKILL_DIR}/fetch-article.js" "" ``` ### Technical Analysis The script accepts an arbitrary command-line URL and passes it directly to Playwright without validating: - The URL protocol. - The destination hostname or resolved IP address. - Loopback, private, link-local, multicast, or reserved address ranges. - Redirect destinations. - Secondary network requests initiated by the loaded page. Because Playwright operates from the agent's execution environment, the browser may reach resources that are inaccessible to an external attacker. Examples include loopback services, internal administrative interfaces, private network applications, and cloud instance metadata endpoints. The script subsequently extracts `document.body.innerText` when article-specific selectors are absent. Therefore, text returned by an internal endpoint may be included in the script's JSON output, summarized by the agent, or uploaded to Feishu. The network access required for public article retrieval is legitimate, but unrestricted access to arbitrary protocols and network destinations exceeds the minimum privileges required for that functionality. ### Attack Path 1. An attacker supplies a URL pointing to a loopback, private-network, or link-local service, or supplies a public URL that redirects to such a destination. 2. The Skill invokes `fetch-article.js` with the attacker-controlled URL. 3. Playwright navigates ...[truncated 1147 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:81
Finding

Writable Configuration File Is Executed as Shell Code

Content
View full analysis
"${CLAUDE_SKILL_DIR}/.wiki-config" << 'WIKIEOF' # Knowledge-base configuration WIKI_SPACE_ID= INDEX_DOC_ID= INDEX_NODE_TOKEN= WIKIEOF ``` The file is later loaded as executable shell code: ```bash source "${CLAUDE_SKILL_DIR}/.wiki-config" ``` The same behavior is repeated before archival: ```bash source "${CLAUDE_SKILL_DIR}/.wiki-config" # WIKI_SPACE_ID, INDEX_DOC_ID, INDEX_NODE_TOKEN are read from the configuration ``` ### Technical Analysis The `.wiki-config` file is logically a data file, but `source` instructs the shell to parse and execute every statement it contains. Consequently, any shell syntax inserted into the file is treated as executable code rather than inert configuration data. The workflow does not specify: - A strict schema for the file. - Validation of identifier formats. - Safe serialization or quoting of values. - Rejection of extra keys or shell statements. - Ownership and permission checks before loading. - Protection against edits made between workflow runs. Even if the normal setup path initially produces benign identifiers, another local process, compromised project file, malicious setup value, or later modification can turn the file into an execution payload. The command executes automatically whenever the workflow loads the configuration. ### Attack Path 1. An attacker gains the ability to influence a setup value or modify `.wiki-config` in the Skill directory. 2. The attacker places a shell command, command substitution, or other executable shell construct in the file. 3. The user invokes the Skill for an otherwise l ...[truncated 981 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:142
Finding

Dynamic Values Are Embedded in Shell and JSON Command Templates Without a Safe Escaping Contract

Content
View full analysis
" ``` Image URLs are similarly inserted into a `curl` command: ```bash mkdir -p "${CLAUDE_SKILL_DIR}/_imgs" curl -s -o "${CLAUDE_SKILL_DIR}/_imgs/name.png" "" -H "Referer: https://mp.weixin.qq.com/" ``` Content-derived names are embedded in JSON held inside shell command strings: ```bash lark-cli wiki nodes create --params "{\"space_id\":\"${WIKI_SPACE_ID}\"}" \ --data '{"node_type":"origin","obj_type":"docx","title":""}' --as user lark-cli wiki nodes create --params "{\"space_id\":\"${WIKI_SPACE_ID}\"}" \ --data '{"node_type":"origin","obj_type":"docx","title":"","parent_node_token":""}' --as user ``` Generated document content is then sent through command-line operations: ```bash cd "${CLAUDE_SKILL_DIR}" && lark-cli docs +update \ --doc "" --mode append --as user --markdown @_temp.md ``` ### Technical Analysis The Skill relies on an agent to substitute user-controlled and content-derived data into Bash examples. It does not define a safe execution contract requiring argument arrays, strict validation, or serializer-generated JSON. Shell quoting in a documentation template is not sufficient when an untrusted value may contain quotes, command substitutions, newlines, leading options, or other metacharacters. Likewise, embedding an article-derived category or title directly into JSON can alter the JSON structure unless the value is serialized correctly. The vulnerable data sources may include: - User-supplied article URLs. - Image URLs extracted from untrusted pages. - Article titles and content used to generate category names. - Feishu ...[truncated 1560 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:37
Finding

Unpinned and Inconsistently Documented Third-Party Dependencies Create Supply-Chain Risk

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (18)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description promises an end-to-end knowledge workflow including summarization and Feishu knowledge-base archival for multiple input types (article links, conversations, manuscripts). The supplied code only implements one narrow preprocessing step: visiting a URL and extracting article text/metadata. There is no summarization logic, no Feishu API interaction or archival behavior, and no handling of dialogue content or standalone documents. While article-link ingestion could be a supporting component of the larger workflow, this code chunk by itself does not accurately match the declared full functionality, so it should be flagged as a mismatch.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The instruction to run file, network, and subprocess actions fully automatically and without user-facing warning removes an important consent barrier. In this skill's context, those actions include fetching external content, downloading images, modifying local files, and uploading data to Feishu, so accidental or manipulated invocation can cause immediate data exfiltration or unintended side effects.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

--doc "<doc_id>" --file "./name.png" --caption "图片说明" --align center --as user

清理

rm -rf "${CLAUDE_SKILL_DIR}/_imgs"

text

### 原则

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

bash
cd "${CLAUDE_SKILL_DIR}" && lark-cli docs +update \
  --doc "<doc_id>" --mode append --as user --markdown @_temp.md
rm -f "${CLAUDE_SKILL_DIR}/_temp.md"

第四步:更新索引

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

cd "${CLAUDE_SKILL_DIR}" && lark-cli docs +update
--doc "${INDEX_DOC_ID}" --mode insert_before
--selection-by-title "## " --as user --markdown @_index.md rm -f "${CLAUDE_SKILL_DIR}/_index.md"

text

> 如果文档为空或找不到 `## ` 标题,回退用 `append` 模式。

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README explicitly promotes a zero-confirmation workflow that fetches remote content, summarizes it, classifies it, and writes new documents to Feishu automatically. This creates a real transparency and consent problem: users may trigger network access and persistent document creation without realizing that external content and derived data will be transmitted to third-party services and stored in their knowledge base.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The chat-archiving mode indicates that the current conversation can be extracted and archived, but the documentation does not clearly warn that potentially sensitive conversation content may be sent onward and stored in Feishu. In a chat context, this is more dangerous because users may include credentials, private business data, personal data, or internal deliberations that were never intended for external persistence.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The trigger phrase includes a natural everyday expression, which raises the risk of accidental activation during ordinary conversation. Because activation can lead to scraping, summarization, and external archival to Feishu, an overly broad trigger materially increases the chance of unintended data handling.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill explicitly directs automatic execution of shell commands such as curl, mkdir, rm, and lark-cli without meaningful guardrails. In a workflow that handles untrusted URLs, downloaded content, and local files, broadly authorizing shell actions increases the chance of unsafe file operations, unintended network activity, or misuse of tool parameters.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill instructs archiving current conversation content to Feishu without confirmation, which can leak sensitive user-provided information, internal prompts, or context the user did not intend to store externally. Because the workflow is described as fully automatic, the exposure can happen immediately on a casual trigger phrase.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

A natural-language trigger that archives chat context to external storage based on semantic interpretation creates a hidden data-exposure path. Users may not realize that ordinary phrasing can cause prior conversation content to be extracted, summarized, and uploaded to Feishu.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
82% confidence
Finding

The workflow downloads remote images and then uploads selected content to Feishu, which is an external transmission path. In a knowledge-archiving skill this behavior is expected, but it is still security-relevant because untrusted remote content is fetched and user/workflow-derived data is sent to an external platform, potentially without sufficient validation or consent.

Content

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

bash
# 下载图片
mkdir -p "${CLAUDE_SKILL_DIR}/_imgs"
curl -s -o "${CLAUDE_SKILL_DIR}/_imgs/name.png" "<img_url>" -H "Referer: https://mp.weixin.qq.com/"

# 上传到飞书文档(必须 cd 到图片目录用相对路径)
cd "${CLAUDE_SKILL_DIR}/_imgs" && lark-cli docs +media-insert \

Ssd 3

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The chat-archiving workflow explicitly extracts 'core insights' from conversation and stores them externally, creating a semantic exfiltration channel even if the raw chat is not copied verbatim. Sensitive business context, personal information, or confidential instructions can still be preserved in summarized form and transmitted to Feishu.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The script performs a headless browser fetch against a user-supplied arbitrary URL with no validation, allowlist, or user-facing disclosure that an external request will be made and page contents ingested. In an agent skill context, this can expose internal services or sensitive endpoints to server-side request behavior, leak metadata through outbound requests, and unexpectedly transmit or process third-party content on behalf of the user.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The README consistently presents the skill in Chinese and examples imply Chinese-language operation, but there is no statement that the user can choose another language or that the locale restriction is intentional. Under the language/locale policy rule, forcing a specific language without opt-in can be a natural-language policy issue.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
97% confidence
Finding

Line L012 says the workflow should run from start to finish without interruption or confirmation, but the setup section later states that after the user runs authentication commands, the skill should wait for user confirmation before continuing. This is an active contradiction in the skill's own operational instructions, not merely missing detail.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
94% confidence
Finding

The dependency uses a caret range (^1.59.1), which permits installation of newer compatible releases rather than a single reviewed version. This weakens build reproducibility and can allow a vulnerable or malicious upstream release to be pulled into the skill without explicit review, which matters more here because the skill relies on Playwright to fetch external content and execute a browser stack.

Content

Scanner excerpt · package.json (reported line 14)May include surrounding context.

json
"license": "ISC",
  "type": "commonjs",
  "dependencies": {
    "playwright": "^1.59.1"
  }
}

Unverifiable Dependency: playwright has 1 known advisory(ies) (CVE-2025-59288 (Playwright downloads and installs browsers without verifying the authenticity of)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
83% confidence
Finding

The manifest references Playwright without exact pinning while Playwright has a known advisory related to downloading/installing browsers without verifying authenticity. Because the resolved version is not strictly fixed, it is not possible to determine from this file alone whether deployment will use an affected release, creating supply-chain uncertainty in a skill that fetches remote articles and depends on browser automation components.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.