Back to skill

Security audit

WebMCP Bridge

Security checks for vulnerabilities and agentic risk

Overview

The skill’s browser-bridge purpose is coherent, but it installs persistent site links and profiles while executing unpinned npm-launched code that may use logged-in browser sessions.

Review before installing. Use this only for trusted sites and adapters, prefer pinned or locally installed local-mcp and Playwright versions, and understand that site profiles may keep login sessions on disk until you remove them. Avoid implicit use for sensitive accounts unless you are comfortable with the persistent browser profile and generated UXC command.

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

Error
Location
scripts/ensure-links.sh:42
Finding
Unpinned npm Packages Are Downloaded and Executed at Runtime## Vulnerability Details **File Location**: `scripts/ensure-links.sh:42`; related instructions at `SKILL.md:15-18` and `references/troubleshooting.md:123-130` **Vulnerability Type**: Unpinned dependency retrieval and execution **Risk Level**: High ### Vulnerable Code `scripts/ensure-links.sh:42`: ```bash local_mcp_command="${WEBMCP_LOCAL_MCP_COMMAND:-npx -y @webmcp-bridge/local-mcp}" ``` `SKILL.md:15-18`: ```markdown - `npx` is installed and available in `PATH`. - Network access is available for the target website. - On a fresh machine, or under an isolated `HOME`, install Playwright browsers first with `npx playwright install`. - For local repo development, you may replace the default `npx -y @webmcp-bridge/local-mcp` launcher with `WEBMCP_LOCAL_MCP_COMMAND='node packages/local-mcp/dist/cli.js'`. ``` `references/troubleshooting.md:123-130`: ```markdown ## Fresh machine or isolated HOME cannot start Chromium If `local-mcp` fails with an error that the Playwright browser executable does not exist, the current environment does not have Playwright browsers installed yet. Install them once in that environment: ```bash npx playwright install ``` ``` ### Technical Analysis The generated UXC link defaults to `npx -y @webmcp-bridge/local-mcp` without an exact package version or an integrity constraint. When the package is not already available in an applicable local cache or installation, `npx` can resolve it from the configured npm registry, download it, and execute its package entry point. The `-y` option suppresses the normal installation confirmation. The documented `npx playwright install` command presents a similar supply-chain risk because it does not identify an audited Playwright version. The effective code executed by these commands can therefore change after this Skill has been reviewed. This is an insecure dependency practice rather than evidence that the current upstream packages are mali ...[truncated 2380 chars]
Remediation
## Remediation Suggestions 1. Pin every executable npm dependency to an exact reviewed version, for example: ```bash npx -y @webmcp-bridge/local-mcp@X.Y.Z npx -y playwright@X.Y.Z install ``` 2. Prefer installing dependencies from a committed lockfile and invoking the verified local binary instead of downloading code during each bridge launch: ```bash npm ci --ignore-scripts ./node_modules/.bin/local-mcp ``` If lifecycle scripts are required, review them before allowing execution rather than disabling them permanently. 3. Commit and enforce a lockfile with integrity hashes. Run installation with lockfile-strict behavior, such as `npm ci`, so unexpected dependency resolution fails rather than silently updating packages. 4. Separate dependency installation from normal bridge execution. Installation should be an explicit, reviewable setup operation; invoking a generated UXC link should not implicitly retrieve new executable code. 5. Use a trusted registry configuration and package provenance verification. Where supported, verify npm provenance attestations, package signatures, checksums, and expected publisher identities. 6. Record the resolved package version in link output or metadata so operators can identify precisely which implementation is being executed. 7. Apply equivalent controls to third-party adapter modules: require explicit user approval, pin package versions, restrict allowed registries or paths, and avoid loading arbitrary mutable package specifiers. 8. Run the bridge under a least-privileged account or sandbox with narrowly scoped filesystem and network access, especially when its browser profile contains authenticated sessions.
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (10)

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
The skill instructs use of `npx playwright` without pinning a specific version, which makes execution depend on whatever package version is current at install time. In a security-sensitive browser automation workflow, this creates supply-chain and reproducibility risk because a compromised or breaking upstream release could be fetched and executed implicitly.

Rp1

Medium
Category
MCP Rug Pull
Confidence
98% confidence
Finding
The default launcher `npx -y @webmcp-bridge/local-mcp` executes an unpinned package from the registry, which is especially risky because this tool brokers browser automation and site interactions. If the package is updated maliciously or unexpectedly, users may run arbitrary code with local user privileges and access to browser profiles, sessions, and network resources.

Session Persistence

Medium
Category
Rogue Agent
Content
2. Pick one stable site name and one site-scoped profile path:
   - default profile root: `~/.uxc/webmcp-profile/<site>`
   - never share one profile across different sites
3. Create or refresh the fixed link for that site:
   - `command -v <site>-webmcp-cli`
   - if the link is missing or the source config changed, run `skills/webmcp-bridge/scripts/ensure-links.sh`
4. Inspect the bridge and tool schema before calling tools:
Confidence
86% confidence
Finding
The skill explicitly directs creation of stable per-site browser profiles under `~/.uxc/webmcp-profile/<site>` and persistent fixed links, which means authentication state, cookies, and other browser artifacts may remain on disk across sessions. In the context of site automation and login flows, that persistence increases the blast radius of local compromise or accidental reuse of sensitive session data.

Vague Triggers

Medium
Confidence
89% confidence
Finding
The default prompt encourages using the skill broadly to 'create or refresh local-mcp bridge links for a website and then call its tools through UXC' without clear constraints on when invocation is appropriate, what sites are trusted, or what user confirmation is required. Because this skill bridges websites to a local browser/MCP environment, overly broad automatic invocation increases the chance of connecting untrusted sites or exposing local capabilities to web-controlled workflows.

Session Persistence

Medium
Category
Rogue Agent
Content
## Link exists but points to old config

Recreate the link with `--force` through the helper script:

```bash
skills/webmcp-bridge/scripts/ensure-links.sh --name <site> ...
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

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.

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.

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding
The default command `npx -y @webmcp-bridge/local-mcp` pulls and executes the latest package version at runtime without pinning an exact version or integrity. That creates a supply-chain risk: a malicious or compromised package release could be fetched and executed automatically on the host running the skill.

Missing User Warnings

Medium
Confidence
86% confidence
Finding
The script accepts `--local-mcp-command` and also reads `WEBMCP_LOCAL_MCP_COMMAND`, then converts that string into launcher arguments that are installed and later executed through `uxc link`. This is a safety-relevant shell/subprocess behavior, but the file provides no confirmation prompt and no explanatory comment or docstring warning users that arbitrary command content may be registered for execution.

Missing User Warnings

Low
Confidence
78% confidence
Finding
The helper removes an existing symlink with `rm -f`, and it is invoked on legacy link paths later in the script. Although the deletion is limited to symlinks, it is still a destructive filesystem action and there is no prior warning, confirmation, or explanatory comment describing that the script will remove old links.

Static analysis

No suspicious patterns detected.