Back to skill

Security audit

浏览器自动化 · Browser Automation & Web Scraping — 用你自己的 Chrome 登录态干活

Security checks for vulnerabilities and agentic risk

Overview

This skill openly provides powerful logged-in Chrome automation, but it also starts unauthenticated local services and can automatically install and run mutable remote code with too little user control.

Review this carefully before installing. It can drive your already-logged-in Chrome, perform real clicks and form submissions, run arbitrary JavaScript in pages, keep local background services running, store an Access Key locally, and install global executable components. Only use it on accounts and machines where you accept that level of browser/session access, avoid sensitive admin or financial sites unless you explicitly supervise each action, and prefer a version that authenticates localhost services and verifies downloaded artifacts.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Tool Hijacking and SpoofingModifies or replaces tools so legitimate-looking calls execute attacker logic
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T07 · Tool Hijacking and Spoofing

Error
Location
scripts/relay.mjs:209
Finding

Unauthenticated WebSocket Allows Chrome Extension Impersonation

Content
View full analysis

Vulnerability Details

File Location: scripts/relay.mjs, lines 209-235 and 258-273
Vulnerability Type: Unauthenticated local WebSocket and privileged tool spoofing
Risk Level: High

Technical Analysis

The relay accepts a WebSocket upgrade after checking only the standard WebSocket headers. It does not authenticate the connecting client, validate the request path, verify the Origin header, or perform an extension-specific challenge-response handshake:

js
this.httpServer.on('upgrade', (req, socket, head) => this._handleUpgrade(req, socket));

_handleUpgrade(req, socket) {
  const upgrade = (req.headers.upgrade || '').toLowerCase();
  const key = req.headers['sec-websocket-key'];

  if (upgrade !== 'websocket' || !key) {
    socket.write('HTTP/1.1 400 Bad Request\r\n\r\n');
    socket.destroy();
    return;
  }

  const accept = crypto.createHash('sha1')
    .update(key + WS_MAGIC)
    .digest('base64');

  const response = [
    'HTTP/1.1 101 Switching Protocols',
    'Upgrade: websocket',
    'Connection: Upgrade',
    `Sec-WebSocket-Accept: ${accept}`,
    '',
    ''
  ].join('\r\n');

  socket.write(response);

  const conn = new WSConnection(socket);
  this.emit('connection', conn, req);
}

The first connection is unconditionally treated as the trusted Chrome extension. Subsequent connections, including the legitimate extension, are rejected:

