Back to skill

Security audit

EvoMap WorkBench v1.0.11 Mini

Security checks for vulnerabilities and agentic risk

Overview

This skill needs Review because it is advertised as an AI decision workbench but includes under-disclosed code that reads local Feishu credentials and can send messages to external services, including a hardcoded fallback recipient.

Install only in a sandbox or after source review. Do not run the installer or notification modules in an environment containing Feishu credentials unless you intend this skill to read those secrets and potentially send messages externally. Before normal use, remove automatic credential discovery, remove the hardcoded recipient fallback, require explicit notification configuration, and document all Feishu/Telegram/DingTalk/EvoMap data flows.

Vulnerability Patterns
  • 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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (29)

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill advertises significant capabilities such as environment access, local file read/write, and network use, but does not declare any permissions. This creates a trust and review gap: users and platforms cannot accurately understand or constrain what the skill may access, increasing the risk of unauthorized data exposure or unexpected side effects.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
This is a high-risk description-behavior mismatch: the skill presents itself as a decision/optimization tool, but the detected behavior includes local installation, registry/config modification, reading credential files, outbound messaging, remote API calls, state persistence, and uninstall cleanup. Hidden or undisclosed behavior reduces informed consent and can enable credential theft, unauthorized persistence, or covert data exfiltration under the guise of a benign productivity skill.

Context-Inappropriate Capability

Medium
Confidence
92% confidence
Finding
The installer reads credential-related data from feishu-pairing.json even though that access is not necessary to install files or register the skill. Unnecessary access to secrets increases the attack surface and exposes sensitive configuration to any present or future logging, misuse, or code changes.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
The code sends the provided asset and a bearer authorization token to a remote service during validation, which creates an external data-transfer and trust-boundary crossing risk. Even if intended for legitimate Hub verification, this can expose sensitive asset contents and credentials to a third party or unexpected environment without local-only validation guarantees.

Intent-Code Divergence

Medium
Confidence
94% confidence
Finding
The function is presented as a hash 'fix' for validation, but it mutates the asset by replacing asset_id with a server-provided value, effectively rewriting integrity metadata rather than verifying it. This is dangerous because downstream systems may trust the modified identifier as proof of authenticity even though the code is normalizing or overwriting identity instead of enforcing a mismatch failure.

Intent-Code Divergence

Medium
Confidence
95% confidence
Finding
`test_connection` is labeled as not triggering external actions, but it performs a real outbound request to Feishu's token endpoint via `get_access_token()`. This mismatch can mislead operators into executing network activity and transmitting secrets during what appears to be a harmless local check.

Context-Inappropriate Capability

Medium
Confidence
92% confidence
Finding
The module performs an outbound HTTP request to a configurable base_url without clear justification from the declared skill purpose, creating a covert network interaction surface. In an agent context, this can leak execution metadata, enable unexpected external communication, and potentially be abused for SSRF-style access if untrusted input can control the base_url.

Description-Behavior Mismatch

Medium
Confidence
83% confidence
Finding
The file implements outbound messaging to multiple external platforms, which does not align well with the stated 'AI decision workbench' purpose. This capability materially increases the skill's ability to exfiltrate data or act as an unannounced communications channel, especially when paired with the credential auto-discovery logic elsewhere in the file.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The code automatically scans fixed OpenClaw workspace and credential paths, loads app secrets, and selects target users from unrelated local configuration files. This is dangerous because it silently expands the trust boundary, accesses secrets the user did not explicitly provide to this skill, and enables outbound messaging using harvested credentials.

Context-Inappropriate Capability

Medium
Confidence
92% confidence
Finding
The notifier falls back to reading FEISHU_APP_ID and FEISHU_APP_SECRET from environment variables even though secret access is not clearly disclosed by the skill description. In agent environments, environment variables often contain sensitive cross-tool credentials, so silent consumption can unintentionally grant this module the ability to authenticate and send data externally.

Description-Behavior Mismatch

Medium
Confidence
84% confidence
Finding
The file’s behavior materially exceeds the apparent scope implied by the skill metadata: it implements multi-platform notification delivery plus credential/config discovery, including loading local OpenClaw files. Scope mismatch is dangerous in agent skills because users may grant trust based on the advertised purpose while the code performs additional sensitive operations such as reading credentials and transmitting data externally.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The code automatically searches multiple unrelated local OpenClaw paths and loads secrets and identifiers such as appSecret, target IDs, and allowFrom values without explicit user action. This creates unauthorized credential access and expands the blast radius: a notification feature can silently appropriate credentials from other tools/accounts and then use them for external API calls.

