Back to skill

Security audit

Browser Ladder

Security checks for vulnerabilities and agentic risk

Overview

This browser automation skill mostly does what it says, but it normalizes CAPTCHA/bot bypass, sends browsing tasks to third-party services, and runs mutable external tooling without enough safeguards.

Install only if you are comfortable with Docker-based browser execution, third-party cloud browser providers receiving requested URLs/page data, and optional provider tokens being stored in a local .env file. Do not use it for private sessions, internal URLs, authenticated pages, or CAPTCHA/bot bypass unless you have explicit authorization and have reviewed the provider and credential-handling risks.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (3)

T08 · Insecure Dependencies

Error
Location
scripts/browse.sh:91
Finding

Unpinned Third-Party npm Package Is Downloaded and Executed at Runtime

Content
View full analysis
/dev/null && return 0 ``` ### Technical Analysis The HTML-processing path invokes `npx -y playwright-cli-extra` without specifying an exact package version or verifying package integrity. The `-y` option suppresses confirmation, allowing npm to download and execute the registry-selected package automatically. Consequently, the code executed during a future Skill invocation is not fully represented by the reviewed repository. A compromised npm account, malicious future package release, or compromised registry response could alter the effective payload after this audit. Execution occurs inside a Docker container, which limits direct host filesystem access because this branch does not mount a host directory. However, the container retains outbound network access by default and can process the supplied URL and any page content returned to it. Container isolation also depends on the security of the Docker runtime and image. ### Attack Path 1. An attacker compromises the `playwright-cli-extra` package, its maintainer account, or the dependency distribution path. 2. The attacker publishes a malicious release that becomes the version selected by unversioned `npx`. 3. A user invokes `browse.sh` with `--html`. 4. If Level 1 does not complete successfully, execution reaches the Level 2 HTML branch. 5. `npx -y` downloads and executes the attacker-controlled package without user confirmation. 6. The malicious package can execute arbitrary commands inside the container, inspect data available to that process, and communicate over the container's network. ### Impact Assessment Successful exploitation provides arbitrary code execution within the tra ...[truncated 433 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/setup.sh:19
Finding

API Credentials Are Entered Visibly and Stored Without Enforced File Permissions

Content
View full analysis
"$ENV_FILE.tmp" 2>/dev/null || true mv "$ENV_FILE.tmp" "$ENV_FILE" 2>/dev/null || true echo "BROWSERCAT_API_KEY=$BROWSERCAT_KEY" >> "$ENV_FILE" echo "✅ BrowserCat key saved" else echo "⏭️ Skipped (Rung 3 disabled)" fi echo "" # Rung 4: Browserless.io (paid) echo "--- Rung 4: Browserless.io (\$10+/mo) ---" echo "Get a token at: https://browserless.io" echo "Enables: CAPTCHA solving, bot detection bypass" read -p "Browserless Token (or press Enter to skip): " BROWSERLESS_KEY if [ -n "$BROWSERLESS_KEY" ]; then grep -v "^BROWSERLESS_TOKEN=" "$ENV_FILE" > "$ENV_FILE.tmp" 2>/dev/null || true mv "$ENV_FILE.tmp" "$ENV_FILE" 2>/dev/null || true echo "BROWSERLESS_TOKEN=$BROWSERLESS_KEY" >> "$ENV_FILE" ``` ### Technical Analysis Both credentials are read with the normal `read` command rather than silent input, so the secret is displayed while it is typed. This exposes it to shoulder surfing, terminal recording, screen sharing, and other local observation. The credentials are then written in plaintext to `.env`. The script neither applies a restrictive `umask` before creating the file nor verifies or enforces mode `0600` afterward. The actual exposure therefore depends on the caller's current umask and any pre-existing file permissions. The update also uses a predictable sibling temporary path, `"$ENV_FILE.tmp"`, without securely creating it. Although no concrete privilege boundary is established in the reviewed code, this pattern should be hardened to avoid races and unintended file replacement in shared or attacker-writable directories. ### Attack Path 1. ...[truncated 989 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/browse.sh:121
Finding

Browserless Token Is Exposed Through Process Command-Line Arguments

