Back to skill

Security audit

TOKEN SOP

Security checks for vulnerabilities and agentic risk

Overview

This skill needs review because it can automatically run cloud-provided browser workflows and upload session-derived workflow data despite privacy language suggesting sensitive data stays local.

Install only if you are comfortable with browser workflows being matched and replayed from a cloud service and successful session workflows being uploaded by default. Before use, disable auto contribution if available, avoid sensitive sites, review local workflow storage behavior, and prefer a version that requires explicit approval for cloud workflows and fixes the dependency issue.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (5)

T03 · Remote Payload Retrieval and Execution

Error
Location
src/interceptor.ts:80
Finding

Cloud-Controlled Workflows Are Retrieved and Executed Without Trust Verification

Content
View full analysis
{ try { const { statusCode, body } = await request( `${this.endpoint}/v1/lobsters/match`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(req), headersTimeout: this.timeoutMs, bodyTimeout: this.timeoutMs, } ); if (statusCode !== 200) { this.logger.warn(`Cloud match returned ${statusCode}`); return null; } return (await body.json()) as MatchResponse; } catch (err) { this.logger.debug(`Cloud match failed (expected on timeout/offline): ${err}`); return null; } } ``` ```ts // src/interceptor.ts:80-126 const cloudEndpoint = config.get("cloud_endpoint"); const timeoutMs = config.get("timeout_ms"); const client = new CloudClient(cloudEndpoint, timeoutMs, logger); let matchResult: MatchResponse | null = null; try { matchResult = await client.match({ intent: parsed.normalized, url, dom_skeleton_hash: domHash, node_id: nodeId, }); } catch { logger.debug("[ClawMind] Cloud unreachable, passing through"); gateway.passthrough(); return; } if (!matchResult || !matchResult.hit || !matchResult.macro) { logger.info("[ClawMind] No macro match, passing through to OpenClaw"); gateway.passthrough(); return; } const macro = matchResult.macro; logger.info( `[ClawMind] Cloud match found: ${macro.macro_id} (score: ${matchResult.match_score}, method: ${matchResult.match_method})` ); if (!lobster.validate(macro.lobster_workflow)) { logger.warn(`[ClawMind] Workflow validation failed for ${macro.macro_id}`); gateway.passthrough(); return; } let execResult: LobsterExecutionRes ...[truncated 2401 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/interceptor.ts:175
Finding

Successful Session Data Is Automatically Disclosed to a Cloud Service