Missing User Warnings

Medium
Confidence
80% confidence
Finding
The script writes configuration files and overwrites target directories without an explicit confirmation step, dry-run mode, or backup. This can cause unintended destructive changes, especially because copy_skills removes existing directories before copying replacement content.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The installer accesses credential-related configuration without clear upfront disclosure to the user that secret-bearing data will be read. Even though it masks output partially, merely reading secret files unnecessarily violates least privilege and can undermine user trust and platform expectations.

Missing User Warnings

Medium
Confidence
87% confidence
Finding
Decision records include full context, explanations, alternatives, and related knowledge identifiers; evolution reports aggregate operational history and metrics. Persisting such structures to disk without consent, minimization, or redaction can expose sensitive business logic, error details, or user-derived context to other local users, backups, or logs, especially in shared or multi-tenant environments.

Missing User Warnings

Low
Confidence
81% confidence
Finding
The save routine creates directories and writes JSON files to a supplied output path without warning, increasing the chance of unintended local file creation or overwrite. In agent or automation contexts, silent filesystem writes can surprise users, leak sensitive state into predictable locations, or clobber existing artifacts if the path is reused.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
A bearer token is transmitted in an outbound request with no in-code warning, consent flow, or safeguards around how the credential is sourced and used. In agent or plugin contexts, silent credential transmission can surprise operators, expand credential exposure, and make misuse harder to detect.

Missing User Warnings

Medium
Confidence
87% confidence
Finding
`send_message` transmits caller-supplied message content and recipient identifiers to an external service without any confirmation, policy check, or safety gate at the point of use. In an agent skill context, this can enable unintended data exfiltration, spam, or disclosure of sensitive content if upstream inputs are unsafe or manipulated.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
Sensitive credentials are loaded from local files and environment variables without any prominent user-facing warning or consent mechanism. That makes secret access non-transparent and increases the risk that users or operators will unknowingly grant the skill access to tokens and app secrets that can be used for external communications.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The send path transmits caller-provided message content to external services without an explicit warning that the content leaves the local system. In an agent skill context, messages may contain user data, task outputs, or secrets, so silent outbound transmission creates a meaningful data leakage risk.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The code reads credentials from local files and environment variables without clear user-facing disclosure, consent, or runtime notice. In an agent skill context, silent secret ingestion is risky because users may not expect the skill to access FEISHU_APP_SECRET or unrelated OpenClaw credential stores, especially when the same file also performs outbound network requests.

External Transmission

Medium
Category
Data Exfiltration
Content
}
        
        try:
            resp = requests.post(url, json=payload, timeout=10)
            data = resp.json()
            
            if data.get('code') == 0:
Confidence
88% confidence
Finding
This request sends Feishu authentication material to an external API endpoint to obtain an access token. While network access for auth can be legitimate, in this file it is part of a broader pattern of silent credential loading and external messaging, making the transmission security-relevant because harvested secrets are being used off-host.

External Transmission

Medium
Category
Data Exfiltration
Content
params = {"receive_id_type": "user_id"}
        
        try:
            resp = requests.post(url, headers=headers, json=payload, params=params, timeout=10)
            data = resp.json()
            
            if data.get('code') == 0:
Confidence
90% confidence
Finding
This code posts message content to Feishu's messaging API, transmitting data externally. In isolation this is expected notifier behavior, but in the skill context it is risky because the module can choose recipients from auto-discovered local config and send content without prominent disclosure to the user.

External Transmission

Medium
Category
Data Exfiltration
Content
params = {"receive_id_type": "user_id"}
        
        try:
            resp = requests.post(url, headers=headers, json=payload, params=params, timeout=10)
            data = resp.json()
            
            if data.get('code') == 0:
Confidence
89% confidence
Finding
This request sends rich-text content to an external Feishu endpoint. The danger is the same as other outbound transmissions: arbitrary content can leave the system, and the surrounding code makes credential and recipient sourcing non-transparent.

External Transmission

Medium
Category
Data Exfiltration
Content
}
        
        try:
            resp = requests.post(url, json=payload, timeout=10)
            data = resp.json()
            
            if data.get('errcode') == 0:
Confidence
82% confidence
Finding
This posts data to a DingTalk webhook, which is an external transmission of message content. Although a notifier is expected to send messages, webhook-based delivery can be abused to exfiltrate sensitive outputs if the skill is invoked on unreviewed content or with attacker-controlled configuration.

Static analysis

No suspicious patterns detected.