Back to skill

Security audit

Board WebMCP

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its stated board-editing purpose, but it needs Review because it can implicitly update a shared board and installs a persistent launcher that runs unpinned external npm tooling.

Install only if you are comfortable with an agent using browser automation to read and update a shared board. Prefer a local or sandbox board, review the generated `board-webmcp-cli` link before using it, avoid custom `WEBMCP_LOCAL_MCP_COMMAND` values unless you trust the command completely, and pin or preinstall the npm tooling in a controlled environment.

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/ensure-links.sh:26
Finding

Unpinned npm Packages Are Downloaded and Executed

Content
View full analysis

Vulnerability Details

File Location: scripts/ensure-links.sh:26, 61-71
Vulnerability Type: Unpinned third-party dependencies and runtime package execution
Risk Level: Medium

Complete Code Snippet

bash
local_mcp_command="${WEBMCP_LOCAL_MCP_COMMAND:-npx -y @webmcp-bridge/local-mcp}"
daemon_idle_ttl="${WEBMCP_DAEMON_IDLE_TTL:-}"

# ...

read -r -a launcher_parts <<< "$local_mcp_command"
link_args=("${launcher_parts[@]}" --url "$url" --headless --no-auto-login-fallback --user-data-dir "$profile")

link_value="$(shell_join "${link_args[@]}")"

link_install_args=(board-webmcp-cli "$link_value" --daemon-exclusive "$profile")
if [[ -n "$daemon_idle_ttl" ]]; then
  link_install_args+=(--daemon-idle-ttl "$daemon_idle_ttl")
fi
link_install_args+=(--force)

"${link_command[@]}" "${link_install_args[@]}" >/dev/null

Related unpinned installation guidance also appears in SKILL.md:14, 67-71:

bash
npx playwright install

Technical Analysis

The default launcher uses npx -y @webmcp-bridge/local-mcp without an exact package version or integrity constraint. The -y option permits package acquisition without an interactive confirmation. The generated command is then registered as the reusable board-webmcp-cli link.

Consequently, the package code executed by a later invocation can differ from the code available when the Skill was audited. A compromised package release, maintainer account, registry response, or dependency chain could introduce arbitrary code. The Playwright installation guidance likewise does not identify an audited version.

This is a supply-chain weakness rather than evidence that the current packages are malicious.

Attack Path

  1. An attacker compromises the npm package, its publisher account, or a transitive dependency and publishes a malicious release.
  2. The setup script registers an unversioned npx launcher for @webmcp-bridge/local-mcp.
  3. A user or Agent invokes board-webmcp-cli, causin ...[truncated 977 chars]
Remediation
View remediation

Remediation Suggestions

  1. Pin every executable npm dependency to an exact reviewed version, for example:

    bash
    npx --yes @webmcp-bridge/local-mcp@X.Y.Z
    npx --yes playwright@X.Y.Z install
    
  2. Prefer installing dependencies through a checked-in lockfile with integrity hashes rather than resolving them dynamically during normal Skill operation.

  3. Remove npx -y from recurring execution paths. Install dependencies in a controlled setup phase and invoke a verified local binary afterward.

  4. Use a trusted registry and enforce package provenance or signature verification where supported.

  5. Review and pin transitive dependencies, then automate vulnerability and integrity scanning for dependency updates.

  6. Update SKILL.md so all installation commands specify the same audited versions used by the implementation.

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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared purpose is operational: connect to a board service and enable inspection or editing through WebMCP. The actual code chunk is purely a build/validation script for the skill's metadata and references. It uses ripgrep to verify required files and expected strings in documentation, and fails if legacy invocation patterns appear. There is no board access, no local-mcp or browser interaction, no UXC link handling, and no board inspection/editing capability. This is a materially different primary purpose, so it is a clear mismatch.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

WEBMCP_LOCAL_MCP_COMMAND can fully replace the command that will be parsed and executed, giving environment-controlled command execution far broader than simple board linking. Because this script constructs a launcher from that variable and then registers it for later execution, an attacker who can influence the environment can cause arbitrary code or alternate tooling to run under the user's account.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
86% confidence
Finding

The skill instructs use of npx playwright install without pinning a specific Playwright version. That can pull whatever version is current in the executing environment, creating supply-chain and reproducibility risk if a compromised or incompatible release is fetched at runtime.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
86% confidence
Finding

This is the same unpinned runtime install pattern repeated later in the file. Invoking npx playwright install without a fixed version allows uncontrolled dependency resolution and increases supply-chain exposure during skill setup.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The manifest explicitly enables implicit invocation while the description and default prompt broadly authorize connecting to a remote shared board and updating it. This creates a real risk that the skill is auto-selected in loosely related contexts and performs actions against shared state without a clear, task-specific user confirmation boundary.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The default prompt and description indicate the skill can update a shared diagram, but there is no user-facing warning that actions may modify shared data visible to others. In a shared remote board context, silent writes can cause unintended changes, data loss, or collaboration disruption if the skill is invoked without the user realizing it has write effects.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The usage guide includes state-changing commands such as nodes.upsert, edges.upsert, layout.apply, and bridge.session.mode.set/open against a shared board, but it does not warn that these operations can modify live shared state or visibly affect collaborators. In this skill context, that omission is security-relevant because an agent may execute the examples directly and unintentionally alter a production-like shared board or switch into a visible collaborative session without explicit user confirmation.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The default launcher uses npx -y @webmcp-bridge/local-mcp without a pinned version, allowing whatever package version resolves at runtime to be fetched and executed. In a security-sensitive linking script, this creates a meaningful supply-chain risk because a compromised upstream package or unexpected update would run local code with the user's privileges.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The script advertises use for one fixed board link and local board access, but --url allows an arbitrary remote target. That expands the trust boundary: the skill can be repointed to any site while still launching browser automation and local MCP bridging, which increases phishing, data exposure, and misuse risk beyond the documented purpose.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This section installs a launcher derived from externally influenced inputs (--url, --profile, --dir, and especially the MCP command setting) without explicit user-facing disclosure. Even though quoting reduces classic shell injection risk, the script still persists and enables execution behavior that can target arbitrary URLs or commands, which is risky in an agent skill context where users may not expect local command registration.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The script creates directories under $HOME/.uxc/webmcp-profile/board and optionally under --dir, which changes the local filesystem state. While it prints the profile path afterward, there is no warning, prompt, or explanatory comment before performing these file writes.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.