Back to skill

Security audit

Web Access.Bak

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent web-automation tool, but it exposes a broad, unauthenticated control surface over the user's logged-in Chrome session and local files.

Install only if you are comfortable giving an agent control over your active Chrome profile. Use a dedicated Chrome profile with limited logins, shut down the proxy after use, avoid private or token-bearing URLs with third-party preprocessing, and require explicit review before uploads, posts, purchases, form submissions, or any account-changing action.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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 (5)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/cdp-proxy.mjs:255
Finding

Unauthenticated API Exposes Privileged Control of the User's Authenticated Browser

Content
View full analysis
{ const parsed = new URL(req.url, `http://localhost:${PORT}`); const pathname = parsed.pathname; const q = Object.fromEntries(parsed.searchParams); res.setHeader('Content-Type', 'application/json; charset=utf-8'); try { if (pathname === '/health') { const connected = ws && (ws.readyState === WS.OPEN || ws.readyState === 1); res.end(JSON.stringify({ status: 'ok', connected, sessions: sessions.size, chromePort })); return; } await connect(); if (pathname === '/targets') { const resp = await sendCDP('Target.getTargets'); const pages = resp.result.targetInfos.filter(t => t.type === 'page'); res.end(JSON.stringify(pages, null, 2)); } // ... else if (pathname === '/eval') { const sid = await ensureSession(q.target); const body = await readBody(req); const expr = body || q.expr || 'document.title'; const resp = await sendCDP('Runtime.evaluate', { expression: expr, returnByValue: true, awaitPromise: true, }, sid); if (resp.result?.result?.value !== undefined) { res.end(JSON.stringify({ value: resp.result.result.value })); } else if (resp.result?.exceptionDetails) { res.statusCode = 400; res.end(JSON.stringify({ error: resp.result.exceptionDetails.text })); } else { res.end(JSON.stringify(resp.result)); } } ``` ```js server.listen(PORT, '127.0.0.1', () => { console.log(`[CDP Proxy] Running at http://localhost:${PORT}`); connect().catch(e => console.error('[CDP Proxy] Initial connection failed:', e.message)); }); ``` ### Technical Analysis The HTTP API controls Chrome DevTools Protoc ...[truncated 2224 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/cdp-proxy.mjs:417
Finding

Unrestricted Local File Selection Enables Disclosure Through Browser Uploads

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/cdp-proxy.mjs:470
Finding

Caller-Controlled Screenshot Path Permits Arbitrary User-Writable File Overwrite

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:170
Finding

Long-Running Privileged Proxy Extends the Unauthorized Access Window

Content
View full analysis
/dev/null) if echo "$HEALTH" | grep -q '"connected":true'; then echo "proxy: ready" else if ! echo "$HEALTH" | grep -q '"ok"'; then echo "proxy: starting..." node ~/.claude/skills/web-access/scripts/cdp-proxy.mjs > /tmp/cdp-proxy.log 2>&1 & fi ``` The Skill instructions state that the proxy continues running and recommend not stopping it after the task. The API reference similarly describes the proxy as a continuing background service. ### Technical Analysis The background process is not installed as a startup service, scheduled job, or cross-reboot backdoor, so this finding does not meet the definition of system persistence under T06. However, it deliberately remains active beyond the operation that required it. Because the proxy retains privileged access to the user's authenticated Chrome and does not authenticate HTTP callers, keeping it running materially extends the period during which another process can exploit it. The retained service also accepts new sessions and reconnects to Chrome after a disconnection. The operational convenience of avoiding repeated browser authorization does not justify indefinite availability of an unauthenticated control interface. ### Attack Path 1. A legitimate browser task invokes `check-deps.sh`. 2. The script starts `cdp-proxy.mjs` in the background. 3. The legitimate task finishes, but the proxy remains active. 4. At a later time, an attacker-controlled local process discovers port 3456. 5. The attacker accesses the unauthenticated endpoints and reuses the proxy's Chrome ...[truncated 439 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:56
Finding

Third-Party Jina Preprocessing May Disclose Token-Bearing or Private URLs

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (25)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述的是一个统一处理联网任务的技能,覆盖搜索、网页抓取、登录网站、真实浏览器环境操作等高权限网络能力。但提供的代码仅在本地文件系统中读取 Markdown 文件,解析 aliases 字段,并用 grep/awk 根据输入文本匹配站点模式后输出文件正文。它既不发起网络请求,也不访问网页、执行登录、处理动态渲染页面或社交媒体抓取。因此其主要用途与声明完全不同,属于明显的描述与行为不一致。

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The trigger scope is effectively 'all network-related tasks,' including search, scraping, login-required access, browser interaction, and social media collection. Such a broad mandate increases the chance the skill is invoked in high-risk contexts without task-specific safeguards, especially because it can operate through the user's authenticated browser session.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill relies on the user's real Chrome session and explicitly notes that it carries existing login state, but this is not prominently disclosed up front in the manifest/description. Using an authenticated browser context can expose private account data and enable actions as the user, so lack of clear warning materially raises the risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The setFiles endpoint is documented as bypassing the file chooser entirely and allowing arbitrary local file paths to be injected into a page upload flow. In this skill context, that materially increases the risk of unintended local file disclosure because an agent could upload sensitive host files to remote sites without the normal user-mediated browser prompt.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The /eval endpoint executes arbitrary JavaScript in tabs of the user's normal Chrome via Runtime.evaluate. That gives callers broad capability to read page contents, interact with authenticated sessions, alter DOM state, and potentially harvest sensitive data from sites the user is logged into, far beyond a narrowly mediated browsing interface.

Content

No source excerpt is available for this finding.

Ssd 4

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The code explicitly implements browser-level mouse events and file-input handling to trigger actions described as bypassing normal user-consent flows and anti-automation checks. In a skill attached to real browsing and logged-in sessions, this is dangerous because it enables automation to impersonate user gestures and defeat safeguards meant to protect uploads and sensitive interactions.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The /setFiles endpoint lets any local caller instruct the user's daily Chrome session to populate file inputs with arbitrary local filesystem paths. In the context of a web-access skill, this crosses from browsing into local file exfiltration/enabling uploads from the host, which can expose sensitive documents to arbitrary sites without meaningful user mediation.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

This endpoint injects local files into browser file inputs without any user warning, allowing silent preparation of uploads from the local machine into remote websites. Because the skill targets real web interaction in the user's regular Chrome, the absence of clear consent and disclosure materially increases the chance of unnoticed sensitive file submission.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README explicitly promotes browser automation through the user's everyday Chrome profile and logged-in session, which can expose cookies, private data, and privileged account actions to automated flows. In this context, the skill is more dangerous because it is designed to let an agent perform real authenticated actions, including social/content-platform operations, without any visible warning about privacy, consent, or account-impact boundaries.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

The documented local HTTP API can open tabs, execute arbitrary JavaScript, click elements, upload files, and take screenshots against the user's authenticated browser context. Even though the endpoint is localhost, this is still dangerous in skill context because it exposes a high-privilege browser-control surface that could be abused by local processes or misused by an agent to exfiltrate sensitive page data or perform actions on behalf of the user.

Content

Scanner excerpt · README.md (reported line 70)May include surrounding context.

md
node ~/.claude/skills/web-access/scripts/cdp-proxy.mjs &

# 页面操作
curl -s "http://localhost:3456/new?url=https://example.com"     # 新建 tab
curl -s -X POST "http://localhost:3456/eval?target=ID" -d 'document.title'  # 执行 JS
curl -s -X POST "http://localhost:3456/click?target=ID" -d 'button.submit'  # JS 点击
curl -s -X POST "http://localhost:3456/clickAt?target=ID" -d '.upload-btn'  # 真实鼠标点击

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The usage examples include publishing content on a creator platform, which is an externally visible and potentially irreversible action, yet the README provides no warning about confirmation, auditability, or accidental misuse. Because this skill is intended to be invoked by an agent for web tasks, examples like this can normalize autonomous posting behavior and increase the chance of unintended public actions.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill exposes shell-driven behavior (bash, curl, file reads/writes) but does not declare an explicit tool scope or permission boundary. That makes the effective capability broader than what a reviewer or orchestrator can infer from the manifest, increasing the risk of unintended local command execution and environment access.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
72% confidence
Finding

The skill description and operating instructions are presented as mandatory behavior in Chinese, and there is no indication that users can choose another language or locale. Under the policy criteria, a forced language without opt-in can be a natural-language policy violation unless clearly justified as region-specific.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
91% confidence
Finding

The skill encourages use of Jina, a third-party external service, to transform target pages, which means requested URLs and potentially retrieved content are transmitted outside the local/browser environment. In the context of a skill that may handle sensitive browsing targets, authenticated workflows, or private research, this external transmission increases confidentiality and data handling risk.

Content

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

md
| 非公开内容,或已知静态层无效的平台(小红书、微信公众号等公开内容也被反爬限制) | **浏览器 CDP**(直接,跳过静态层) |
| 需要登录态、交互操作,或需要像人一样在浏览器内自由导航探索 | **浏览器 CDP** |

浏览器 CDP 不要求 URL 已知——可从任意入口出发,通过页面内搜索、点击、跳转等方式找到目标内容。WebSearch、WebFetch、curl 均不处理登录态。

**Jina**(可选预处理层,可与 WebFetch/curl 组合使用,由于其特性可节省 tokens 消耗,请积极在任务合适时组合使用):第三方网络服务,可将网页转为 Markdown,大幅节省 token 但可能有信息损耗。调用方式为 `r.jina.ai/example.com`(URL 前加前缀,不保留原网址 http 前缀),限 20 RPM。适合文章、博客、文档、PDF 等以正文为核心的页面;对数据面板、商品页等非文章结构页面可能提取到错误区块。

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill instructs the agent to persist and update local references/site-patterns/ knowledge files, which creates a durable side effect unrelated to a single web-access task. Persistent writes can leak browsing-derived data into local storage, accumulate unreviewed content, and create a pathway for prompt/data poisoning across future runs.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill instructs writing persistent site-pattern files without a clear user-facing warning or consent flow. Silent local modification is risky because users may not expect durable artifacts or future reuse of data gathered during browsing sessions.

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 · references/cdp-api.md (reported line 15)May include surrounding context.

GET /health

健康检查,返回连接状态。

bash
curl -s http://localhost:3456/health

GET /targets

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The eval endpoint permits execution of arbitrary JavaScript in the context of an open page, which can read DOM-visible sensitive content, session-dependent data, and form values. Because this skill is specifically for real browser interaction, including logged-in sites, lack of warnings or constraints makes data extraction risks materially more dangerous.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The documentation exposes a capability to persist page screenshots to arbitrary local file paths without any warning about sensitive data capture or disk persistence. In a web-access skill that handles logged-in sessions and social media content, screenshots can contain credentials, personal data, or private messages and leave recoverable artifacts on disk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The screenshot endpoint can write captured page images to an arbitrary local path when q.file is supplied, without any user-facing notice or path restrictions. In a browser automation context this can silently persist sensitive visual data from authenticated pages onto disk, increasing privacy and data handling risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

User-facing comments and status/error messages throughout the script are written in Chinese, including operational guidance and warnings. This imposes a specific language on users without any opt-in or documented locale constraint, which matches the language-policy violation criteria.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The skill claims minimal intrusion into the user's environment while elsewhere directing local file modification. That inconsistency can mislead users and reviewers about the real side effects of using the skill, reducing informed consent and masking persistence behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

User-facing comments and operational messages are written exclusively in Chinese, with no indication that language choice is configurable or intentionally limited to a specific locale. This can violate language/locale policy when a skill imposes a language without user opt-in or documented justification.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

The inline documentation presents WebSocket probing as something to avoid because Chrome treats it as a debugging connection and may show an authorization dialog. However, the implementation subsequently connects to Chrome over WebSocket in connect(), so the comment suggests avoiding a behavior that the program later relies on anyway.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

Line L38 starts cdp-proxy.mjs in the background and redirects output to a log file. Although the script prints that the proxy is starting, it does not clearly disclose that it will spawn a long-running background process or where its logs and lifecycle are managed.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.