Back to skill

Security audit

Openclaw Skill

Security checks for vulnerabilities and agentic risk

Overview

The skill’s family-office purpose is coherent, but it handles very sensitive data with broad activation wording and includes an unsafe maintainer publishing script.

Review before installing if this will touch real family, legal, financial, or contact records. Prefer explicit invocation over broad automatic triggers, confirm before revealing dashboards or changing tasks, and do not run publish.sh with untrusted version or changelog values until the eval-based publishing command is fixed.

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 (1)

T09 · Insecure Skill Coding Practices

Error
Location
publish.sh:28
Finding
Shell Command Injection in the Publishing Script## Vulnerability Details **File Location**: `publish.sh`, lines 28-29 and 87-92 **Vulnerability Type**: Shell command injection through unsafe use of `eval` **Risk Level**: High ### Vulnerable Code ```bash VERSION=${1:-$(jq -r '.version' skill.json)} CHANGELOG=${2:-"See CHANGELOG.md for details"} ``` ```bash PUBLISH_CMD="clawhub publish $SCRIPT_DIR --slug family-steward --version $VERSION --changelog \"$CHANGELOG\"" echo " Command: $PUBLISH_CMD" echo "" if eval "$PUBLISH_CMD"; then ``` ### Technical Analysis The script accepts `VERSION` and `CHANGELOG` from its first and second positional arguments. It interpolates these values into a command string and executes that string with `eval`. Unlike direct command invocation, `eval` causes the fully constructed string to be parsed again by the shell. Consequently, shell syntax embedded in either user-controlled argument—including command separators, redirections, pipelines, or command substitutions—can be interpreted as executable syntax rather than as literal argument data. Quoting `$CHANGELOG` inside the constructed string is insufficient because an attacker can inject quotation marks or other shell syntax that changes the command structure during the second parsing pass. `$VERSION` is interpolated without even attempted quoting. ### Attack Path 1. An attacker supplies or persuades a maintainer to use a crafted version or changelog argument. 2. The maintainer runs `publish.sh` in the project directory. 3. The script assigns the attacker-controlled value to `VERSION` or `CHANGELOG`. 4. The value is inserted into `PUBLISH_CMD`. 5. `eval "$PUBLISH_CMD"` reparses the resulting text as shell code. 6. The injected shell command executes under the maintainer's operating-system account. For example, a malicious version argument can introduce a command separator followed by an arbitrary command. The precise payload does not require modification of the script or the project metadata. ### Impact Assessment Suc ...[truncated 862 chars]
Remediation
## Remediation Suggestions Remove the command string and `eval`. Invoke `clawhub` directly, passing each value as a separately quoted argument: ```bash if clawhub publish "$SCRIPT_DIR" \ --slug family-steward \ --version "$VERSION" \ --changelog "$CHANGELOG"; then echo "" echo -e "${GREEN}✅ Successfully published to ClawHub!${NC}" else echo "" echo -e "${RED}❌ Publishing failed${NC}" exit 1 fi ``` Apply a strict allowlist to the version argument before invoking the publishing command. For example: ```bash if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+([+-][0-9A-Za-z.-]+)?$ ]]; then echo "Invalid semantic version" >&2 exit 1 fi ``` Additional hardening measures: 1. Treat changelog content exclusively as data and never pass it through `eval`, `bash -c`, or another shell interpreter. 2. Avoid printing sensitive command-line content if future changelogs or options could contain confidential information. 3. Run publication from a minimally privileged account with narrowly scoped ClawHub credentials. 4. Add regression tests using arguments containing spaces, quotation marks, semicolons, command substitutions, and redirection operators to confirm they remain literal data. 5. Refactor the generic `eval` use in `validate.sh` as defense in depth, even though the currently observed callers use fixed internal command strings.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (11)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
This finding indicates the skill claims to manage family members, contacts, documents, and tasks, but instead appears to validate packaging, inspect local and parent-directory files, and verify publish metadata. For a skill positioned around confidential UHNW family data, hidden filesystem inspection is especially risky because it may expose unrelated local secrets, credentials, or sensitive documents without user expectation.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
This finding indicates the skill claims to manage family members, contacts, documents, and tasks, but instead appears to validate packaging, inspect local and parent-directory files, and verify publish metadata. For a skill positioned around confidential UHNW family data, hidden filesystem inspection is especially risky because it may expose unrelated local secrets, credentials, or sensitive documents without user expectation.

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Content
---
name: Family Steward
description: AI-powered family office management system for ultra-high-net-worth families - manage family members, professional contacts, legal documents, and tasks with natural language
version: 1.0.0
homepage: https://github.com/ZhenRobotics/openclaw-family-steward
metadata: {"clawdbot":{"emoji":"🏰","tags":["family-office","wealth-management","crm","document-management","task-management","uhnw","family-governance","enterprise","contact-network","legal-documents"],"requires":{"bins":["node"],"env":[],"config":[]},"install":["npm install"],"os":["darwin","linux","win32"]}}
---

# Family Ste
Confidence
80% confidence
Finding
YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Vague Triggers

Medium
Confidence
97% confidence
Finding
The documented auto-trigger behavior uses very broad keywords such as 'family', 'contact', 'document', and 'task', which are common in ordinary conversations and likely to cause unintended activation. In a skill handling sensitive family-office data, accidental invocation can expose private summaries or enable actions in the wrong conversational context, increasing confidentiality and integrity risk.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill advertises operational capabilities through embedded code examples and install metadata but does not declare an explicit tool scope such as allowed-tools or permissions. In an agent environment, undeclared shell-capable behavior increases the risk of over-broad execution, unexpected command use, and weak reviewability, especially for a skill handling highly sensitive family-office data.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The manifest advertises management of highly sensitive personal, legal, financial, and contact data for ultra-high-net-worth families, but it does not include any explicit warning, consent language, or handling guidance about private data. In this context, omission increases the risk that users or integrating agents will process, expose, or share confidential records without understanding the sensitivity or applying stronger safeguards.

Natural-Language Policy Violations

Low
Confidence
89% confidence
Finding
The skill includes hard-coded example queries using Chinese characters, such as searching family members with "张". Because the file does not state that this is a China-specific or Chinese-language-only skill, these examples can imply a fixed language/locale expectation without user opt-in.

Natural-Language Policy Violations

Low
Confidence
87% confidence
Finding
The contact search example uses the Chinese term "律师" with no accompanying statement that the skill is designed for Chinese-language operation. Repeated language-specific examples across the skill can create an implicit policy of a fixed language without opt-in.

Natural-Language Policy Violations

Low
Confidence
86% confidence
Finding
The document search example uses the Chinese term "信托" while the rest of the skill does not explain any locale limitation or ask the user for a preferred language. This can be read as imposing a language convention rather than offering a choice.

Natural-Language Policy Violations

Low
Confidence
85% confidence
Finding
The task search example includes the Chinese word "会议" but the skill does not provide language selection guidance or justify a locale-specific scope. This creates a mild natural-language policy concern because the examples suggest an assumed language.

Natural-Language Policy Violations

Low
Confidence
77% confidence
Finding
The manifest presents the display name only in Chinese while the rest of the metadata is in English, with no indication that the language choice is optional or region-specific. This can constitute a language/locale policy issue because the skill surface appears to impose a locale-specific presentation without documented user opt-in or justification.

Static analysis

No suspicious patterns detected.