Content
View full analysis
/dev/null && return 0 elif [[ -n "$PDF" ]]; then curl -s -X POST "https://production-sfo.browserless.io/pdf?token=$BROWSERLESS_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"url\": \"$URL\"}" \ -o "$PDF" 2>/dev/null && return 0 elif $HTML; then curl -s -X POST "https://production-sfo.browserless.io/content?token=$BROWSERLESS_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"url\": \"$URL\"}" 2>/dev/null && return 0 ``` ### Technical Analysis The Browserless credential is interpolated directly into each request URL. Because the complete URL is passed to `curl` as a command-line argument, the token can be visible in process metadata while the request is active. Depending on operating-system process visibility and monitoring configuration, other local users, process-monitoring agents, debugging tools, audit logs, or command wrappers may record the argument. Query-string credentials can also be captured by URL-oriented telemetry more readily than credentials supplied through a protected authentication mechanism. Transmission to the declared Browserless endpoint is necessary for the optional cloud browsing function and occurs over HTTPS; the concern is local and operational credential exposure, not evidence of covert transmission to an undeclared service. ### Attack Path 1. A user configures `BROWSERLESS_TOKEN` and invokes Level 4 browsing for a screenshot, PDF, or HTML response. 2. The shell expands the token into the Browserless URL before starting `curl`. 3. Duri ...[truncated 574 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (28)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The code largely matches the stated purpose of a hierarchical browser escalation tool, including fetch, local Playwright, and Browserless-based fallbacks. However, there is a material description-to-behavior gap: Level 3 (BrowserCat) is declared as part of the escalation ladder, but the code contains only a TODO and always returns failure, so that capability is not actually present. In addition, the description frames Level 4 as specifically for CAPTCHA/bot bypass, but the code only performs generic Browserless screenshot/PDF/content API calls and does not explicitly implement or verify bot-bypass logic. There are no obvious unrelated or hidden capabilities beyond the browsing workflow, but the missing BrowserCat implementation makes the description inaccurate enough to count as a mismatch.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/setup.sh (reported line 3)May include surrounding context.

sh
#!/bin/bash
# Browser Ladder Setup Script
# Prompts for optional API keys and adds them to .env

set -e

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/setup.sh (reported line 7)May include surrounding context.

sh
set -e

ENV_FILE="${CLAWDBOT_WORKSPACE:-.}/.env"

echo "🪜 Browser Ladder Setup"
echo "========================"

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill includes shell-capable setup and Docker commands but does not declare any explicit tool scope or allowed-tools boundary. That makes the operational surface less auditable and can permit broader command execution than users expect, especially in an agent environment where shell access is sensitive.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill encourages escalation to cloud browser providers but does not warn that visited URLs, page contents, session data, and potentially credentials may be transmitted to third-party services. In a browsing skill, that omission materially increases privacy and data-handling risk because users may unknowingly send sensitive targets or content off-platform.

Content

No source excerpt is available for this finding.

Ssd 4

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill frames progressively stronger browsing capabilities, culminating in CAPTCHA and bot-detection bypass, as a normal optimization path. That normalizes behavior often restricted by site terms or used in abusive automation, increasing the chance the skill is applied to evade access controls rather than for legitimate browsing.

Content

No source excerpt is available for this finding.

Ssd 4

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The decision flow explicitly instructs users to escalate when encountering CAPTCHA or bot detection, turning an access-control signal into a trigger for stronger circumvention tooling. In context, that is more dangerous because the skill is specifically a browser automation helper, so the workflow operationalizes bypass behavior rather than merely mentioning it.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

Using npx playwright without pinning an exact package version can pull whatever version is current at execution time, creating supply-chain and reproducibility risk. An upstream compromise or breaking change could alter behavior or execute unexpected code in the user's environment.

Content

No source excerpt is available for this finding.

Ssd 4

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The Browserless example states 'CAPTCHA handled automatically,' which presents anti-abuse bypass as an expected and acceptable endpoint. That is risky because it can directly encourage use of third-party infrastructure to defeat website protections, and the concrete code sample makes misuse easier.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The script performs remote fetches of arbitrary user-supplied URLs without user-facing disclosure that external requests will be made. In an agent setting, this matters because browsing a URL can leak interest, trigger server-side actions, hit internal endpoints if inputs are attacker-influenced, or exfiltrate metadata through outbound network access.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill's stated purpose is browsing, but it expands capability to host-level container execution via Docker, which materially increases attack surface and privileges. In agent environments, introducing docker run can enable unexpected code execution paths, network access, and filesystem interaction beyond what a user may reasonably expect from a browsing helper.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
75% confidence
Finding

Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
75% confidence
Finding

Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
75% confidence
Finding

Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
75% confidence
Finding

Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.

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
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
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

npx -y playwright-cli-extra content may download and execute package code at runtime without an explicit version pin, creating a supply-chain execution risk. Because this script processes attacker-controlled URLs, a compromised or substituted package could gain code execution in the browsing environment and access mounted data or network egress.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
82% confidence
Finding

The skill is explicitly designed to transmit arbitrary URLs and page content to external services and remote sites, including cloud browsing providers, which is a real data egress capability. In context this is partly expected for a browser tool, but it becomes dangerous because there are no safeguards preventing sensitive/internal URLs or content from being sent to third-party infrastructure.

Content

Scanner excerpt · scripts/browse.sh (reported line 96)May include surrounding context.

sh
docker run --rm mcr.microsoft.com/playwright:v1.58.0-jammy \
      npx -y playwright-cli-extra content "$URL" 2>/dev/null && return 0
    
    # Fallback: just use curl if we got here for HTML
    return 1
  fi

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The script explicitly advertises Browserless for CAPTCHA solving and bot-detection bypass, which promotes use of an anti-detection capability beyond ordinary browser automation. In the context of an agent skill, encouraging bypass of site defenses increases abuse potential and can facilitate unauthorized scraping or access patterns that violate site protections.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

Low
Category
Tool Misuse
Confidence
15% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

Rung 2: JS-rendered page

bash
docker run --rm -v /tmp:/output mcr.microsoft.com/playwright:v1.58.0-jammy \
  npx playwright screenshot https://spa-app.com /output/shot.png

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill manifest says L2 is 'local Playwright', implying a local browser automation step before cloud escalation. The code documentation and implementation instead define Level 2 as Docker-based Playwright, which contradicts the stated ladder semantics rather than merely omitting detail.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The script creates directories and writes screenshot/PDF outputs to user-provided paths, but there is no explicit warning or disclosure that it will modify the filesystem. Although output-file creation is related to the script's purpose, the code lacks any visible notice beyond option names, and the safety-check criteria call for some form of user disclosure for file writes.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

Low
Category
Tool Misuse
Confidence
15% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/browse.sh (reported line 78)May include surrounding context.

sh
local OUTPUT_FILE=$(basename "$SCREENSHOT")
    mkdir -p "$OUTPUT_DIR"
    
    docker run --rm -v "$OUTPUT_DIR:/output" \
      mcr.microsoft.com/playwright:v1.58.0-jammy \
      npx playwright screenshot "$URL" "/output/$OUTPUT_FILE" 2>/dev/null && return 0

Static analysis

No suspicious patterns detected.