Back to skill

Security audit

Doc Snapshot Agent

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its stated document-illustration purpose, but it asks users to install unpinned browser-automation dependencies that may handle logged-in websites and credentials.

Review before installing. Prefer pinned, vetted versions of Playwright MCP, Playwright, and Python dependencies; run browser automation in a constrained environment; expose only the credentials needed for the specific site; avoid sensitive pages unless necessary; review screenshots and generated Markdown before sharing.

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
SKILL.md:211
Finding

Unpinned Third-Party Packages Are Downloaded and Executed

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:211-251, SKILL.md:315, references/playwright-mcp.md:11-67, references/image-generation.md:29-31
Vulnerability Type: Unpinned and mutable third-party dependencies
Risk Level: High

Vulnerable Code

SKILL.md:211-218:

markdown
**Claude Code**
```bash
claude mcp add playwright -- npx @playwright/mcp@latest

Codex

bash
codex mcp add playwright -- npx @playwright/mcp@latest
text

`SKILL.md:249-251`:

```markdown
**Standalone MCP Server (headless environments or worker processes)**
```bash
npx @playwright/mcp@latest --port 8931
text

`SKILL.md:315`:

```markdown
- if the Chromium browser runtime is not installed, run `npx playwright install chromium` before continuing

references/playwright-mcp.md:11-18:

markdown
**Claude Code**
```bash
claude mcp add playwright -- npx @playwright/mcp@latest

Codex

bash
codex mcp add playwright -- npx @playwright/mcp@latest
text

`references/playwright-mcp.md:49-67`:

```markdown
**Standalone MCP Server (headless environments or worker processes)**
```bash
npx @playwright/mcp@latest --port 8931

Then point the client config to:

json
{
  "mcpServers": {
    "playwright": {
      "url": "http://localhost:8931/mcp"
    }
  }
}

Install the browser runtime the first time:

bash
npx playwright install chromium
text

`references/image-generation.md:29-31`:

```markdown
Python dependency:

