Back to skill

Security audit

skill-1

Security checks for vulnerabilities and agentic risk

Overview

This skill does what it says, but it can install or remove server apps using a saved 1Panel API key without enough safeguards, and its examples allow insecure HTTP.

Review before installing. Use only an HTTPS 1Panel endpoint, provide a narrowly scoped API key, and rotate any key that may have been used over HTTP. Treat uninstall and batch uninstall prompts carefully because the skill can remove server applications without a built-in confirmation step.

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

Error
Location
openclaw.plugin.json:11
Finding

Plaintext HTTP Is Permitted and Recommended for Transmission of a Privileged API Key

Content
View full analysis

Vulnerability Details

File Location: openclaw.plugin.json:11-19; insecure usage examples in README.md:21-25,37-40 and SKILL.md:23-27,33-39,72-76,125-126
Vulnerability Type: Plaintext transmission of sensitive credentials
Risk Level: High

Vulnerable Code and Configuration

The plugin configuration accepts any nonempty string as the server URL and does not require the HTTPS scheme:

json
"baseUrl": {
  "type": "string",
  "minLength": 1,
  "description": "1Panel 服务器地址"
},
"apiKey": {
  "type": "string",
  "minLength": 1,
  "description": "API 密钥"
}

The README recommends configuring the privileged API endpoint with plaintext HTTP:

text
5. 配置:
   ```
   1Panel 地址: http://your-server:port
   1Panel API 密钥: your-api-key
   ```

It also provides a plaintext HTTP environment-variable example:

bash
APPSTORE_BASE_URL=http://your-server:port \
APPSTORE_API_KEY=your-api-key \
node dist/cli.js list

The skill instructions similarly recommend an HTTP endpoint together with the API key:

text
用户: 设置 1Panel 配置
       地址:http://your-server:port
       密钥:your-api-key-here

Technical Analysis

The baseUrl schema only enforces a minimum string length. It does not validate the value as a URI or restrict its scheme to https:. The documentation consistently demonstrates http:// while pairing the endpoint with a privileged 1Panel API key.

If the implementation sends authenticated requests to the configured HTTP endpoint, neither the credentials nor request contents receive transport-layer confidentiality or integrity protection. An attacker able to observe or modify traffic can capture the API key, inspect administrative requests, alter server responses, or tamper with application-management operations.

The executable files referenced by the package, including dist/plugin.js and dist/cli.js, were absent from the supplied project. Th ...[truncated 1506 chars]

Remediation
View remediation

Remediation Suggestions

  1. Require an absolute HTTPS URL in runtime validation and reject all other schemes:
    javascript
    const endpoint = new URL(config.baseUrl);
    if (endpoint.protocol !== "https:") {
      throw new Error("The 1Panel endpoint must use HTTPS.");
    }
    
  2. Add an appropriate URI format constraint to the configuration schema and, where supported, an HTTPS-specific pattern:
    json
    {
      "type": "string",
      "format": "uri",
      "pattern": "^https://"
    }
    
  3. Replace every http://your-server:port example in README.md and SKILL.md with an HTTPS endpoint.
  4. Do not disable TLS certificate validation. Document deployment with a certificate issued by a trusted internal or public certificate authority.
  5. If plaintext HTTP is necessary for local development, restrict it to loopback addresses behind an explicit opt-in development setting. Never permit it for remote hosts.
  6. Use a narrowly scoped API key limited to the operations required by the skill, store it through the platform's protected secret mechanism, and rotate any key that may previously have traversed an HTTP connection.
  7. Add automated tests confirming that HTTP, non-URL strings, user-information components, and unsupported schemes are rejected before any credential-bearing request is sent.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (33)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

声明描述的是一个具备完整应用商店管理能力的 Skill,但给定代码片段只是一个空模块文件(types.js),没有任何可执行逻辑、API 调用、资源访问或触发器实现。因此,代码实际行为与声明用途严重不符。尽管这可能只是类型定义文件的一部分,但基于当前提供的代码片段,无法观察到任何与声明功能一致的实现,应判定为不匹配。

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
APPSTORE_BASE_URL=http://... APPSTORE_API_KEY=... node dist/cli.js search redis

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
APPSTORE_BASE_URL=http://... APPSTORE_API_KEY=... node dist/cli.js search redis

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
APPSTORE_BASE_URL=http://... APPSTORE_API_KEY=... node dist/cli.js search redis

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
APPSTORE_BASE_URL=http://... APPSTORE_API_KEY=... node dist/cli.js search redis

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
APPSTORE_BASE_URL=http://... APPSTORE_API_KEY=... node dist/cli.js search redis

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
APPSTORE_BASE_URL=http://... APPSTORE_API_KEY=... node dist/cli.js search redis

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

