Back to skill

Security audit

Feishu Base

Security checks for vulnerabilities and agentic risk

Overview

This Feishu Base skill is mostly coherent, but its attachment features can read local files or fetch arbitrary URLs and upload the contents to Feishu without strong scoping or confirmation.

Review before installing. Use this only with tightly scoped Feishu credentials and a runtime that limits filesystem and network access. Keep allowDelete disabled unless you truly need deletions, avoid raw local file paths and arbitrary URL attachment imports unless the user explicitly selected the source, and consider pinning dependencies before production use.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (2)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
src/base/attachments.js:124
Finding

Unrestricted Local File Read and Upload to Feishu

Content
View full analysis
Boolean(value.file_path || value.url), { message: 'upload_attachment requires file_path or url' } ), ``` The path is resolved and read without an approved-root restriction: ```js if (input.file_path) { const filePath = path.resolve(input.file_path); const stat = await fs.promises.stat(filePath).catch(() => null); if (!stat?.isFile()) { throw baseError('FILE_NOT_FOUND', `Local file not found: ${filePath}`, { file_path: input.file_path }); } const buffer = await fs.promises.readFile(filePath); return { buffer, filename: input.filename || path.basename(filePath), size: stat.size, mimeType: input.mime_type || inferMimeType(input.filename || filePath), source: { file_path: filePath }, }; } ``` The resulting contents are subsequently transmitted to Feishu: ```js uploadResponse = await client.drive.v1.file.uploadAll({ data: { file_name: filename, parent_type: 'bitable_file', parent_node: input.app_token, size: loaded.size, file: loaded.buffer, }, }); ``` ### Technical Analysis The attachment feature legitimately needs access to a user-selected file, and local-file upload is documented in `README.md`. However, the implementation accepts any path readable by the OpenClaw process. `path.resolve()` only converts the su ...[truncated 2180 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/base/attachments.js:145
Finding

Server-Side Request Forgery and Resource Exhaustion via Unrestricted Attachment URL

Content
View full analysis
{ try { const u = new URL(input.url); const base = path.basename(u.pathname); return base && base !== '/' ? base : 'attachment.bin'; } catch { return 'attachment.bin'; } })(); const contentType = res.headers.get('content-type') || undefined; return { buffer, filename: input.filename || urlName, size: buffer.length, mimeType: input.mime_type || contentType || inferMimeType(input.filename || urlName), source: { url: input.url }, }; } ``` The size restriction is applied only after the entire response has been loaded into memory: ```js const loaded = await loadUploadSource(client, input); const filename = input.filename || loaded.filename || 'attachment.bin'; const kind = input.upload_kind || inferKind(filename, loaded.mimeType); if (loaded.size > 20 * 1024 * 1024) { throw baseError('FILE_TOO_LARGE', 'Attachment upload currently supports files up to 20MB via upload_all', { size: loaded.size, limit: 20 * 1024 * 1024, filename, }); } ``` ### Technical Analysis The `url` field accepts any non-empty string, and the fetch path does not enforce: - An HTTPS-only protocol policy - An approved hostname list - DNS and res ...[truncated 2513 chars]
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
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (25)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The README explicitly documents that the plugin can source Feishu credentials from active runtime context and from persisted OpenClaw config files, but it does not clearly warn users that invoking the skill may cause it to access preconfigured account credentials automatically. In an agent/plugin setting, implicit credential resolution expands the trust boundary and can lead to unintended access to Feishu data if a user or orchestrator assumes the tool only acts on explicitly supplied credentials.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The attachment examples describe uploading local files and cloning attachments from remote URLs, but they do not clearly warn that local file contents will be transmitted to Feishu and that remote URLs will be fetched over the network. In an agent-driven environment, that omission can cause unintentional exfiltration of sensitive local data or SSRF-style access to internal resources if users treat the examples as harmless data formatting operations.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
86% confidence
Finding

The skill exposes capabilities that can reach credentials/config and external Feishu APIs, but it does not declare an explicit tool scope such as allowed-tools or permissions. That weakens least-privilege boundaries and makes it harder for the host or reviewer to constrain what the skill may access, increasing the chance of unintended data exposure or unauthorized actions if the skill is invoked in a broader-capability runtime.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

md
3. Build minimal safe payload.
   - Fill only fields provided by user.
   - If user says location only (e.g., “Jiji at Penang”), map `Customer Name=Jiji`, `City/State=Penang` when present.
   - For select fields, only use valid options; otherwise ask or write to a text fallback field.

4. Create and verify.
   - Run `create_records` with one record first.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill advertises destructive actions like delete_records, delete_field, and delete_table, but it does not clearly require an explicit user confirmation step immediately before execution. In a data-management skill, accidental or prompt-induced deletion can cause irreversible data loss, and the broad Base/Table context makes that risk materially real.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill advertises broad Feishu Base capabilities including creating tables, creating or renaming fields, and creating, updating, or upserting records, but it does not warn that these operations can modify persistent user data. This omission can cause users or downstream agents to invoke destructive or unintended write actions without informed consent, increasing the risk of accidental data corruption or unauthorized changes.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill is described as limited to Feishu Base/Bitable management, but the implementation performs generic Drive enumeration to discover candidate bases. This broadens data access beyond the stated scope and can expose filenames, URLs, and parent tokens for unrelated Drive content, violating least-privilege and user expectations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

