Back to skill

Security audit

Wechat Openclaw Skill

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent WeChat bridge for OpenClaw, but it uses an unpinned remote installer and can expose OpenClaw to WeChat messages and files without enough privacy or control guidance.

Review carefully before installing. Use this only if you trust the WeChat/OpenClaw plugin publisher and are comfortable routing WeChat messages and attachments into OpenClaw. Prefer a pinned, reviewed package version instead of `@latest`, do not run the installer as administrator/root, disable `autoReply` and `autoAccept` unless you have a trusted sender allowlist, and avoid sending secrets, regulated data, or confidential files through the channel.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T08 · Insecure Dependencies

Warning
Location
scripts/install.js:205
Finding

Execution of an Unpinned Remote npm Package

Content
View full analysis

Vulnerability Details

File Location: scripts/install.js:205-209
Additional References: SKILL.md:46, docs/WEIXIN-GUIDE.md:37, docs/WEIXIN-GUIDE.md:79
Vulnerability Type: Unpinned third-party dependency execution
Risk Level: Medium

Vulnerable Code

javascript
// Attempt the official installation command
const installCommands = [
  'npx -y @tencent-weixin/openclaw-weixin-cli@latest install',
  'openclaw plugins install "@tencent-weixin/openclaw-weixin"'
];

The same unsafe command is also presented to users in the primary Skill instructions and integration guide:

bash
npx -y @tencent-weixin/openclaw-weixin-cli@latest install

Technical Analysis

The installer invokes npx with both -y and the mutable @latest version tag. This causes npm to download and execute whichever package version is identified as latest at execution time, without interactive package-installation confirmation.

Consequently, the effective executable payload can change after this Skill has been reviewed. The project does not pin an exact version, provide a lockfile for the executed CLI, validate a package checksum or signature, or verify npm provenance before execution. Package installation and lifecycle code runs with the privileges of the user launching the installer.

The package name appears intentional rather than an obvious typographical error, and the audit found no evidence that the currently referenced package is malicious. The vulnerability is the absence of controls against a compromised, transferred, or unexpectedly modified package release.

Attack Path

  1. An attacker compromises the npm publisher account, release pipeline, package registry entry, or another component capable of controlling the package version associated with @latest.
  2. The attacker publishes a malicious release or causes the malicious version to become the latest release.
  3. A user follows the document ...[truncated 1203 chars]
Remediation
View remediation

Remediation Suggestions

  1. Replace @latest with an exact, reviewed version:

    javascript
    const installCommands = [
      'npx --yes @tencent-weixin/openclaw-weixin-cli@1.2.3 install'
    ];
    
  2. Do not treat version pinning alone as sufficient. Verify the package artifact against a documented integrity hash, trusted signature, or npm provenance before execution.

  3. Prefer declaring the CLI in a controlled project manifest and committing a lockfile. Install with a reproducible command such as npm ci, then invoke the locked local binary.

  4. Review and pin transitive dependencies. Where feasible, vendor the reviewed installer artifact or distribute it through a trusted, integrity-verified release process.

  5. Remove automatic confirmation with -y for security-sensitive installation flows, or present the exact version, source, requested actions, and integrity information before obtaining explicit user approval.

  6. Apply the same pinned command consistently in SKILL.md, docs/WEIXIN-GUIDE.md, fallback instructions, and installer output so users are not directed back to the mutable @latest release.

  7. Run the package with the least privileges required. Explicitly warn users not to launch the installer as root or from an elevated administrator shell.

  8. Fail closed if artifact verification fails instead of falling back automatically to another unverified remote installation mechanism.

Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (19)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/install.js

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/install.js

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/check.js

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill advertises direct WeChat chat, image, and file features but does not clearly warn that user prompts, attachments, metadata, and conversation contents may be transmitted to external services and third-party infrastructure. This omission can mislead users into sharing sensitive data under the assumption the integration is local or privacy-neutral, increasing the risk of unintended disclosure.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

The skill instructs users to run an unpinned latest-version package via npx, which causes execution of whatever code is currently published under that package name at install time. In a chat-integration skill that bridges WeChat and OpenClaw, this creates a meaningful supply-chain risk: a compromised publisher account, malicious update, or typo-squatted replacement could execute arbitrary code on the user's machine during installation.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The guide instructs users to run an unpinned npx ...@latest install command, which fetches and executes the newest package version at install time. This creates a software supply-chain risk: if the package is compromised, typo-squatted, or a breaking/malicious update is published, users may execute attacker-controlled code immediately on their machines.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

This repeated install step again uses npx ...@latest, causing dynamic retrieval and execution of remote code without version pinning. Repetition in the guide increases exposure because users encountering either section are encouraged to run the unsafe pattern, normalizing insecure installation behavior.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The guide advertises sending text, images, files, and voice data through the WeChat/OpenClaw integration, but does not clearly warn that this content may be transmitted to and processed by third-party services, logged, retained, or exposed through plugin behavior. Users may unknowingly share sensitive personal, business, or regulated data through the channel under the assumption it behaves like a local/private assistant.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The sample configuration enables autoReply and channel autoAccept behavior without warning that unsolicited messages may be processed automatically, potentially triggering actions, exposing data, or engaging with untrusted senders. In a messaging-integrated agent, automatic acceptance/reply expands the attack surface because external users can interact with the system without deliberate operator review.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The file’s description and all user-facing console output are in Chinese, which imposes a specific language on users without any opt-in or fallback. Under the policy rule, forcing a locale/language without user choice is a natural-language policy violation unless clearly justified as region-specific.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The script recommends running npx -y @tencent-weixin/openclaw-weixin-cli@latest install, which fetches and executes the latest published package at runtime without pinning a specific version. If the package is compromised, typo-squatted, or a malicious update is published, users may execute attacker-controlled code during installation; the skill context makes this more dangerous because it directly instructs users to run the command as a next step.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Nearly all natural-language strings in the script are fixed to Chinese, including prompts, instructions, and status messages. This imposes a language choice on all users without opt-in or documented locale justification, which matches the language-policy violation criteria.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code runs package installation and configuration commands via shell execution, including plugin installation and persistent config changes. Although it asks whether to continue installation, the user-facing instructions before consent do not explicitly warn that the script will execute system commands, install software, and alter OpenClaw configuration.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The script installs and executes an external package via npx ...@latest, which fetches whatever version is current at execution time. This creates a supply-chain risk: a compromised publisher account, malicious new release, or unexpected breaking change would cause arbitrary code to run during installation with the user's privileges.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The manual fallback instructions again direct the user to run npx ...@latest, which has the same unpinned remote-code-execution risk as the automated path. Even though this instance is printed text rather than directly executed by the script, it still encourages unsafe installation behavior and could lead users to run attacker-controlled package updates.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The entire skill documentation is written in Chinese and is targeted at WeChat users, but it does not indicate that the skill is region-specific or provide any language-choice/opt-in guidance. Under the stated policy, forcing a specific language without user opt-in can be a natural-language policy issue.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

This JSON manifest-style report contains results and recommendations but provides no indication of what exact condition or command should cause a related skill or check to run. Under the vague-trigger rule for manifest files, the absence of explicit trigger scope or exclusion conditions can make invocation boundaries unclear.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

All user-facing strings in this file are in Chinese, including status messages and recommendations, with no indication that the user can choose another language or that the locale restriction is intentional. This can violate language/locale policy when a skill or artifact is presented to users without opt-in.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The code creates a reports directory and writes a JSON installation report under the current working directory. While the write is logged after it happens, there is no advance disclosure in the instructions or confirmation step that the installer will create local files.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/check.js:248

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/install.js:400