Back to skill

Security audit

Unbrowse Openclaw

Security checks for vulnerabilities and agentic risk

Overview

This skill has a coherent website-automation purpose, but it combines automatic browser-session access, shared publishing, and an under-protected local service in ways users should review carefully before installing.

Install only if you are comfortable with a long-running local service that can read browser sessions, store cookies, replay authenticated requests, and publish discovered API structures to an external shared marketplace. Use it with a dedicated browser profile or test account, avoid private or sensitive sites, keep the localhost port inaccessible, and review any captured skill before sharing.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
Findings (7)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
src/api/routes.ts:20
Finding

Privileged Local API Does Not Authenticate Callers

Content
View full analysis
{ if (req.url === "/health") return; const key = getApiKey(); if (!key) { return reply.code(401).send({ error: "api_key_required", message: "No API key configured. Restart the server to auto-register, or run: bash scripts/setup.sh", docs_url: "https://unbrowse.ai", }); } }); ``` A representative privileged route is: ```ts // POST /v1/auth/steal — extract cookies from Chrome/Firefox SQLite DBs. // No browser launch, Chrome can stay open. Higher rate limit since it's instant. app.post("/v1/auth/steal", { config: { rateLimit: { max: 30, timeWindow: "1 minute" } } }, async (req, reply) => { const { url, chrome_profile, firefox_profile } = req.body as { url: string; chrome_profile?: string; firefox_profile?: string; }; if (!url) return reply.code(400).send({ error: "url required" }); try { const domain = new URL(url).hostname; const result = await extractBrowserAuth(domain, { chromeProfile: chrome_profile, firefoxProfile: firefox_profile, }); return reply.send(result); } catch (err) { return reply.code(500).send({ error: (err as Error).message }); } }); ``` ### Technical Analysis The request hook verifies only whether the server process has an Unbrowse backend API key. It does not authenticate the process or user sending the HTTP request to the local service. Consequently, once the server has registered, every process capable of reaching port 6969 is treated as authorized. This includes rout ...[truncated 1378 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
src/index.ts:29
Finding

Permissive CORS Exposes the Unauthenticated Local API to Web Origins

Content
View full analysis
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
src/auth/browser-cookies.ts:212
Finding

Automatic Extraction of Browser Session Cookies Exceeds Least Privilege

Content
View full analysis
0) { cookies = resolved; usedStoredAuth = true; } } const captured = await captureSession(url, authHeaders, cookies); ``` Chrome cookies are queried from a copied browser database: ```ts const cookies = withTempCopy(dbPath, (tempDb) => { const where = buildDomainWhereClause(domain, "host_key"); const sql = `SELECT name, hex(encrypted_value) as ev, host_key, path, is_secure, is_httponly, samesite, expires_utc FROM cookies WHERE ${where};`; const rows = sqliteQuery(tempDb, sql); if (!rows) return []; const results: BrowserCookie[] = []; for (const line of rows.split("\n")) { const parts = line.split("|"); if (parts.length < 8) continue; const [name, encHex, host, cookiePath, secure, httpOnly, sameSite, expiresUtc] = parts; const value = decryptChromeValue(encHex); if (!value) continue; results.push({ name, value, domain: host, path: cookiePath || "/", secure: secure === "1", httpOnly: httpOnly === "1", sameSite: sameSite === "0" ? "None" : sameSite === "1" ? "Lax" : "Strict", expires: expiresUtc === "0" ? -1 : Math.floor( (Number(expiresUtc) - 11644473600000000) / 1000000 ), }); } return results; }); ``` Firefox cookies are read in plaintext: ```ts ...[truncated 2508 chars]
Remediation
View remediation

other

Error
Location
src/reverse-engineer/index.ts:222
Finding

Captured Request Bodies Can Be Published Without Sensitive-Data Redaction

