Back to skill

Security audit

Openclaw Ticket Assistant

Security checks for vulnerabilities and agentic risk

Overview

The skill has a coherent ticket-creation purpose, but it deserves review because it bundles sensitive customer identifiers and automates internal login/browser actions with limited transparency.

Review before installing in any real support environment. Use it only with least-privilege ticket-system access, confirm extracted customer and UID details carefully before submission, avoid screenshots containing unnecessary sensitive data, and replace the bundled customer directory with an authenticated lookup or a minimized local dataset where possible.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
resources/customers.json:9
Finding
Plaintext Customer Account Identifiers and Internal UIDs Bundled with the Skill## Vulnerability Details **File Location**: `resources/customers.json:9-81` **Vulnerability Type**: Plaintext sensitive customer data exposure **Risk Level**: Medium The packaged customer directory contains customer names, account identifiers, email addresses, telephone-like identifiers, and internal UIDs in plaintext. Representative records include: ```json {"name": "常熟农商行", "account": "13773065254", "id": "1087161152501898", "alias": ["常熟农商银行"]} {"name": "新网银行", "account": "dis.baicheng@gmail.com", "id": "1816018802153306"} {"name": "友邦", "account": "android-code@qq.com", "id": "1442504043238288", "alias": ["友邦保险"]} ``` ### Technical Analysis The complete production customer mapping is distributed as a static resource. Anyone with access to the Skill package can read the file without authenticating to the internal ticket system. The records expose relationships between customer organizations, support account names, and internal ticket UIDs. Although these values are used for customer matching and no automatic exfiltration mechanism was found, storing the entire directory locally violates data-minimization principles. Some account fields are formatted as personal telephone numbers or email addresses and may constitute personal or operationally sensitive information. ### Attack Path 1. An attacker obtains read access to the distributed Skill package or an installation directory containing it. 2. The attacker opens `resources/customers.json`; no decryption or authentication is required. 3. The attacker extracts customer names, account identifiers, aliases, and internal UIDs. 4. The extracted mappings are used for customer enumeration, targeted phishing, social engineering, or attempts to impersonate a customer in related support workflows. 5. If the attacker separately has access to the internal ticket system, the exposed UIDs may assist in selecting or submitting records under a targeted customer identity. ### Impact ...[truncated 519 chars]
Remediation
## Remediation Suggestions 1. Remove the production customer directory from the distributable Skill package. 2. Resolve customer records through an authenticated internal service that enforces user- and role-level authorization. 3. Return only the minimum fields required for the current ticket rather than the complete customer dataset. 4. Replace personal telephone numbers and email addresses with non-personal, purpose-specific customer identifiers where possible. 5. Encrypt sensitive cached data at rest and ensure encryption keys are not bundled with the Skill. 6. Apply restrictive file permissions if a local cache is operationally unavoidable. 7. Define retention and deletion policies for cached customer records. 8. Audit access to customer lookups and alert on bulk enumeration. 9. Review whether the disclosed UIDs are accepted as authorization signals elsewhere; if they are, replace that design with server-side authorization checks.

T09 · Insecure Skill Coding Practices

