Back to skill

Security audit

WeChat Mail Bridge (Windows/OpenClaw)

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a real WeChat-to-mail bridge, but its defaults expose sensitive chat and mail operations more broadly than users may expect.

Install only after changing the default shared secrets, binding the plugin to localhost or a protected private interface, using HTTPS or HMAC for any non-local traffic, disabling remote VLM or approving its exact endpoint, and deciding whether raw WeChat text should be retained. Treat the bundled dependency versions as needing an update before production use.

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 (4)

T09 · Insecure Skill Coding Practices

Error
Location
bundle/windows-sidecar/src/oc_wx_bridge/adapters/uiautomation_adapter.py:296
Finding

WeChat Screenshots Can Be Transmitted to an Arbitrary VLM Endpoint

Content
View full analysis
str: max_side = 1200 image_copy = image.copy() width = getattr(image_copy, "width", 0) height = getattr(image_copy, "height", 0) if width > max_side or height > max_side: image_copy.thumbnail((max_side, max_side)) buffer = io.BytesIO() image_copy.save(buffer, format="PNG") return base64.b64encode(buffer.getvalue()).decode("ascii") def _extract_with_vlm(self, image: object) -> str | None: base_url = self.visual_config.vlm_base_url api_key = (self.visual_config.vlm_api_key or "").strip() if "api.openai.com" in base_url and not api_key: return None try: image_b64 = self._image_to_base64(image) payload = { "model": self.visual_config.vlm_model, "temperature": 0, "max_tokens": 100, "messages": [ { "role": "system", "content": ( "Extract only the latest user-authored WeChat message text from the screenshot. " "Prefer the newest actionable command such as /mail, /watch, 查邮箱, or a visible email query. " "Ignore timestamps, chat chrome, previous automation replies, and decorative labels. " "If unreadable, return an empty string." ), }, { "role": "user", "content": [ { "type": "text", "text": ( "Return only the exact raw latest message text, no JSON. " ...[truncated 2895 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
bundle/plugin/src/config/schema.ts:123
Finding

Network-Wide Default Listener Uses a Predictable Development Secret

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
bundle/windows-sidecar/src/oc_wx_bridge/diagnostics_server.py:14
Finding

Unauthenticated Diagnostics Endpoint Exposes WeChat Group Metadata

Content
View full analysis
None: # noqa: N802 if self.path == "/health": self._handle_health() return if self.path == "/groups": self._handle_groups() return self.send_response(404) self.end_headers() def _handle_health(self) -> None: try: adapter_health = self.adapter.health().model_dump() bridge_health = self.bridge_client.health() payload = { "ok": True, "adapter": adapter_health, "bridge": bridge_health, } self._send_json(200, payload) except Exception as error: self._send_json(500, {"ok": False, "error": str(error)}) def _handle_groups(self) -> None: try: groups = self.adapter.list_groups() payload = { "ok": True, "count": len(groups), "groups": [{"chatId": g.chat_id, "chatName": g.chat_name} for g in groups], } self._send_json(200, payload) except Exception as error: self._send_json(500, {"ok": False, "error": str(error)}) ``` The listener is created from the configurable host and port: ```python server = ThreadingHTTPServer((config.host, config.port), _DiagnosticsHandler) ``` ### Technical Analysis Neither `/health` nor `/groups` verifies an authentication token or caller identity. The `/groups` endpoint invokes the desktop adapter and returns discovered chat identifiers and names. The default diagnostic host is `127.0.0.1`, which subst ...[truncated 1357 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
bundle/plugin/src/config/schema.ts:167
Finding

Raw WeChat Message Text Is Persisted by Default

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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (68)

Known Vulnerable Dependency: vitest==3.2.4 — 2 advisory(ies): CVE-2026-47429 (When Vitest UI server is listening, arbitrary file can be read and executed); CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock)

Critical
Category
Supply Chain
Confidence
90% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: vitest==3.2.4 — 2 advisory(ies): CVE-2026-47429 (When Vitest UI server is listening, arbitrary file can be read and executed); CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock)

Critical
Category
Supply Chain
Confidence
90% confidence
Finding

Vitest is a development dependency, but the cited advisories include arbitrary file read and possible execution when the Vitest UI server is exposed. This is less dangerous than a runtime production dependency, yet it can still meaningfully impact developer workstations or CI agents if test tooling is run in a reachable environment.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description is about operational support for a Windows WeChat automation and mail bridge bundle: installation, configuration, execution, troubleshooting, File Transfer Assistant workflows, and sidecar/plugin setup. The supplied code chunk instead is a narrow TypeScript mock adapter for mail functionality. It simulates adapter health, returns fabricated mail lookup/watch results, and converts generic payloads into a normalized webhook event. This is a materially different primary purpose from the declared operational/admin workflow description, so the description does not accurately represent this code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

This code chunk is purely a type/interface definition for mail adapter behavior. It specifies contracts for mail-related querying and webhook normalization, but it does not implement or indicate the broader declared functionality around Windows WeChat automation, bundle installation, configuration, sidecar setup, or operational troubleshooting. The mail-related aspect is only a small supporting component and does not accurately represent the declared primary purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The supplied code chunk does not perform installation, configuration, running, troubleshooting, sidecar setup, or WeChat desktop automation tasks. Instead, it provides a generic utility for finding and validating email addresses in text. While email handling could hypothetically support a mail bridge system, this specific behavior is not represented in the declared description and is materially different from the stated operational/admin purpose of the skill bundle.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The code is a focused parser for mail-related trigger messages. It examines text content, matches configured prefixes, distinguishes watch-style commands from normal lookup commands, extracts email addresses, and returns structured decisions such as ignore, clarify, findLatest, or waitForNew with timeout handling. The declared description instead emphasizes installing, configuring, running, and troubleshooting a Windows WeChat automation and mail bridge bundle, plus sidecar/plugin operational setup. That broad operational description does not accurately represent this code chunk’s concrete behavior as a trigger parser for email commands. While mail bridge functionality is loosely related, the actual code exposes a specific command/trigger interpretation capability that is not declared, so this is a description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description emphasizes operational tasks around installing, configuring, running, and troubleshooting a Windows WeChat desktop automation and mail bridge bundle. In contrast, this code chunk is specifically a security/authentication module for validating incoming requests using bearer tokens or HMAC signatures, with timestamp and nonce-based anti-replay protections. While such code could support a bridge component, its concrete behavior is a backend auth mechanism rather than the described automation/setup/troubleshooting functionality. This is a materially different capability and should be flagged as a description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description promises substantial operational functionality around Windows WeChat automation and mail bridge setup. However, the supplied code chunk contains only package metadata: an all declaration and a version constant. This is not merely incomplete implementation detail for the stated features within the snippet; it shows no behavior corresponding to the declared purpose. Therefore, the code chunk does not accurately represent the described functionality.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: fast-uri==3.1.0 — 7 advisory(ies): CVE-2026-13676 (fast-uri vulnerable to host confusion via failed IDN canonicalization); CVE-2026-18446 (fast-uri vulnerable to host confusion via backslash authority introducer); CVE-2026-75975 (fast-uri vulnerable to server-side request forgery via malformed IPv6 normalizat) +4 more

High
Category
Supply Chain
Confidence
88% confidence
Finding

fast-uri is a runtime dependency used through Fastify's request parsing and URL handling stack, so host confusion or malformed URI parsing flaws can affect a live HTTP service if attacker-controlled requests are accepted. In a mail bridge/plugin context, incorrect host or URI interpretation can enable SSRF, origin confusion, or security control bypasses around inbound API handling.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: fastify==5.8.2 — 3 advisory(ies): CVE-2025-32442 (Fastify has a Body Schema Validation Bypass via Leading Space in Content-Type He); CVE-2026-3635 (fastify: request.protocol and request.host Spoofable via X-Forwarded-Proto/Host ); CVE-2026-18504 (fastify vulnerable to schema validation bypass via root primitive coercion misma)

High
Category
Supply Chain
Confidence
94% confidence
Finding

fastify is a direct runtime dependency and likely underpins the plugin's local or network API surface. The cited issues include schema validation bypass and spoofable host/protocol handling, which can undermine authentication, request trust boundaries, and input validation in a bridge component that may process mail or message automation commands.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: find-my-way==9.5.0 — 1 advisory(ies): CVE-2026-47219 (find-my-way: DDoS with HTTP2)

High
Category
Supply Chain
Confidence
86% confidence
Finding

find-my-way is Fastify's router and is a runtime dependency, so a known DDoS condition in HTTP/2 routing can affect availability if the bridge exposes an HTTP/2 listener. While package-lock alone does not prove HTTP/2 is enabled, this is still a credible runtime risk in a server-oriented plugin.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: nanoid==3.3.11 — 3 advisory(ies): CVE-2026-67214 (nanoid: non-secure generators can loop indefinitely with negative size); CVE-2026-67213 (nanoid: custom generators can loop indefinitely when size is zero); CVE-2026-73086 (nanoid: Integer Overflow or Wraparound)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: picomatch==4.0.3 — 2 advisory(ies): CVE-2026-33672 (Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Mat); CVE-2026-33671 (Picomatch has a ReDoS vulnerability via extglob quantifiers)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: postcss==8.5.8 — 4 advisory(ies): CVE-2026-45623 (PostCSS: Arbitrary file read and information disclosure via attacker-controlled ); CVE-2026-69153 (PostCSS: incomplete fix of GHSA-6g55-p6wh-862q — attacker-controlled sourceMappi); CVE-2026-41305 (PostCSS has XSS via Unescaped </style> in its CSS Stringify Output) +1 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: vite==7.3.1 — 5 advisory(ies): CVE-2026-39365 (Vite Vulnerable to Path Traversal in Optimized Deps `.map` Handling); CVE-2026-53571 (vite: `server.fs.deny` bypass on Windows alternate paths); CVE-2026-39363 (Vite Vulnerable to Arbitrary File Read via Vite Dev Server WebSocket) +2 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: fastify==5.8.2 — 3 advisory(ies): CVE-2025-32442 (Fastify has a Body Schema Validation Bypass via Leading Space in Content-Type He); CVE-2026-3635 (fastify: request.protocol and request.host Spoofable via X-Forwarded-Proto/Host ); CVE-2026-18504 (fastify vulnerable to schema validation bypass via root primitive coercion misma)

High
Category
Supply Chain
Confidence
91% confidence
Finding

The project allows a Fastify version family that static analysis associates with multiple security advisories, including request metadata spoofing and schema validation bypasses. In a mail bridge/automation plugin that likely exposes HTTP endpoints and processes external input, these flaws could let attackers bypass validation, misroute trust decisions, or manipulate request context.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The visual fallback feature can escalate from local OCR to a remote VLM endpoint, which may send sampled chat-area content to an external AI service. Because the README omits a clear warning about external transmission of potentially sensitive WeChat messages, operators could enable the feature without understanding the privacy and compliance implications.

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
90% confidence
Finding

The manifest describes bridging WeChat content to a mail system and the schema defaults privacy.storeRawWechatText to true, yet there is no explicit user-facing warning or consent notice in the manifest. This creates a meaningful privacy and compliance risk because users may not realize message contents are being stored or relayed across systems.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This manifest defines activation prefixes such as "监控" alongside more specific commands, but the term is broad and could overlap with ordinary conversation. The file does not provide negative examples or contextual limits here to clarify when the skill should activate versus ignore a message.

Content

No source excerpt is available for this finding.

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
80% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

Scanner excerpt · bundle/plugin/openclaw.plugin.json (reported line 81)May include surrounding context.

json
"skills": [
    {
      "id": "wechat-mail-bridge",
      "path": "skills/wechat-mail-bridge/SKILL.md"
    }
  ]
}

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · bundle/plugin/scripts/smoke_event.sh (reported line 15)May include surrounding context.

sh
EVENT_ID="evt_smoke_$(date +%s)"
MSG_ID="msg_smoke_$(date +%s)"

curl -sS -X POST "${BASE_URL}/api/v1/sidecar/events" \
  -H "Authorization: Bearer ${SECRET}" \
  -H "x-bridge-ts: ${TS}" \
  -H "content-type: application/json" \

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · bundle/plugin/scripts/smoke_push_roundtrip.sh (reported line 20)May include surrounding context.

sh
local nonce
  nonce="nonce_$(date +%s%N)"

  curl -sS -X POST "${BASE_URL}${path}" \
    -H "Authorization: Bearer ${SECRET}" \
    -H "x-bridge-ts: ${ts}" \
    -H "x-bridge-nonce: ${nonce}" \

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

This curl call performs external transmission of bearer authentication headers and JSON payloads containing chat IDs, names, sender metadata, and message text. In this skill context, external transmission is expected for a bridge smoke test, but it still becomes a real security issue because the default transport is unsecured HTTP and the script encourages use of a reusable secret in requests.

Content

Scanner excerpt · bundle/plugin/scripts/smoke_roundtrip.sh (reported line 19)May include surrounding context.

sh
local nonce
  nonce="nonce_$(date +%s%N)"

  curl -sS -X POST "${BASE_URL}${path}" \
    -H "Authorization: Bearer ${SECRET}" \
    -H "x-bridge-ts: ${ts}" \
    -H "x-bridge-nonce: ${nonce}" \

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The script transmits a bearer secret and chat/message metadata using a default BASE_URL of plain HTTP, which provides no transport confidentiality or integrity if the endpoint is changed away from localhost or traffic is intercepted on the host. Because this is an operations smoke-test script for a mail/WeChat bridge, the transmitted data includes authentication material and potentially sensitive message content, making accidental insecure deployment more dangerous.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.exposed_secret_literal, suspicious.install_untrusted_source

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
bundle/windows-sidecar/src/oc_wx_bridge/webhook_proxy.py:29

Install source points to URL shortener or raw IP.

Warn
Code
suspicious.install_untrusted_source
Location
config/windows-sidecar.example.toml:7