Content
View full analysis
0 ? pathParams : undefined, body: !isGet && req.request_body ? tryParseBody(req.request_body) : undefined, idempotency: isGet ? "safe" : "unsafe", verification_status: verificationStatus, reliability_score: 0.5, response_schema, // Record which page triggered this API call — used for trigger-and-intercept execution trigger_url: context?.pageUrl, }); ``` The descriptors are placed into the published manifest: ```ts const draft = { skill_id: existingSkill?.skill_id ?? nanoid(), version: "1.0.0", schema_version: "1", lifecycle: "active" as const, execution_type: "http" as const, created_at: existingSkill?.created_at ?? new Date().toISOString(), updated_at: new Date().toISOString(), name: `${domain} -- ${intent}`, intent_signature: intent, domain, description: `Auto-discovered skill for: ${intent}`, owner_type: "agent" as const, endpoints: publishableEndpoints, ...(auth_profile_ref ? { auth_profile_ref } : {}), }; const validation = await validateManifest({ ...draft, skill_id: "__validate__" }); if (!validation.valid) throw new Error(`Skill validation failed: ${validation.hardErrors.join("; ")}`); const learned = await publishSkill(draft); ``` The manifest is sent to t ...[truncated 1913 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
src/index.ts:17
Finding

Startup Executes an Unpinned Third-Party Installer Through NPX

Content
View full analysis
Remediation
View remediation

T01 · Skill Instruction Hijacking

Warning
Location
src/cli.ts:180
Finding

CLI Auto-Startup Silently Asserts Terms-of-Service Consent

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/vault/index.ts:29
Finding

Credential Vault Fallback Uses Unauthenticated Encryption and a Co-Located Key

