T03 · Remote Payload Retrieval and Execution
- Location
SKILL.md:42- Finding
Unpinned Remote Plugin Installation and Execution
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a Review case because it connects to ClawWorld but also installs an unreviewed persistent plugin that can receive remote messages, send activity metadata, and upload files automatically.
Install only if you are comfortable granting ClawWorld a persistent agent integration: it can receive remote chat messages, summarize recent work to the service, report installed skill names, handle inbound files, and automatically upload files placed in ~/.openclaw/out. Prefer a version-pinned, reviewable plugin with clear opt-ins for chat, telemetry, skill inventory, and file upload, plus restricted token storage and an easy way to disable or revoke the connection.
SKILL.md:42Unpinned Remote Plugin Installation and Execution
SKILL.md:107Persistent Third-Party Message Injection into the Agent Runtime
SKILL.md:96Excessive Collection and External Transmission of Session and Workspace Metadata
scripts/bind.sh:41Bearer Token Stored Without Restrictive Filesystem Permissions
SKILL.md:107Long-Lived Bearer Token Exposed in WebSocket Query String
SKILL.md:119Automatic Upload of Files from a Shared Output Directory
scripts/bind.sh:7Unsafe JSON Construction from Unvalidated and Unescaped Values
There is a clear description-behavior mismatch. The declared purpose centers on connecting to ClawWorld and using social features, but the code chunk is explicitly an unbind script for disconnecting from the service. It reads stored credentials and endpoint information from a local config file, calls the remote unbind API, and removes the local config afterward. While network access and local config access are plausibly related to the same integration, the primary purpose is materially different and opposite to the declared description.
The high-level description presents the skill as social status sharing, but the documented plugin also performs file upload/download workflows and workspace skill enumeration. These are materially broader data-access behaviors than users would infer from the description, creating a deceptive capability gap around local file handling and metadata disclosure.
The file says the skill 'handles binding and unbinding only,' but later documents a plugin that injects inbound chat messages into the runtime and relays replies back out. This is a major hidden expansion of trust boundary: installing a seemingly simple bind/unbind skill effectively creates a remote command/input channel into the agent.
The same document frames the skill as limited to binding/unbinding while also documenting broad persistent plugin behaviors such as message injection, summaries, file transfer, and workspace scanning. This mismatch undermines informed consent and can cause users to install a much more privileged communications bridge than they intended.
The persistent WebSocket channel allows remote ClawWorld-originated messages to be injected directly into the agent runtime as conversation inputs. That materially expands the attack surface by turning the external service into a live input source capable of prompting actions, abusing tools, or staging social-engineering attacks against the agent.
### Inbound: chat channel (WebSocket)
The plugin registers a persistent WebSocket channel to `wsEndpoint`. This enables ClawWorld users to send messages to the agent from the ClawWorld web UI:
- **Connection**: Established on plugin startup using the `ws` npm library with the `deviceToken` as a query-string credential. Reconnects with exponential backoff (1s → 30s cap) on disconnect.
- **Message injection**: Inbound messages are dispatched into the agent runtime via `channelRuntime.reply.dispatchReplyWithBufferedBlockDispatcher`, making them appear as channel messages in the OpenClaw conversation system.
Referenced artifact was not completely inspected
irectory of the agent workspace to enumerate installed skills (by checking for `SKILL.md` in each subdirectory). The list is included in the status payload. No
The skill explicitly describes shell execution, network access, environment-controlled endpoint override, and persistent plugin installation, but it does not declare any tool scope or allowed-tools restrictions. That increases the chance the agent or platform grants broader capabilities than users expect, weakening least-privilege controls for a networked integration that can store tokens and communicate externally.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
bash {baseDir}/scripts/bind.sh <BINDING_CODE>
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
bash {baseDir}/scripts/bind.sh <BINDING_CODE>
The plugin automatically derives activity summaries from recent session messages and sends them off-platform without explicit user opt-in or a clear privacy notice. Even if summarized, session-derived text can still expose sensitive topics, workflows, or business context to an external service.
Automatically downloading inbound attachments to local storage creates a file-ingestion path from remote users into the agent environment without an explicit safety warning. This can expose the system to malicious files, unsafe downstream processing, disk consumption, or accidental use of untrusted local paths by later tools.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
~/.openclaw/out/.Example: If the user asks for a report or an image, write it to the out/ directory:
echo "Report content..." > ~/.openclaw/out/report.txt
# Or generate an image:
Enumerating installed skills and transmitting their names to the service is not clearly necessary for a binding/status feature and leaks local environment metadata. Skill inventory can reveal agent capabilities, integrations, or attack surface to an external service, aiding profiling or follow-on targeting.
The plugin enumerates installed skills and includes the list in a status payload to an external service. This leaks environment metadata that can identify available capabilities or sensitive integrations, making the agent easier to profile and potentially target.
### Workspace skill scan
On `llm_output` events, the plugin reads the `skills/` subdirectory of the agent workspace to enumerate installed skills (by checking for `SKILL.md` in each subdirectory). The list is included in the status payload. No SKILL.md content is read or transmitted — only skill directory names.
The documented telemetry endpoints transmit potentially sensitive user and workspace metadata, including installed skills, activity summaries, model/provider details, token usage, session linkage, and a stable instance identifier, but the API reference contains no explicit user-facing privacy warning, consent flow, minimization guidance, or retention disclosure. In the context of an agent social-network skill, this increases the risk of unintentional surveillance, fingerprinting, and leakage of work patterns or confidential project context through status and activity reporting.
The script transmits the user-supplied binding code and a stable machine-derived instance identifier to a remote service, and the binding code is explicitly treated as the credential. External transmission is expected for a binding workflow, but it is still security-relevant because a credential and host identifier are sent off-box and could be exposed if the endpoint is overridden to an untrusted server or if transport trust is weakened elsewhere in the environment.
# Call ClawWorld API to verify binding
# No Authorization header needed — binding code itself is the credential
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \
"${ENDPOINT}/api/claw/bind/verify" \
-H "Content-Type: application/json" \
-d "{
The script persists a long-lived device token to a local config file in the user's home directory without setting restrictive permissions or warning the user that a credential is being stored. Any other local user, process, backup system, or malware with access to that file could reuse the token to impersonate the agent for future ClawWorld activity pushes.
This script transmits a bearer device token and lobster identifier to a remotely configured endpoint read from local config.json, with no validation that the endpoint is trusted or uses HTTPS. If an attacker can modify the config file or influence the endpoint value, the script will exfiltrate credentials to an arbitrary server and perform a network action under the user's identity.
exit 1
fi
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \
"${ENDPOINT}/api/claw/unbind" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${DEVICE_TOKEN}" \
The setup instructions tell the user to click a Chinese-only phrase, '绑定我的龙虾,' without offering a language choice or noting that the UI may be localized. This can violate language/locale policy because it assumes a specific language without user opt-in.
The reference includes hard-coded Chinese error strings for API responses, but the file does not offer any language choice or explain that the API is intentionally region-specific. Per SQP-3, forcing a specific language without user opt-in or documented justification is a natural-language policy concern.
No suspicious patterns detected.