batchUninstallApps automates repeated destructive removals in a loop with no confirmation checkpoint, limit, or rollback mechanism. In a skill specifically designed for app-store management, this materially increases risk because one bad instruction or compromised upstream decision can silently remove many applications in sequence, amplifying the blast radius.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

batchUninstallByName resolves user-provided names to installed app IDs and then removes them in bulk without confirming matches or presenting the final deletion set to the user. This is especially risky because name-based targeting is more error-prone than ID-based targeting, so ambiguous, stale, or manipulated names can lead to unintended mass uninstalls in an app-management skill.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The uninstall tool removes installed applications without an explicit destructive-action warning or confirmation gate. This is more dangerous in this skill's context because it directly administers a 1Panel environment, so mistaken or induced invocation can cause service disruption or data loss.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The batch uninstall-by-ID operation enables removal of multiple applications at once with no explicit destructive-action confirmation. Because it targets administrative app instances in bulk, a single mistaken or manipulated invocation can cause widespread outage and potentially irreversible loss of dependent services or data.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The batch uninstall-by-name tool makes bulk deletion especially easy by allowing friendly names rather than IDs, yet provides no warning or confirmation. This convenience increases the chance of accidental or manipulated mass removal, particularly when names may be ambiguous or loosely matched in supporting logic.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This markdown file documents safety-relevant operations: installing and uninstalling apps. The description presents them as one-click actions but does not warn that these actions may modify the system state or remove application data, which is required user-facing disclosure for markdown files.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

The README instructs users to configure a 1Panel address using plain HTTP and provide an API key, without warning to protect the credential or use TLS. This can lead to credential exposure in transit or unsafe deployment practices, especially because admin-style app management actions are likely sensitive.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill explicitly instructs users to provide an API key and states that it will be persistently saved to openclaw.json, but it does not warn about the sensitivity of the secret, storage protections, or access-control expectations. Persistently storing infrastructure credentials without clear disclosure or safeguards increases the risk of credential theft, lateral movement, and unauthorized administrative actions against the 1Panel server.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill describes install and uninstall flows that can make persistent system changes, yet it does not clearly warn users about the operational impact or require explicit confirmation before destructive actions. In the context of application lifecycle management on a server, this can lead to unintended service deployment, downtime, data loss, or removal of critical applications through ambiguous or accidental prompts.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This code presents all user-facing messages, help text, and examples exclusively in Chinese, which enforces a specific language for interaction. The file does not provide any user opt-in, locale selection, or documented justification for a Chinese-only interface.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The manifest says this skill is for searching, installing, uninstalling, or viewing installed apps. In this file, the client pulls a base URL and API key from environment variables to authenticate against an external service, which is a broader credential-access capability not stated in the skill purpose. While network access is expected for an app store client, reading deployment secrets from the environment is not explicitly justified by the declared user-facing scope.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This code performs outbound network requests and includes authentication material derived from an API key in request headers. Within this file there is no confirmation prompt, user-facing log/print, or explanatory comment/docstring warning that data will be transmitted to a remote service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The uninstallApp function directly performs a destructive delete operation as soon as it is called, with no built-in confirmation, dry-run, or safeguard to ensure the user explicitly intended removal. In an agent skill context, this is dangerous because a mistaken prompt interpretation, tool misuse, or prompt injection elsewhere in the system could cause irreversible application removal without any last-mile user approval.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The code reads API endpoint and API key values from environment variables, giving the skill access to ambient credentials outside direct user input. In a plugin/agent ecosystem, this increases privilege beyond the stated app-store management task and can cause the skill to operate against sensitive infrastructure using hidden secrets.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill exposes a configuration-management tool that accepts and persists a server URL and API key, expanding its capability from app-store operations into credential storage. In an agent setting, persistence of sensitive credentials creates ongoing risk if the skill is invoked unexpectedly, reused across conversations, or accessed by other components without clear user understanding or consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The configuration tool validates and effectively stores API credentials but does not clearly warn users about persistence, reuse, or the sensitivity of the API key. This can lead users to provide production credentials without understanding retention or exposure risks, especially in conversational workflows where security expectations are weaker.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The install operation performs a system-changing action immediately, without a confirmation step or prominent warning about its effects. In an agent context, ambiguous user phrasing, prompt injection, or mistaken tool selection could cause unintended software installation on managed infrastructure.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.