This file exposes table deletion via deleteTableApi and performs the remote delete immediately through the Feishu API. There is no confirmation prompt, user-facing disclosure, or inline warning indicating that the action is destructive and may be irreversible.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The deleteFieldApi function directly deletes a field through the API and returns success metadata, but the code contains no prompt, warning, or explanatory comment to disclose the destructive action. Removing a field can affect user data integrity and should be clearly surfaced to the user.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The deleteRecordsApi function supports both single and batch record deletion and sends delete requests immediately. The code does not include confirmation prompts, user-visible logging, or inline warnings about deleting user data.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The code resolves Wiki links by calling Feishu Wiki APIs, which is additional capability not disclosed in the skill description. This can access wiki node metadata and related objects outside the user's expected Base-only workflow, increasing the chance of unintended information exposure and surprise cross-product access.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The code accepts a user-supplied file_path, resolves it, and reads the referenced local file into memory for upload. In an agent skill context, this creates arbitrary local file read capability that exceeds pure Feishu Base management and can expose sensitive host files if an attacker can influence inputs.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code enables both local file reads and arbitrary URL fetches without any built-in warning, consent gate, or provenance signaling. In an agent skill, silent access to local and remote data sources increases the risk of unexpected collection of sensitive content and makes misuse harder for users or operators to detect.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The function fetches arbitrary input.url values and loads the response body for later upload, giving the skill general outbound network retrieval capability. In an agent environment this can be abused for SSRF-style access to internal services, retrieval of sensitive metadata, or exfiltration-by-proxy beyond the stated Feishu-specific scope.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

Data obtained from local disk or external URLs is uploaded to Feishu Drive without any in-code disclosure or confirmation step. This creates a quiet exfiltration path where sensitive local or fetched data can be transferred to a remote service under normal attachment-handling behavior.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The uploadAttachment and cloneAttachment functions directly invoke API helpers that transmit attachment data or references over the network. In this file there is no confirmation prompt, logging, print statement, or explanatory comment/docstring warning the user that file contents may be sent to a remote service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

This file supports delete_table, delete_field, and delete_records actions and directly dispatches them for execution, but there is no confirmation step or explicit user-facing warning near those destructive operations. Although the top-level description mentions optional delete operations, it does not clearly disclose the potentially irreversible impact of deleting tables, fields, or records.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The tool exposes upload_attachment and clone_attachment actions that can send file contents or URL-fetched content to Feishu, but this file contains no confirmation prompt and no user-facing disclosure around that data transfer. The only visible description is a broad tool summary that does not specifically warn about attachment uploads or remote content transmission.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
93% confidence
Finding

The dependency uses a caret range, so installs may resolve to newer releases than the author directly tested. That creates supply-chain risk and reduces reproducibility, especially for a plugin that handles Feishu Base/Bitable data and likely operates with existing user credentials.

Content

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

json
"bitable"
  ],
  "dependencies": {
    "@larksuiteoapi/node-sdk": "^1.59.0",
    "@sinclair/typebox": "^0.34.48",
    "openclaw": "^2026.3.22",
    "zod": "^4.3.6"

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
93% confidence
Finding

The dependency is not strictly pinned, allowing semver-compatible updates to be pulled in automatically. Even for a schema library, this can introduce unexpected behavior or a compromised upstream release into the plugin supply chain.

Content

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

json
],
  "dependencies": {
    "@larksuiteoapi/node-sdk": "^1.59.0",
    "@sinclair/typebox": "^0.34.48",
    "openclaw": "^2026.3.22",
    "zod": "^4.3.6"
  },

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

The core runtime dependency openclaw is unpinned, so deployments may pull different versions over time, including vulnerable or behavior-changing releases. Because this skill extends OpenClaw and interacts with external Feishu resources using existing credentials, compromise or regression in the framework has elevated security significance.

Content

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

json
"dependencies": {
    "@larksuiteoapi/node-sdk": "^1.59.0",
    "@sinclair/typebox": "^0.34.48",
    "openclaw": "^2026.3.22",
    "zod": "^4.3.6"
  },
  "openclaw": {

Unverifiable Dependency: openclaw has 16 known advisory(ies) (CVE-2026-53846 (OpenClaw: Workspace .env npm_execpath could influence bundled runtime dependency); CVE-2026-32064 (OpenClaw's andbox browser noVNC observer lacked VNC authentication); CVE-2026-32006 (OpenClaw has a BlueBubbles group allowlist mismatch via DM pairing-store fallbac) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
90% confidence
Finding

The manifest does not pin openclaw, and the package family has multiple known advisories, so the actual installed version may be affected without visibility from this file alone. In this skill's context, that uncertainty matters more because the plugin is an extension module with access to Feishu Base/Bitable operations and inherited credentials.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
92% confidence
Finding

Using a caret range for zod allows unreviewed updates within the major version to be installed. While common in development, this still creates avoidable supply-chain and reproducibility risk for a plugin that may process untrusted record data from Feishu.

Content

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

json
"@larksuiteoapi/node-sdk": "^1.59.0",
    "@sinclair/typebox": "^0.34.48",
    "openclaw": "^2026.3.22",
    "zod": "^4.3.6"
  },
  "openclaw": {
    "extensions": [

Unverifiable Dependency: zod has 1 known advisory(ies) (CVE-2023-4316 (Zod denial of service vulnerability)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
82% confidence
Finding

The zod dependency is not pinned, so it is not possible to confirm from the manifest whether the installed release includes known vulnerable code. Although the impact here is lower than a framework dependency, it still weakens assurance around input-validation behavior and exposure to denial-of-service issues.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

This code reads configuration from process.env.OPENCLAW_CONFIG_PATH and a user home directory file, which may contain credentials such as appSecret. There is no confirmation prompt, logging, or explanatory comment disclosing that sensitive configuration may be loaded from these locations.

Content

No source excerpt is available for this finding.