```bash
pip install requests
text

### Technical Analysis

The mandatory setup instructions execute packages resolved dynamically from public package registries. In particular, `@playwright/mcp@latest` explicitly selects a mutable release rather than a version reviewed alongside this skill. The `npx playwright` command and the unconstrained `pip install requests` command also lack exact versions, lockfiles, and integrity hashes.

When `npx` cannot find the requested package locally, it can download and execute it from t
...[truncated 2696 chars]
Remediation
View remediation

Remediation Suggestions

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

    bash
    npx --yes @playwright/mcp@<reviewed-exact-version>
    
  2. Pin the Playwright package used to install Chromium rather than relying on implicit registry resolution:

    bash
    npx --yes playwright@<reviewed-exact-version> install chromium
    
  3. Add an npm lockfile with committed integrity metadata where package installation is managed as part of the project.

  4. Replace the unconstrained Python installation command with a reviewed requirements file containing an exact version and hash:

    text
    requests==<reviewed-exact-version> --hash=sha256:<verified-hash>
    

    Install it with:

    bash
    python -m pip install --require-hashes -r requirements.txt
    
  5. Document the expected official package publisher, registry, and package identity so users can detect typosquatting or registry substitution.

  6. Run the MCP server with least privilege and restrict inherited environment variables to only those required for the current task.

  7. Isolate browser automation in a sandbox or container with narrowly scoped filesystem and network access.

  8. Review and test dependency updates before changing pinned versions. Do not automatically track mutable release tags in mandatory execution instructions.

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
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (29)

Tainted flow: 'headers' from os.environ.get (line 39, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/generate_image.py (reported line 85)May include surrounding context.

python
last_response = None
    for attempt in range(MAX_RETRIES):
        try:
            response = requests.post(API_URL, headers=headers, json=payload, timeout=120)
            last_response = response
            if response.status_code == 429:
                wait_seconds = 2 ** (attempt + 1)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The description promises a document-automation skill focused on illustrating Markdown by detecting markers, generating or capturing visuals, and producing an image-enriched Markdown file. The actual code only implements prompt-based image generation through OpenRouter and saves returned image files locally. There is no logic for opening Markdown files, finding placeholders, inserting image references, generating enriched Markdown output, or taking screenshots. This is a material description/behavior mismatch because the implemented primary purpose is much narrower and different from the declared workflow.

Content

No source excerpt is available for this finding.

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

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

Screenshot:

markdown
<!-- IMAGE: screenshot (https://example.com/app)
Description: Workspace dashboard showing project activity and team sidebar
Filename: workspace-dashboard.png
-->

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This markdown file explains that the skill expects website credentials via environment variables and will produce screenshots and rewritten markdown outputs, which can affect privacy and user data. It does not include any warning or disclosure about credential handling, screenshot capture of potentially sensitive pages, or file modifications/output generation.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill requests capabilities that imply environment access, file writes, and network interaction, but it does not declare an explicit tool scope or permission boundary. That makes the skill harder to review and easier to over-grant in a runtime, increasing the risk of unintended filesystem modification, authenticated browsing, or secret access beyond what a user expects.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The description also omits an upfront warning that the skill performs network access and may browse authenticated websites using environment-sourced credentials. In context, this is important because the workflow explicitly instructs browser automation, login handling, and remote image generation, all of which materially affect privacy and security expectations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The description also omits an upfront warning that the skill performs network access and may browse authenticated websites using environment-sourced credentials. In context, this is important because the workflow explicitly instructs browser automation, login handling, and remote image generation, all of which materially affect privacy and security expectations.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The activation guidance includes generic requests such as "add images to a Markdown article" and "capture screenshots for documentation," which are broad enough to overlap with many ordinary authoring tasks. The file does not provide exclusion conditions or negative examples to clarify when this skill should not be loaded.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding

The installation instruction uses an unpinned package reference (@latest) for the Playwright MCP server. This creates a supply-chain risk because future upstream changes or a compromised release could alter behavior at install time, and the skill explicitly tells the user to install and trust that code before proceeding.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding

This is another unpinned @latest installation path for the MCP server in a different client context. Repeating the instruction across environments broadens exposure to arbitrary upstream changes and makes reproducibility and security review difficult.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding

The standalone server setup also pulls @latest, which is especially risky because it may be run in headless or worker environments with fewer interactive checks. A compromised or changed package could gain persistent browser automation capability and network reach in those environments.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
89% confidence
Finding

The skill instructs the agent or user to run npx playwright install chromium without version pinning or an explicit trust boundary. While less severe than a full MCP package install, it still introduces supply-chain and reproducibility risk by fetching runtime components dynamically.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill directs runtime setup through local shell execution (npx playwright install chromium) as part of ordinary operation. Introducing shell-based dependency installation increases attack surface and can lead to unexpected code execution or environment modification, especially when triggered from a documentation-oriented skill.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill instructs execution of a bundled Python script via shell command to generate images, which expands the trust boundary from declarative workflow instructions to arbitrary local code execution. Because the script consumes prompt text and writes files, this can create risk if the script is modified, malicious, or insufficiently reviewed.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The reference explicitly instructs the agent to obtain login credentials from environment variables and use them for browser sign-in flows. Even though the stated goal is document illustration, this expands the skill into secret access and authenticated session handling, which increases the blast radius if the skill is misused, prompt-injected, or pointed at unintended sites.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · references/image-generation.md (reported line 34)May include surrounding context.

pip install requests

text

Never ask users to paste API keys into chat or hardcode them into files.

## Bundled Script

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

This reference instructs users to install and run an MCP server via npx without pinning to a specific immutable version. Because this skill controls browser automation and can access authenticated sessions, a compromised or malicious newly-published package version could execute arbitrary code in the client environment with access to local data, tokens, and browsing context.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

This command again relies on npx to fetch and execute the latest or otherwise unpinned MCP server package. In the context of an agent skill, that creates a supply-chain execution path where remote package changes can alter browser-tool behavior or run arbitrary code on developer machines or workers.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding

Telling operators to manually start the MCP server with an unpinned npx command creates the same supply-chain risk as installation examples. Although this section is descriptive, it still normalizes execution of mutable remote code, which is dangerous for a browser automation component that may process sensitive pages.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
87% confidence
Finding

The browser runtime installation uses npx playwright without an exact version, so the downloaded installer and related package contents may change over time. This is a weaker but still real supply-chain risk because it causes execution of code from an unpinned package during environment setup.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

This standalone-mode example executes the MCP server from an unpinned package version. Since the server mediates all browser actions for the skill, a malicious package update could intercept credentials, manipulate screenshots, exfiltrate page content, or execute arbitrary code in the host environment.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Running the MCP server in headless mode via an unpinned npx command still exposes the host to arbitrary code execution if the package is compromised upstream. The risk is elevated by the skill's purpose: automated browser access to potentially authenticated web applications and local output paths.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Specifying browser choice does not reduce the underlying risk of unpinned execution from the registry. A compromised MCP package version here could still gain code execution and visibility into automated sessions, including sensitive app content and user-provided credentials.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

This viewport-size example repeats the unsafe execution pattern of an unpinned MCP package via npx. In this skill context, any compromise of that package can affect all subsequent browser automation, screenshots, and page interactions, making the impact broader than a simple documentation typo.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

Using an unpinned command together with --ignore-https-errors is especially risky because it combines supply-chain exposure with guidance for weakening transport verification during browsing. If the package or browsing path is abused, the server could interact with sensitive staging environments while suppressing certificate warnings that might otherwise signal interception.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.