Content
View full analysis
): void { const key = getOrCreateKey(); const iv = randomBytes(16); const cipher = createCipheriv("aes-256-cbc", key, iv); const enc = Buffer.concat([cipher.update(JSON.stringify(data), "utf8"), cipher.final()]); writeFileSync(VAULT_FILE, Buffer.concat([iv, enc]), { mode: 0o600 }); } ``` ### Technical Analysis When `keytar` is unavailable, credentials are encrypted with AES-256-CBC. CBC provides confidentiality but no cryptographic integrity. The code does not attach a MAC or authenticated-encryption tag, so ciphertext tampering is not reliably detected. Furthermore, the raw encryption key is stored in `~/.unbrowse/vault/.key` next to `credentials.enc`. Filesystem permissions offer useful protection between operating-system users, but any process running as the same user that can read the ciphertext can normally also read the key. Encryption therefore does not materially protect against same-account compromise or accidental archive disclosure containing both files. ### Attack Path 1. A malicious process or attacker obtains read access to the user's `~/.unbrowse/vault` directory. 2. The attacker reads both `.key` and `credentials.enc`. 3. The stored cookies and authorization headers are decrypted offline. 4. Alternatively, an attacker with write access modifies the unauthenti ...[truncated 460 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (208)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The README describes capturing website network traffic, extracting API endpoints, and publishing learned skills to a shared marketplace accessible by all agents, but does not prominently warn about possible disclosure of sensitive data, proprietary workflows, or authenticated endpoint details. In this skill's context, that is especially dangerous because the whole product is designed to observe live web sessions and share derived artifacts broadly, increasing the chance of leaking private or restricted information.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documented purpose presents a broad traffic-analysis and skill-marketplace system, while the actual behavior includes direct credential/session handling through browser cookie extraction and persistent login flows. That mismatch hides a materially more sensitive trust boundary: access to local authenticated sessions, which can enable account access on third-party sites.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documented purpose presents a broad traffic-analysis and skill-marketplace system, while the actual behavior includes direct credential/session handling through browser cookie extraction and persistent login flows. That mismatch hides a materially more sensitive trust boundary: access to local authenticated sessions, which can enable account access on third-party sites.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documented purpose presents a broad traffic-analysis and skill-marketplace system, while the actual behavior includes direct credential/session handling through browser cookie extraction and persistent login flows. That mismatch hides a materially more sensitive trust boundary: access to local authenticated sessions, which can enable account access on third-party sites.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documented purpose presents a broad traffic-analysis and skill-marketplace system, while the actual behavior includes direct credential/session handling through browser cookie extraction and persistent login flows. That mismatch hides a materially more sensitive trust boundary: access to local authenticated sessions, which can enable account access on third-party sites.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documented purpose presents a broad traffic-analysis and skill-marketplace system, while the actual behavior includes direct credential/session handling through browser cookie extraction and persistent login flows. That mismatch hides a materially more sensitive trust boundary: access to local authenticated sessions, which can enable account access on third-party sites.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documented purpose presents a broad traffic-analysis and skill-marketplace system, while the actual behavior includes direct credential/session handling through browser cookie extraction and persistent login flows. That mismatch hides a materially more sensitive trust boundary: access to local authenticated sessions, which can enable account access on third-party sites.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documented purpose presents a broad traffic-analysis and skill-marketplace system, while the actual behavior includes direct credential/session handling through browser cookie extraction and persistent login flows. That mismatch hides a materially more sensitive trust boundary: access to local authenticated sessions, which can enable account access on third-party sites.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documented purpose presents a broad traffic-analysis and skill-marketplace system, while the actual behavior includes direct credential/session handling through browser cookie extraction and persistent login flows. That mismatch hides a materially more sensitive trust boundary: access to local authenticated sessions, which can enable account access on third-party sites.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documented purpose presents a broad traffic-analysis and skill-marketplace system, while the actual behavior includes direct credential/session handling through browser cookie extraction and persistent login flows. That mismatch hides a materially more sensitive trust boundary: access to local authenticated sessions, which can enable account access on third-party sites.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documented purpose presents a broad traffic-analysis and skill-marketplace system, while the actual behavior includes direct credential/session handling through browser cookie extraction and persistent login flows. That mismatch hides a materially more sensitive trust boundary: access to local authenticated sessions, which can enable account access on third-party sites.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documented purpose presents a broad traffic-analysis and skill-marketplace system, while the actual behavior includes direct credential/session handling through browser cookie extraction and persistent login flows. That mismatch hides a materially more sensitive trust boundary: access to local authenticated sessions, which can enable account access on third-party sites.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documented purpose presents a broad traffic-analysis and skill-marketplace system, while the actual behavior includes direct credential/session handling through browser cookie extraction and persistent login flows. That mismatch hides a materially more sensitive trust boundary: access to local authenticated sessions, which can enable account access on third-party sites.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documented purpose presents a broad traffic-analysis and skill-marketplace system, while the actual behavior includes direct credential/session handling through browser cookie extraction and persistent login flows. That mismatch hides a materially more sensitive trust boundary: access to local authenticated sessions, which can enable account access on third-party sites.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**IMPORTANT: Always use the CLI (`bun src/cli.ts`). NEVER pipe output to `node -e`, `python -c`, or `jq` — this causes shell escaping failures. Use `--path`, `-

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**IMPORTANT: Always use the CLI (`bun src/cli.ts`). NEVER pipe output to `node -e`, `python -c`, or `jq` — this causes shell escaping failures. Use `--path`, `-

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**IMPORTANT: Always use the CLI (`bun src/cli.ts`). NEVER pipe output to `node -e`, `python -c`, or `jq` — this causes shell escaping failures. Use `--path`, `-

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**IMPORTANT: Always use the CLI (`bun src/cli.ts`). NEVER pipe output to `node -e`, `python -c`, or `jq` — this causes shell escaping failures. Use `--path`, `-

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**IMPORTANT: Always use the CLI (`bun src/cli.ts`). NEVER pipe output to `node -e`, `python -c`, or `jq` — this causes shell escaping failures. Use `--path`, `-

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**IMPORTANT: Always use the CLI (`bun src/cli.ts`). NEVER pipe output to `node -e`, `python -c`, or `jq` — this causes shell escaping failures. Use `--path`, `-

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**IMPORTANT: Always use the CLI (`bun src/cli.ts`). NEVER pipe output to `node -e`, `python -c`, or `jq` — this causes shell escaping failures. Use `--path`, `-

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**IMPORTANT: Always use the CLI (`bun src/cli.ts`). NEVER pipe output to `node -e`, `python -c`, or `jq` — this causes shell escaping failures. Use `--path`, `-

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**IMPORTANT: Always use the CLI (`bun src/cli.ts`). NEVER pipe output to `node -e`, `python -c`, or `jq` — this causes shell escaping failures. Use `--path`, `-

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**IMPORTANT: Always use the CLI (`bun src/cli.ts`). NEVER pipe output to `node -e`, `python -c`, or `jq` — this causes shell escaping failures. Use `--path`, `-

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**IMPORTANT: Always use the CLI (`bun src/cli.ts`). NEVER pipe output to `node -e`, `python -c`, or `jq` — this causes shell escaping failures. Use `--path`, `-