js
this.wss.on('connection', (conn) => {
  if (this.ws) {
    // First-connection-wins: a connection is already active
    log('Rejecting new connection (already have one)');
    conn.close(1000, 'busy');
    return;
  }

  log('Extension connected');
  this.ws = conn;
  this.lastPongAt = Date.now();

  if (this._extensionReadyResolve) {
    this._extensionReadyResolve();
    this._extensionReadyResolve = null;
    this._extensionReadyReject = null;
  }

  conn.on('message', (text) => this._onMessage(text));
  conn.on('close', () => this._onClose());
  conn.on('error', (err) => log('Conn
...[truncated 2186 chars]
Remediation
View remediation

Remediation Suggestions

  1. Generate a cryptographically random, per-installation authentication secret and store it with owner-only permissions.
  2. Require the secret during the WebSocket upgrade or immediately perform an authenticated challenge-response handshake before assigning the connection to this.ws.
  3. Validate the Origin header against the exact expected Chrome extension origin and reject ordinary webpage origins. Do not rely on origin validation as the sole authentication control.
  4. Accept upgrades only on a dedicated, unpredictable or strictly validated WebSocket path.
  5. Authenticate the localhost HTTP API as well, preventing unrelated local processes or webpages from submitting privileged browser operations.
  6. Do not let an unauthenticated first connection permanently exclude the legitimate extension.
  7. Rotate the authentication secret after suspected exposure and avoid placing it in URLs or logs.
  8. Add negative tests covering ordinary web origins, missing or incorrect tokens, replayed handshakes, and competing connections.

T03 · Remote Payload Retrieval and Execution

Error
Location
scripts/webclaw3.mjs:44
Finding

Mutable Remote Pipeline Artifact Is Automatically Installed and Executed Without Integrity Verification

Content
View full analysis

Vulnerability Details

File Location: scripts/webclaw3.mjs, lines 44-46, 258-275, 298-309, and 735-746
Vulnerability Type: Unverified remote executable artifact retrieval and execution
Risk Level: High

Technical Analysis

The project defines a mutable main branch as the fallback source for executable distribution artifacts:

js
// dist/ 里的随包文件(扩展 zip、生成器 tarball)在导入部分 skill 平台时会被剥离,
// 缺失时从 GitHub raw 兜底下载。
const DIST_RAW_BASE = 'https://raw.githubusercontent.com/fatmind/webclaw3/main/dist';

When a matching bundled file is absent, ensureDistFile downloads the artifact without validating a signature, digest, immutable commit identifier, or package integrity metadata:

js
function ensureDistFile(skillDir, pattern, filename) {
  try {
    const distDir = join(skillDir, 'dist');
    mkdirSync(distDir, { recursive: true });
    let hit = null;
    try { hit = readdirSync(distDir).filter(f => pattern.test(f)).sort().pop() || null; } catch { /* dir 读失败 */ }
    if (hit) return join(distDir, hit);

    const dest = join(distDir, filename);
    const url = `${DIST_RAW_BASE}/${filename}`;
    log(`dist/${filename} 缺失,正在从 GitHub 下载兜底…`);
    execFileSync('curl', ['-fsSL', '--max-time', '60', '-o', dest, url], {
      stdio: ['ignore', 'ignore', 'inherit']
    });
    if (existsSync(dest)) {
      log(`已下载 dist/${filename}`);
      return dest;
    }
    return null;
  } catch (e) {
    log(`dist/${filename} 下载失败:${e.message}`);
    return null;
  }
}

The downloaded pipeline tarball is immediately passed to a global npm installation:

js
function installPipelineFromDist(skillDir) {
  try {
    const tgzPath = ensureDistFile(
      skillDir,
      /^wc3-pipeline-.*\.tgz$/,
      'wc3-pipeline-2.0.0.tgz'
    );
    if (!tgzPath) return null;
    log('检测到生成器尚未安装,正在自动安装,请稍候…');
    execFileSync('npm', ['i', '-g', tgzPath], {
      stdio: ['ignore', 'ignore', 'inherit']
    });
    log('生成器安装完成。');
    return findPipelineBinary();
  } 
...[truncated 2772 chars]
Remediation
View remediation

Remediation Suggestions

  1. Prefer shipping the reviewed pipeline artifact inside the Skill package rather than retrieving it during routine health checks.
  2. If downloading is necessary, use an immutable release URL or commit-pinned repository path.
  3. Embed an expected SHA-256 or stronger digest in the reviewed source and verify the complete artifact before invoking npm.
  4. Alternatively, verify a trusted digital signature whose public key is pinned in the Skill.
  5. Delete the artifact and abort installation on any verification failure.
  6. Avoid automatic global installation as a side effect of doctor; separate diagnosis from installation.
  7. Require explicit, informed user approval before downloading, globally installing, or launching executable content.
  8. Download to a securely created temporary file, verify it, and only then atomically move it into the distribution directory.
  9. Disable or tightly control package lifecycle scripts where feasible, and inspect the package manifest before installation.
  10. Record the verified artifact version and digest so later runs can detect unexpected replacement.
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
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (53)

Vague Triggers

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The activation condition is extremely broad: it instructs use for essentially any task involving browser operation or web data collection. Because the skill can drive the user’s already-authenticated Chrome on sensitive sites, over-triggering can cause unnecessary exposure of private data or unintended actions on logged-in services.

Content

No source excerpt is available for this finding.

External Script Fetching

High
Category
Supply Chain
Confidence
99% confidence
Finding

The document recommends curl -fsSL https://qoder.cn/install | bash, which fetches remote content and immediately executes it in the shell without giving the user an opportunity to inspect it. This is a classic high-risk pattern because any compromise of the host, transport, or script content results in arbitrary code execution on the user's machine.

Content

Scanner excerpt · references/setup.md (reported line 20)May include surrounding context.

md
|---|---|---|---|---|
| `claude-code` | Claude Code(cli) | `claude` | `npm i -g @anthropic-ai/claude-code` | https://code.claude.com/docs/en/quickstart |
| `workbuddy-cn` | **WorkBuddy 国内**(PC 桌面) | `codebuddy` | `npm install -g @tencent-ai/codebuddy-code` | https://www.codebuddy.cn/docs/cli/quickstart |
| `qoderwork-cn` | **QoderWork 国内**(PC 桌面) | `qoderclicn` | `curl -fsSL https://qoder.cn/install \| bash` | https://docs.qoder.cn/cli/qoder-cli-cn-get-started-quickly |

> **装 CLI 直接用「安装命令」那一列,别再去翻 quickstart 文档。** 那列命令就是权威做法,复制到终端跑就行;最后一列的 quickstart 链接只是万一命令失败时的兜底参考,正常流程不用点。

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The guide says doctor will automatically install and start wc3-pipeline globally, including downloading missing tarballs from GitHub and running npm i -g, which is a significant system change with executable code introduction. In the context of a skill designed to automate a logged-in browser and local generation pipeline, unattended installation and startup of new services materially expands the attack surface and could enable persistence or code execution without informed approval.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
96% confidence
Finding

The DELETE /logs handler accepts a user-controlled logFile path and truncates that file with fs.writeFileSync(lf, ''). This is a classic parameter abuse issue: any local caller that can reach the proxy may delete or zero arbitrary files writable by the current user, not just the intended operation log.

Content

Scanner excerpt · scripts/cdp-proxy.mjs (reported line 790)May include surrounding context.

js
return;
    }

    // DELETE /logs?logFile=xxx - 清空操作日志
    else if (pathname === '/logs' && req.method === 'DELETE') {
      const lf = q.logFile;
      try {

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

The skill embeds a recommended install command that pipes a remote script directly into bash. Even though this file does not execute that string itself, presenting such a pattern as guidance materially increases the chance of unsafe execution and supply-chain compromise by users following the instructions.

Content

Scanner excerpt · scripts/webclaw3.mjs (reported line 41)May include surrounding context.

js
const ENV_CLI = {
  'claude-code':  { type: 'claude-code',   binary: 'claude',     label: 'Claude Code',    doc: 'npm i -g @anthropic-ai/claude-code' },
  'workbuddy-cn': { type: 'codebuddy-code', binary: 'codebuddy',  label: 'WorkBuddy 国内', doc: 'npm install -g @tencent-ai/codebuddy-code' },
  'qoderwork-cn': { type: 'qoder-code',     binary: 'qoderclicn', label: 'QoderWork 国内', doc: 'curl -fsSL https://qoder.cn/install | bash' },
};

// dist/ 里的随包文件(扩展 zip、生成器 tarball)在导入部分 skill 平台时会被剥离,

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The README assures users that contributed site knowledge contains "never any user information," yet the product explicitly operates on a user's logged-in browser across authenticated pages. In that context, page structure, DOM captures, selectors, URLs, metadata, or validation artifacts can easily include personalized content, account identifiers, tokens, or other sensitive data unless strong technical sanitization guarantees are implemented and documented.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The README incentivizes users to send explored site structure back to a remote service in exchange for credits, but does not prominently warn that browsing within authenticated sessions can expose internal application layouts, business workflows, record names, IDs, or other sensitive organizational context. In this skill's context, the danger is elevated because it is specifically marketed for scraping logged-in services such as social platforms, e-commerce backends, and admin panels, where even 'structure' can be sensitive.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The README asserts that uploaded 'site structure' excludes any user information, but this skill explicitly operates inside a user's logged-in Chrome session where DOM structure, page content, embedded identifiers, tenant names, and account-specific metadata can vary by user context. That makes the blanket claim unsafe and misleading: data believed to be harmless structure may still reveal private or organizational information when transmitted to a remote service.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill exposes powerful local capabilities through shell and environment access, yet declares no explicit tool scope or permissions boundary. In this skill’s context, that is especially risky because it is designed to operate on the user’s logged-in browser session and local machine, so absent scoping can let routine web tasks expand into arbitrary local command execution and data access.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The trigger phrase '帮我提炼' is generic enough to appear in normal conversation, which could unintentionally transition exploratory browsing work into creation of an automated local skill. In this context, that means a casual phrase could cause persistence or scheduled automation of actions against logged-in sites without sufficiently clear user intent.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The instruction to 'just speak naturally to command it' encourages unconstrained invocation without defining safe boundaries, approved actions, or when explicit consent is required. For a skill that can browse authenticated sessions, fill forms, click buttons, and send content, vague invocation language increases the chance of unintended high-impact actions.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

bash
# 检查状态
curl -s http://127.0.0.1:3459/api/status
# → {"extensionConnected":true,"wsPort":3459}

# 通用调用格式:POST /api/call,body 为 JSON { "op": "操作名", "params": {...} }

Ssd 3

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill instructs logging every browser API call, including parameters and results, to a caller-specified file. Because this skill operates inside the user’s logged-in browser and may access private pages, tokens, page contents, form values, extracted records, and workflow details could be written to disk and retained far beyond the immediate task.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

bash
# ① 任务开始:开一个自己的分组,拿到 GROUP_ID
curl -s -X POST http://127.0.0.1:3459/api/call -d '{"op":"group.create","params":{"name":"<任务名,如 skill 名或调研主题>"}}'
# → {"groupId": 123, ...}

# ② 任务中:所有 tab.create 都带自己的 groupId

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The document tells users to paste an Access Key into the setup flow without guidance on secure credential handling, storage, rotation, or scope. Because this skill operates on authenticated websites and emphasizes using the user's existing logged-in browser state, poor handling of the Access Key could expose paid account access, automation capabilities, or broader browser-linked data access if the key is logged, echoed, or stored insecurely.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The document tells users to paste an Access Key into the setup flow without guidance on secure credential handling, storage, rotation, or scope. Because this skill operates on authenticated websites and emphasizes using the user's existing logged-in browser state, poor handling of the Access Key could expose paid account access, automation capabilities, or broader browser-linked data access if the key is logged, echoed, or stored insecurely.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The invocation examples are broad natural-language phrases for common browser tasks, which increases the chance the skill will be triggered in ordinary conversation without the user understanding that it may drive a real logged-in browser session. In this skill's context, that is more dangerous because the capability includes interacting with authenticated sites, clicking buttons, filling forms, and downloading content using the user's existing Chrome state.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation says everything happens through chat and instructs the user to 'install webclaw3' and begin using it, but it does not clearly foreground that setup will execute local commands and start a local service. That omission can mislead users into authorizing privileged local actions without informed consent, which is especially risky here because the skill also interfaces with a logged-in browser and can access authenticated web content.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The trigger description says to use this skill whenever a user requests browser operation or web data collection, which is overly broad and likely to cause the agent to invoke a powerful browser-automation capability in many situations where a narrower tool would suffice. In this skill’s context, that increases risk because the skill explicitly operates through the user’s own logged-in Chrome session and can access authenticated pages, click buttons, fill forms, send content, and extract data from sites containing sensitive personal or business information.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The document instructs the user to paste an Access Key during setup but gives no warning about treating it as a secret, where it will be stored, or whether it could be exposed to logs, prompts, generated skills, or other local processes. Given this skill's purpose—browser automation against logged-in sites and local skill generation—the missing credential-handling guidance is more dangerous because the key may unlock paid functionality and could be combined with automation capabilities or account context if leaked.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The document instructs the user to paste an Access Key during setup but gives no warning about treating it as a secret, where it will be stored, or whether it could be exposed to logs, prompts, generated skills, or other local processes. Given this skill's purpose—browser automation against logged-in sites and local skill generation—the missing credential-handling guidance is more dangerous because the key may unlock paid functionality and could be combined with automation capabilities or account context if leaked.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The entire instruction set is written to operate in Chinese and gives no indication that the user may choose another language or locale. Under the language/locale policy, forcing a specific language without opt-in is a natural-language policy violation unless the locale restriction is explicitly justified.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The trigger phrase includes a very broad everyday request pattern, which can cause the skill to activate for generic browsing or online tasks far beyond a narrowly scoped data-collection workflow. In this skill’s context, over-broad invocation is more dangerous because the skill is explicitly designed to use the operator’s own logged-in browser session, potentially enabling unintended actions or access to authenticated content.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The file instructs the agent to write files into the local workspace and create a specific directory structure, but the workflow shown in this file does not require a clear up-front warning and confirmation immediately before modifying local files. This is risky because users may believe they are only discussing extraction logic, while the skill proceeds to persist artifacts locally, which can overwrite expectations, leak sensitive task details to disk, or create unwanted files in the working directory.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file explicitly documents a CDP eval endpoint that executes arbitrary JavaScript inside the user's real logged-in Chrome session and notes that it bypasses page CSP. In this skill context, that is materially dangerous because scripts can mutate pages, trigger authenticated actions, and access sensitive in-session data, yet the documentation provides no safety constraints, user-consent gating, or warning about side effects.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/webclaw3.mjs:250