Warning
Location
resources/customers.json:25
Finding
Ambiguous and Incomplete Customer Mappings Can Misroute Tickets## Vulnerability Details **File Location**: `resources/customers.json:25-26,64-67`; matching behavior is defined in `SKILL.md:31-35` **Vulnerability Type**: Ambiguous identity mapping and missing identifier validation **Risk Level**: Medium The highest-priority account key is assigned to two different customers, and one of those records has no UID: ```json {"name": "中国人寿", "account": "chinalifempaas", "id": "1329786245830469", "alias": ["国寿", "人寿"]}, {"name": "建行", "account": "chinalifempaas", "id": "", "alias": ["建设银行", "中国建设银行"]}, ``` The same customer name also maps to two different accounts and UIDs: ```json {"name": "四川农信", "account": "scnx_zyy", "id": "1986787439439302"}, {"name": "山西农信", "account": "shanxinx", "id": "1767375253718590"}, {"name": "贵阳银行", "account": "guiyangbank", "id": "1019135950211321", "alias": ["贵阳银行总行"]}, {"name": "四川农信", "account": "scbank202005", "id": "1851888751958632"}, ``` The matching instructions prioritize account matching: ```markdown 1. **账号名匹配**:在截图中查找与 `account` 字段完全匹配或包含的文本 2. **客户名称匹配**:在截图中查找与 `name` 字段匹配的文本 3. **别名匹配**:在截图中查找与 `alias` 数组中任意值匹配的文本 ``` ### Technical Analysis Customer identity is used to obtain the UID entered into the ticket form. However, the dataset does not enforce uniqueness or completeness: - `chinalifempaas` maps to two different customer names. - One conflicting record has an empty required UID. - `四川农信` maps to two distinct account and UID pairs. - Several additional records contain empty account or UID fields. - The workflow does not define deterministic collision handling or mandatory rejection of incomplete records. Because account matching has the highest priority, a screenshot containing the shared account value can produce multiple valid candidates. Name-based matching can similarly produce multiple UIDs. User confirmation before submission reduces the likelihood of exploitation but does not guarantee that the underlying U ...[truncated 1359 chars]
Remediation
## Remediation Suggestions 1. Enforce schema validation before the customer directory is accepted: - Every ticketable customer must have a non-empty UID. - Account identifiers must be unique unless an explicit one-to-many relationship is defined. - Canonical customer names must map deterministically to one customer entity. 2. Reject ambiguous matches instead of selecting the first or most plausible record. 3. Present all conflicting candidates to the user and require explicit selection. 4. Display both the customer name and masked UID during pre-submission confirmation. 5. Add a server-side verification step that confirms the selected UID belongs to the selected customer. 6. Normalize aliases, account names, casing, and whitespace before matching. 7. Do not treat an empty account string as a match candidate. 8. Prevent ticket submission when the UID is missing, malformed, or inconsistent with the selected customer. 9. Add automated tests and CI validation for duplicate accounts, duplicate names with conflicting UIDs, empty required fields, and alias collisions. 10. Resolve the existing duplicate records and document whether the two entries represent separate environments or an obsolete mapping.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (7)

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The skill is designed to process customer-service chat screenshots, which commonly contain personal, customer, and business-sensitive data, and then automate actions in an internal ticketing system. Without prominent warnings and handling guidance, users may unknowingly expose sensitive information or trigger automated actions with side effects such as creating inaccurate tickets, leaking data into logs, or interacting with privileged internal systems.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The trigger phrases are generic enough that ordinary user requests like '帮我创建一个工单' or references to screenshots could unintentionally invoke the skill. Because the skill performs downstream browser automation and ticket creation, ambiguous invocation boundaries increase the risk of accidental execution and unintended submission of sensitive or incorrect customer data.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The trigger phrases include very broad everyday terms such as “工单” and “创建工单”, which can cause the skill to activate in contexts where the user did not clearly intend browser automation or ticket creation. Because this skill performs sensitive actions based on screenshot analysis and may navigate to an internal workbench, accidental invocation increases the chance of unintended data processing or unintended initiation of ticket workflows.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The skill explicitly instructs the agent to keep execution silent and not reveal intermediate steps while handling screenshots, reading local reference files, checking login state, and operating a browser in an internal ticket system. This reduction in transparency is dangerous because it can hide sensitive data handling and security-relevant actions from the user, making unintended navigation, data extraction, or form filling harder for the user to detect before the final confirmation step.

Description-Behavior Mismatch

Medium
Confidence
91% confidence
Finding
The skill’s stated purpose is ticket analysis/creation from customer service screenshots, but this guide expands behavior into domain-account login assistance and post-login account harvesting. That scope expansion is dangerous because it enables the agent to participate in authentication workflows and collect identity data unrelated to the minimally necessary function, increasing the attack surface for account misuse or unintended access.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The guide explicitly instructs the agent to extract and save the currently logged-in account for later autofilling of the ticket 'assignee/handler' field, but provides no user-facing disclosure, consent, retention rule, or minimization boundary. Persisting account identity from an authentication session creates privacy and integrity risk: the data can be reused inappropriately, exposed to other workflows, or cause tickets to be created/assigned under the wrong identity.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The description is written to require use in a Chinese-language context ("客户列表,用于根据截图识别客户来源") without offering any language or locale choice. Under the policy, forcing a specific language or locale without user opt-in should be flagged unless the regional constraint is clearly documented and justified.

Static analysis

No suspicious patterns detected.