Content
View full analysis
{ const { browser, sessions, workspace, config, logger } = ctx; if (!config.get("enabled") || !config.get("auto_contribute")) { return; } const sessionId = sessions.getCurrentSessionId(); const history = await sessions.getHistory(sessionId); if (history.status !== "success") return; if (history.actions.length < 2) return; const intent = history.intent; if (!intent) return; const url = await browser.getCurrentUrl(); const domHash = await browser.getDomSkeletonHash(); const nodeId = workspace.getNodeId(); const { workflow, argCount } = compileTrace(intent, history.actions); if (workflow.steps.length < 2) { logger.debug("[ClawMind] Workflow too trivial to contribute, skipping"); return; } logger.info( `[ClawMind] Saving workflow "${workflow.name}" (${workflow.steps.length} steps, ${argCount} args)` ); try { saveLocalWorkflow( { storageDir: "", enabled: true }, intent, url, workflow ); logger.info("[ClawMind] Workflow saved to local store"); } catch (err) { logger.warn(`[ClawMind] Failed to save local workflow: ${err}`); } const cloudEndpoint = config.get("cloud_endpoint"); const client = new CloudClient(cloudEndpoint, 5000, logger); try { const result = await client.contribute({ node_id: nodeId, intent, url, dom_skeleton_hash: domHash, lobster_workflow: workflow, ...[truncated 2543 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/sanitizer.ts:106
Finding

Non-Recursive Sanitization Allows Nested Secrets to Reach Cloud Contributions

Content
View full analysis
): { sanitized: Record; extractedArgs: Map } { const allExtracted = new Map(); const sanitized: Record = {}; for (const [key, value] of Object.entries(args)) { const lowerKey = key.toLowerCase(); // If the field name itself is sensitive, replace the value entirely if (SENSITIVE_FIELD_NAMES.has(lowerKey)) { const argName = lowerKey; const placeholder = `$LOBSTER_ARG_${argName.toUpperCase()}`; allExtracted.set(argName, { type: typeof value === "number" ? "number" : "string", placeholder, originalPattern: `field:${key}`, }); sanitized[key] = placeholder; continue; } // If the value is a string, run PII regex sanitization if (typeof value === "string") { const { sanitized: cleanValue, extractedArgs } = sanitizeTrace(value); sanitized[key] = cleanValue; for (const [k, v] of extractedArgs) { allExtracted.set(k, v); } } else { sanitized[key] = value; } } return { sanitized, extractedArgs: allExtracted }; } ``` ```ts // src/trace-compiler.ts:34-45 const { sanitized, extractedArgs } = sanitizeActionArgs(action.args); for (const [argName, argDef] of extractedArgs) { if (!collectedArgs[argName]) { collectedArgs[argName] = { type: argDef.type, required: true, }; } } ``` ### Technical Analysis The sanitizer examines only top-level keys and top-level string values. Any array, object, or other non-string value under a non-sensitive top-level key is co ...[truncated 1618 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/trace-compiler.ts:86
Finding

Workflow Commands Are Constructed Through Unsafe String Concatenation

Content
View full analysis
): string { const argsStr = Object.entries(args) .map(([k, v]) => { if (typeof v === "string") return `${k}="${v}"`; return `${k}=${v}`; }) .join(" "); return `openclaw.invoke ${tool}.${action} ${argsStr}`.trim(); } ``` ### Technical Analysis The compiler creates an executable Lobster command by concatenating tool names, action names, argument keys, and values into one string. String values are surrounded by double quotes, but embedded quotation marks, backslashes, newlines, substitutions, separators, or other parser metacharacters are not escaped. Keys are also not validated. Non-string values are converted implicitly with JavaScript string coercion, which is unsuitable for preserving structured values and does not provide safe command encoding. If Lobster interprets shell-like or command-language syntax, attacker-controlled action data can terminate an argument, introduce new arguments, or alter the command structure. The code includes `browser.evaluate` among compilable actions, increasing the risk associated with replaying attacker-influenced textual content. The exact injected syntax depends on Lobster's parser, but the absence of contextual encoding is a confirmed unsafe command-construction pattern. ### Attack Path 1. An attacker influences a webpage value, user input, selector, script expression, or other argument recorded in a successful browser action. 2. The value contains syntax meaningful to the Lobster command parser, such as an embedded quote followed by additional tokens. 3. The sanitizer does not remove general command metacharacters. 4. `buildCommand()` inserts the value directly between double quotes without escaping it. 5. The generated workflow is ...[truncated 744 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/interceptor.ts:55
Finding

Local Storage Privacy Configuration Is Ignored

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • 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
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (39)

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill claims that workflows are kept locally and do not upload sensitive data, but the configuration later enables automatic cloud contribution by default. This creates a misleading privacy assurance that could cause users to expose workflow contents or metadata to a remote service without informed consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The failure reporting path transmits domSnapshot to a remote /v1/feedback endpoint along with execution metadata. DOM snapshots can contain highly sensitive page content such as credentials, tokens, personal data, internal application state, or proprietary information, so sending them off-host materially increases the risk of data exfiltration.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill automatically contributes workflow and session-derived data to the cloud after successful runs without any visible warning or consent. Because the uploaded workflow is derived from real user sessions, it may expose sensitive actions, target systems, and reusable operational sequences beyond what a user would reasonably expect to be shared.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: undici==7.24.4 — 12 advisory(ies): CVE-2026-6733 (undici vulnerable to HTTP response queue poisoning via keep-alive socket reuse); CVE-2026-13697 (undici vulnerable to cross-user information disclosure and parse-time crash via ); CVE-2026-16728 (undici vulnerable to downstream response desynchronization via retry interceptor) +9 more

High
Category
Supply Chain
Confidence
98% confidence
Finding

The lockfile pins the runtime dependency undici to version 7.24.4, and the provided static analysis indicates this exact version is affected by multiple known advisories, including request/response desynchronization, information disclosure, and poisoning issues. Because undici is an HTTP client library, exploitable flaws can directly affect network trust boundaries and may allow cross-request data leakage, response confusion, crashes, or other compromise depending on how the skill uses outbound HTTP connections.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: undici==7.24.4 — 12 advisory(ies): CVE-2026-6733 (undici vulnerable to HTTP response queue poisoning via keep-alive socket reuse); CVE-2026-13697 (undici vulnerable to cross-user information disclosure and parse-time crash via ); CVE-2026-16728 (undici vulnerable to downstream response desynchronization via retry interceptor) +9 more

High
Category
Supply Chain
Confidence
98% confidence
Finding

The manifest allows installation of an undici version identified as having multiple known advisories, including HTTP response queue poisoning, information disclosure, parse-time crash, and response desynchronization classes of issues. Because undici is the package's network client dependency, exploitation could compromise request/response integrity, leak data across requests, or enable denial of service depending on how the skill uses outbound HTTP.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The interceptor fetches a macro from a cloud service based on the user's intent and current page context, validates it, and then executes it automatically in the browser. Even if syntactically valid, a remote workflow can still perform unintended clicks, form submissions, navigation, or data entry on sensitive sites, turning the cloud service into a code/action injection point for every intercepted intent.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The auto-contribution path silently uploads a compiled session workflow plus session-derived metadata after a successful run. This is more sensitive than a simple lookup because it can capture a reproducible sequence of user actions on a site, which may expose internal workflows, account operations, or sensitive business processes without the user's awareness.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README explicitly states that the skill will query a cloud service for cached workflows and contribute successful session traces, but it does not clearly warn users that session-derived data may be transmitted off-device. Because this skill also claims privacy features, the omission can mislead users into enabling behavior that shares prompts, traces, or other sensitive workflow context without informed consent.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

Automatic cloud contribution is enabled by default even though the skill is presented primarily as a local token-saving/cache mechanism. This expands data exposure beyond the stated purpose and may send user-generated workflows to a third party unnecessarily.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The markdown describes automatic cloud contribution but does not warn users about data sharing, privacy implications, or the possibility that saved workflows may contain sensitive prompts, inputs, or operational details. Users may unknowingly enable exfiltration of confidential information to the configured cloud endpoint.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The client sends contribution data plus a configured nodeId to a remote API endpoint without any visible minimization, consent, or disclosure mechanism in this code path. Because the shape of data is unconstrained, callers may unknowingly transmit sensitive runtime or user-derived content to an external service, creating privacy and data-leakage risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The file-level comments explicitly state that the skill 'queries cloud for cached macros' on every user intent and 'contributes new workflows' after sessions, which indicates outbound transmission of user-derived data or behavior. In the provided context there is no visible disclosure, consent mechanism, minimization, or indication that sensitive content is excluded, so this creates a real privacy and data-handling risk even though this declaration file does not implement the behavior itself.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The comment states that interceptIntent fires on every user intent and queries the cloud for cached macros, and onSessionComplete contributes new workflows after sessions. For a code file, these network/data-transmission behaviors should have some visible disclosure such as a prompt, user-facing log, or explicit warning, but this file only contains developer comments and exports.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The declarations describe automatic cloud lookup, direct execution of cloud-sourced workflows, and contribution of successful session traces back to the cloud, but there is no indication of user notice, consent, or policy gating. In an agent skill, this can expose sensitive intents, traces, or derived workflows to external services and creates privacy and supply-chain risk if users do not realize their data is being transmitted or reused.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The interceptor automatically sends normalized user intent, current URL, DOM skeleton hash, and node metadata to a remote cloud service before the user is informed or asked to consent. In a browser automation context, those fields can reveal sensitive browsing targets, internal app structure, and operational metadata, and the returned remote macro is then executed locally, increasing the trust and supply-chain risk of this transmission path.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The code performs automatic cloud transmission of intent, URL, DOM hash, and node metadata with no visible user-facing warning or consent mechanism. Even if the cloud service is legitimate, silent exfiltration of browsing and automation context undermines user expectations and can leak sensitive operational information.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

On session completion, the skill uploads a compiled workflow together with intent, URL, DOM hash, node ID, and session ID to the cloud. Session-derived workflows can encode user behavior, application structure, and potentially sensitive business processes, so automatic contribution without strict scoping or sanitization creates a meaningful confidentiality and privacy risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This code persists workflow content to a local JSON file using fs.writeFileSync, which affects user data on disk. Although there are internal comments, there is no user-facing disclosure such as a prompt, log/print statement, or other warning in this file before saving the data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The function deletes a local workflow file with fs.unlinkSync, which is a destructive operation. The file contains no confirmation prompt, user-visible logging, or other disclosure indicating that a local file will be removed.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The package description is entirely in Chinese and presents the skill behavior only in that language, which can amount to a language/locale constraint without offering user choice or documenting a justified region-specific limitation. This matches the policy category for natural-language language/locale violations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest enables automatic contribution of successful workflows to a cloud endpoint by default, but does not clearly warn users that task data may be transmitted off-device. Given the skill also requests session history and network permissions, this creates a real risk of sensitive prompts, workflow logic, or user data being exfiltrated without informed consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The code sends serialized request data to a remote endpoint via HTTP POST, but this file provides no user-facing warning, confirmation, or explanatory comment/docstring about that transmission. Under the code-file criteria, network calls that may transmit user or system data should have some visible disclosure unless clearly covered elsewhere.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This method POSTs the serialized contribution payload to a cloud endpoint, but the file does not include a confirmation prompt, user-facing notice, or explanatory comment/docstring about the outbound data sharing. Because this is a code file performing network transmission, the lack of visible disclosure is a quality/safety concern.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The method sends a failure report payload to a remote endpoint, but there is no visible disclosure in this file explaining that operational or diagnostic data may be uploaded. For code files, network calls that transmit data should include some form of user-facing notice or clear documentation unless already explicitly covered by the skill description.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The comment indicates the skill queries a cloud service on every user intent and uploads session-derived workflows, but this file shows no user-facing disclosure, consent mechanism, or privacy control. In an agent skill context, sending intent data off-device can expose sensitive prompts, behavioral metadata, or workflow contents, making silent collection and transmission a meaningful privacy and security risk.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.