Back to skill

Security audit

ClawSend

Security checks for vulnerabilities and agentic risk

Overview

ClawSend is a coherent messaging skill, but its relay design exposes inboxes and conversation metadata without authentication, so users should review it before trusting it with sensitive messages.

Use this only for low-sensitivity messaging unless the relay is fixed to require authenticated recipient access for receive and log endpoints. Prefer end-to-end encryption, assume metadata may still be visible to the relay, keep recipient confirmation enabled, and avoid --on-message except with a fixed script you wrote and trust. On shared machines, restrict permissions on ~/.openclaw/vault before storing meaningful message history.

Vulnerability Patterns
  • 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
  • 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
Findings (4)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
python/scripts/server.py:575
Finding

Unauthenticated Inbox Disclosure and Message Delivery Interference

Content
View full analysis
', methods=['GET']) def receive_messages(vault_id: str): """ Receive unread messages for a vault. """ limit = request.args.get('limit', 50, type=int) limit = min(limit, 100) debug = request.args.get('debug', 'false').lower() == 'true' db = get_db() now = datetime.now(timezone.utc).isoformat() rows = db.execute(''' SELECT id, sender_vault_id, message_json, signature, encrypted_payload_json, created_at FROM messages WHERE recipient_vault_id = ? AND delivered_at IS NULL AND expires_at > ? ORDER BY created_at ASC LIMIT ? ''', (vault_id, now, limit)).fetchall() messages = [] message_ids = [] for row in rows: msg_data = { 'message_id': row['id'], 'sender': row['sender_vault_id'], 'message': json.loads(row['message_json']), 'signature': row['signature'], 'received_at': now, } if row['encrypted_payload_json']: msg_data['encrypted_payload'] = json.loads( row['encrypted_payload_json'] ) messages.append(msg_data) message_ids.append(row['id']) # Mark as delivered if message_ids: placeholders = ','.join(['?' for _ in message_ids]) db.execute(f''' UPDATE messages SET delivered_at = ? WHERE id IN ({placeholders}) ''', [now] + message_ids) db.commit() return json_response({ 'messages': messages, 'count': len(messages), }) ``` ### Technical Analysis The inbox route does not use the server's `@requires_auth` decorator and performs no check that the caller controls the va ...[truncated 2029 chars]
Remediation
View remediation
`. 2. Verify that the authenticated identity matches the requested mailbox: ```python @app.route('/receive/', methods=['POST']) @requires_auth def receive_messages(vault_id): if g.vault_id != vault_id: return error_response( 'Not authorized to access this mailbox', 403, 'forbidden' ) ``` 3. Prefer deriving the mailbox exclusively from `g.vault_id` rather than accepting a public vault ID in the route. 4. Do not mark messages delivered merely because they were fetched. Use an authenticated, recipient-authorized acknowledgment operation after successful local processing. 5. If fetch-time delivery marking remains necessary, perform the selection and update atomically and bind both operations to the authenticated recipient. 6. Remove or strictly protect the `debug` response because it exposes additional mailbox metadata. 7. Add tests proving that unsigned requests and requests signed by another vault receive `401` or `403` and do not alter `delivered_at`. 8. Consider making end-to-end encryption the default, while recognizing that encryption does not replace mailbox authorization. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
python/scripts/server.py:875
Finding

Unauthenticated Disclosure of Conversation and Communication Metadata

Content
View full analysis
/log', methods=['GET']) def get_conversation_log(conversation_id: str): db = get_db() conv = db.execute( 'SELECT * FROM conversations WHERE id = ?', (conversation_id,) ).fetchone() if not conv: return error_response('Conversation not found', 404) conv_dict = dict(conv) rows = db.execute(''' SELECT id, sender_vault_id, recipient_vault_id, message_type, intent, correlation_id, created_at, delivered_at, acknowledged_at FROM messages WHERE (sender_vault_id = ? AND recipient_vault_id = ?) OR (sender_vault_id = ? AND recipient_vault_id = ?) ORDER BY created_at ASC ''', ( conv_dict['participant_a'], conv_dict['participant_b'], conv_dict['participant_b'], conv_dict['participant_a'] )).fetchall() messages = [] for row in rows: msg = dict(row) msg['direction'] = ( 'a_to_b' if msg['sender_vault_id'] == conv_dict['participant_a'] else 'b_to_a' ) msg['status'] = ( 'acknowledged' if msg['acknowledged_at'] else ('delivered' if msg['delivered_at'] else 'pending') ) messages.append(msg) return json_response({ 'conversation': conv_dict, 'messages': messages, }) @app.route('/logs/', methods=['GET']) def get_agent_logs(vault_id: str): limit = request.args.get('limit', 50, type=int) limit = min(limit, 100) db = get_db() rows = db.execute(''' SELECT * FROM conversations WHERE participant_a = ? OR participant_b = ? ORDER BY last_message_at DESC LIMIT ? ''', (vault_id, vault_id, limi ...[truncated 1949 chars]
Remediation
View remediation
` with a route that derives the identity from `g.vault_id`; do not allow callers to request arbitrary users' logs. 4. Return only metadata required by the authenticated participant. 5. Avoid exposing internal conversation and message identifiers unless needed by the client workflow. 6. Use consistent `403 Forbidden` responses for authenticated callers who are not participants. 7. Add negative authorization tests for: - Unauthenticated requests. - Requests signed by unrelated vaults. - Valid participants requesting unrelated conversations. 8. Review all remaining routes for similar missing object-level authorization. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
python/lib/vault.py:103
Finding

Sensitive Message History and Quarantine Files Rely on Process Umask

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
python/requirements.txt:1
Finding

Python Installation Uses Unbounded and Unhashed Dependencies

Content
View full analysis
=3.0 # Production WSGI server gunicorn>=21.0 # Cryptographic operations (Ed25519, X25519, AES-GCM) cryptography>=42.0 # HTTP client for scripts requests>=2.31 ``` ```bash echo "Installing Python dependencies..." cd "$SCRIPT_DIR/python" pip install -r requirements.txt ``` ### Technical Analysis Every Python dependency is specified only with a minimum version. There is no upper bound, exact version lock, artifact hash, or reviewed lockfile. As a result, installation at different times can retrieve materially different dependency versions from the configured package index. Future releases may introduce incompatible behavior, regressions, compromised artifacts, or new transitive dependencies that were not included in this audit. The installer directly invokes `pip install`, so package build and installation logic executes with the privileges of the user running the installer. No evidence of a currently malicious package name or unsafe custom package index was found; the risk arises from the lack of immutable dependency resolution. ### Attack Path 1. A user runs `install.sh`. 2. The script invokes `pip install -r requirements.txt`. 3. Pip resolves the newest available versions satisfying each `>=` constraint. 4. Pip downloads and installs packages and transitive dependencies that may differ from those reviewed during development. 5. Any compromised or unexpectedly changed eligible release executes installation or runtime code with the installing user's privileges. ### Impact Assessment Potential impact includes: - Execution of unreviewed third-party installation code. - Non-reproducible deployments. - Unexpected dependency regres ...[truncated 272 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (62)

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

The documentation describes running a relay server with public discovery, unread-count, log, and retrieval endpoints, including unauthenticated access patterns such as direct unread checks. If those endpoints are exposed as documented without proper authentication and authorization, they can leak metadata, message history, or operational visibility to unauthorized parties and undermine the claimed secure messaging model.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documentation describes running a relay server with public discovery, unread-count, log, and retrieval endpoints, including unauthenticated access patterns such as direct unread checks. If those endpoints are exposed as documented without proper authentication and authorization, they can leak metadata, message history, or operational visibility to unauthorized parties and undermine the claimed secure messaging model.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding

The documentation describes running a relay server with public discovery, unread-count, log, and retrieval endpoints, including unauthenticated access patterns such as direct unread checks. If those endpoints are exposed as documented without proper authentication and authorization, they can leak metadata, message history, or operational visibility to unauthorized parties and undermine the claimed secure messaging model.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The documentation describes running a relay server with public discovery, unread-count, log, and retrieval endpoints, including unauthenticated access patterns such as direct unread checks. If those endpoints are exposed as documented without proper authentication and authorization, they can leak metadata, message history, or operational visibility to unauthorized parties and undermine the claimed secure messaging model.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documentation describes running a relay server with public discovery, unread-count, log, and retrieval endpoints, including unauthenticated access patterns such as direct unread checks. If those endpoints are exposed as documented without proper authentication and authorization, they can leak metadata, message history, or operational visibility to unauthorized parties and undermine the claimed secure messaging model.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documentation describes running a relay server with public discovery, unread-count, log, and retrieval endpoints, including unauthenticated access patterns such as direct unread checks. If those endpoints are exposed as documented without proper authentication and authorization, they can leak metadata, message history, or operational visibility to unauthorized parties and undermine the claimed secure messaging model.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The documentation describes running a relay server with public discovery, unread-count, log, and retrieval endpoints, including unauthenticated access patterns such as direct unread checks. If those endpoints are exposed as documented without proper authentication and authorization, they can leak metadata, message history, or operational visibility to unauthorized parties and undermine the claimed secure messaging model.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documentation describes running a relay server with public discovery, unread-count, log, and retrieval endpoints, including unauthenticated access patterns such as direct unread checks. If those endpoints are exposed as documented without proper authentication and authorization, they can leak metadata, message history, or operational visibility to unauthorized parties and undermine the claimed secure messaging model.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The documentation describes running a relay server with public discovery, unread-count, log, and retrieval endpoints, including unauthenticated access patterns such as direct unread checks. If those endpoints are exposed as documented without proper authentication and authorization, they can leak metadata, message history, or operational visibility to unauthorized parties and undermine the claimed secure messaging model.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The documentation describes running a relay server with public discovery, unread-count, log, and retrieval endpoints, including unauthenticated access patterns such as direct unread checks. If those endpoints are exposed as documented without proper authentication and authorization, they can leak metadata, message history, or operational visibility to unauthorized parties and undermine the claimed secure messaging model.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The documentation describes running a relay server with public discovery, unread-count, log, and retrieval endpoints, including unauthenticated access patterns such as direct unread checks. If those endpoints are exposed as documented without proper authentication and authorization, they can leak metadata, message history, or operational visibility to unauthorized parties and undermine the claimed secure messaging model.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documentation describes running a relay server with public discovery, unread-count, log, and retrieval endpoints, including unauthenticated access patterns such as direct unread checks. If those endpoints are exposed as documented without proper authentication and authorization, they can leak metadata, message history, or operational visibility to unauthorized parties and undermine the claimed secure messaging model.

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 34)May include surrounding context.

md
pip install -r python/requirements.txt

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node node/scripts/discover.js --resolve alice

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node node/scripts/discover.js --resolve alice

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
98% confidence
Finding

This is a concrete tool-parameter abuse issue because a powerful execution primitive is exposed directly through a CLI parameter and invoked with shell=True. Within an agent skill, this is more dangerous than a typical admin utility because the tool processes untrusted relay messages and can be used in unattended polling mode, making accidental or unsafe automation much easier to weaponize.

Content

Scanner excerpt · python/scripts/receive.py (reported line 44)May include surrounding context.

python
"""
    try:
        message_json = json.dumps(message, ensure_ascii=False)
        result = subprocess.run(
            command,
            shell=True,
            input=message_json,

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The --on-message feature allows arbitrary shell commands to run automatically whenever a message arrives, creating a remote-triggered execution path once an operator enables the option. Even though the command comes from the local user, the trigger is untrusted network input, so this materially increases the blast radius of malicious or unexpected messages and can turn message delivery into code-execution automation.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The /receive/<vault_id> endpoint has no authentication or authorization, so any caller who knows or guesses a vault ID can fetch pending messages for that recipient. Because the endpoint also marks fetched messages as delivered, an attacker can both read sensitive message contents and disrupt delivery to the legitimate recipient.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The /receive/<vault_id> endpoint returns queued messages for any supplied vault ID and, when debug=true, also exposes delivery statistics and similar recipient identifiers. Although the code comments describe the behavior, there is no confirmation prompt or user-facing disclosure around this sensitive data access, so callers are not warned that message contents and metadata can be disclosed.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The debug branch on the unauthenticated receive endpoint exposes counts of total, delivered, expired, and pending messages, plus recent message metadata and similar recipient identifiers. This enables unauthenticated reconnaissance of communication patterns and valid vault IDs, making targeted interception and privacy attacks easier.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The conversation log and per-agent log endpoints are publicly accessible and disclose communication history metadata, participants, timestamps, statuses, and message relationships. Even without payload contents, this metadata can reveal sensitive social graphs, activity patterns, and operational details unrelated to basic relay functionality.

Content

No source excerpt is available for this finding.

Instruction Override

High
Category
Prompt Injection
Confidence
70% confidence
Finding

This pattern attempts to override system instructions or ignore safety constraints. Without LLM analysis, manual review is recommended.

Content

Scanner excerpt · python/scripts/server.py (reported line 1049)May include surrounding context.

python
parser = argparse.ArgumentParser(description='ClawHub Relay Server')
    parser.add_argument('--host', default='127.0.0.1', help='Host to bind to')
    parser.add_argument('--port', type=int, default=5000, help='Port to bind to')
    parser.add_argument('--debug', action='store_true', help='Enable debug mode')
    parser.add_argument('--db', help='Database path (overrides CLAWHUB_DB env var)')
    args = parser.parse_args()

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documented API exposes sensitive metadata through unauthenticated endpoints such as agent listing, alias resolution, conversation logs, and message retrieval by vault ID. Even if message bodies are encrypted, public access to identifiers, relationships, timing, and logs enables enumeration, traffic analysis, privacy loss, and potentially unauthorized message access if endpoint authorization is weak or absent.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding

The skill declares no explicit tool scope or permissions despite documenting capabilities that use shell execution, filesystem reads/writes, environment state, and outbound network access. In an agent ecosystem, missing scope boundaries increases the chance the skill is invoked with broader authority than users expect, enabling unintended relay access, local vault modification, or command execution paths.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The broad natural-language triggers for sending messages ('message', 'tell', 'contact', 'reach out to') increase the chance the skill activates on ambiguous user intent. In an autonomous agent, this can lead to accidental external communication, disclosure to the wrong recipient, or inappropriate use of the relay when the user only meant drafting or discussing a message.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.