T09 · Insecure Skill Coding Practices
- Location
listener/clawcall-listener.js:217- Finding
Caller-Controlled Command Injection Through Windows Shell Invocation
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This phone-call skill matches its stated purpose, but it needs Review because it handles real phone calls and sensitive local agent context with weak authorization and serious Windows command-execution risk.
Review carefully before installing. Use it only if you are comfortable sharing phone numbers, call transcripts, schedule/context data, and possible local agent context with ClawCall. Keep the bridge bound to 127.0.0.1, do not expose port 4747, protect CLAWCALL_API_KEY, avoid Windows runtime until shell invocation is fixed, and require explicit approval for third-party calls, recurring calls, callbacks, account recovery, voice changes, and any crypto billing step.
listener/clawcall-listener.js:217Caller-Controlled Command Injection Through Windows Shell Invocation
bridge/phone-agent-server.js:67Model Prompt Passed Through a Windows Command Shell
bridge/phone-agent-server.js:191Unauthenticated Bridge Endpoint Exposes Private Agent Context
bridge/phone-prompt.js:3Prompt Injection Can Target Private Memory Included in Model Context
bridge/phone-agent-server.js:145Missing Caller-Level Authorization for Task and Cron Information
listener/clawcall-listener.js:258Sensitive Call Transcripts and Responses Logged in Plaintext
The description promises a phone integration that can receive calls and also initiate or schedule calls on the user's behalf. The code only provides a lightweight local bridge server that responds to POSTed message payloads with text responses. It includes health checking, basic canned replies, cron/task summaries, and model-backed conversation generation, but there is no code for telephony APIs, dialing, callback workflows, scheduled outbound calls, or calling third parties. While the endpoint may support an external phone system, the implemented capability in this chunk is materially narrower than the declared purpose.
The declared description promises a telephony skill with real-number calling behavior. This code does something materially different: it gathers contextual data from local markdown files and CLI commands to assemble a phone-context summary. While the context may support a phone agent, this chunk alone does not perform the declared core capabilities. It also accesses local workspace files and OpenClaw task/cron data, which are not reflected in the description. Therefore the description does not accurately represent the behavior of the supplied code chunk.
The declared description promises a telephony skill with real call-related capabilities. The actual code is limited to prompt construction for conversational behavior during a phone interaction. While this may be a supporting component of a phone agent, the provided chunk does not perform the core declared functions and instead serves only as response-formatting/prompting logic. That is a material difference in primary behavior versus the description.
The code clearly supports one subset of the description: handling inbound calls/messages via ClawCall and routing them to an agent, then returning a reply. However, the declared description promises broader telephony capabilities—callbacks on task completion, scheduled calls, and calling third parties—that are not present in this code chunk. The code only listens for inbound call events (/api/v1/calls/listen) and responds on the same call (/api/v1/calls/respond/{call_sid}). There is no logic for initiating outbound calls, scheduling, contact management, or task-completion-triggered dialing. Therefore the description materially overstates what this code actually does.
The manifest explicitly enables autonomous calls to third parties and scheduled or callback behavior, yet it provides no warning about privacy implications, automated outbound contact, consent requirements, or the handling of personal phone data. Because telephony actions directly affect external people and can expose sensitive information or create harassment, spam, compliance, and trust risks, the missing warnings and constraints materially increase the danger of misuse.
The skill declares required environment variables and clearly expects networked/runtime capabilities, but it does not declare an explicit tool scope such as permissions or allowed-tools. That creates an authorization gap where a host may permit broader execution or secret access than reviewers expect, especially since the skill handles an API key, phone numbers, and outbound communications.
The registration flow sends the user's phone number and agent identity to an external service. External transmission is expected for telephony, but it is still security-relevant because it exports personal data and establishes an account with a third party that will handle communications metadata.
POST https://api.clawcall.online/api/v1/register
Content-Type: application/json
{
Polling the external listen endpoint transmits the API key and retrieves user call content from a third-party service. Because this endpoint carries both authentication material and potentially sensitive speech transcripts, compromise or misuse could expose private conversations.
for incoming messages manually:
GET https://api.clawcall.online/api/v1/calls/listen?timeout=25
Authorization: Bearer {CLAWCALL_API_KEY}
Submitting call responses to the external API sends conversation content off-host and uses bearer-token authentication. In this context, even normal operation can expose sensitive user data if logs, proxies, or the remote service are mishandled.
After receiving a message, submit your response:
POST https://api.clawcall.online/api/v1/calls/respond/{call_sid}
Authorization: Bearer {CLAWCALL_API_KEY}
Content-Type: application/json
The callback endpoint causes the service to place an outbound phone call containing agent-generated content. This is an external transmission of potentially sensitive task results and can create privacy or social-engineering risk if the message content is not constrained.
When a background task finishes and you need to notify the user by phone:
POST https://api.clawcall.online/api/v1/calls/outbound/callback
Authorization: Bearer {CLAWCALL_API_KEY}
Content-Type: application/json
Scheduling recurring calls sends task context and timing information to an external provider. That can reveal routines, work patterns, and personal scheduling data, which is particularly sensitive in a phone-assistant context.
POST https://api.clawcall.online/api/v1/calls/schedule
Authorization: Bearer {CLAWCALL_API_KEY}
Content-Type: application/json
The delete schedule endpoint is another authenticated external action. While less sensitive than message content, misuse could disrupt user workflows by canceling scheduled calls via a bearer token.
Common patterns: every weekday 8am `"0 8 * * 1-5"` · daily 9am `"0 9 * * *"`.
To cancel: `DELETE https://api.clawcall.online/api/v1/calls/schedule/{id}`
**Requires Pro tier.**
The skill enables autonomous third-party phone calls and relays the conversation back to the agent, but it does not require warnings or consent checks about call recording, disclosure, privacy, or jurisdiction-specific laws. In a telephony context this is materially riskier because the agent may impersonate the user, share personal details, or create compliance exposure without informed consent.
The third-party outbound calling endpoint transmits a target phone number, an objective, and contextual information to an external service so it can autonomously contact another person. In this skill context, that is especially dangerous because it can disclose personal data, enable impersonation, and trigger legal or reputational harm through unsupervised real-world communications.
POST https://api.clawcall.online/api/v1/calls/outbound/third-party
Authorization: Bearer {CLAWCALL_API_KEY}
Content-Type: application/json
Querying the account endpoint sends authentication to a third party and retrieves usage/account data. This is a normal external call, but exposure of account metadata can still aid profiling or abuse if credentials leak.
GET https://api.clawcall.online/api/v1/account
Authorization: Bearer {CLAWCALL_API_KEY}
Changing voice settings is a lower-risk external transmission, but it still relies on bearer-token authenticated remote state change. Unauthorized use could alter user experience or indicate broader credential misuse.
POST https://api.clawcall.online/api/v1/account/voice
Authorization: Bearer {CLAWCALL_API_KEY}
Content-Type: application/json
Including a cryptocurrency billing workflow in a phone-enablement skill expands the attack surface into financial operations that are unrelated to the core task. That creates phishing and misdirection risk, especially because users may be prompted to retrieve a wallet address and send irreversible USDC payments through the same agent workflow.
The billing checkout endpoint initiates a crypto payment workflow with an external service, exposing the user to financial loss if the workflow is spoofed, tampered with, or initiated unexpectedly. Because crypto transfers are typically irreversible, the risk is materially higher than ordinary account-management traffic.
Step 1 — Get payment address and amount:
POST https://api.clawcall.online/api/v1/billing/checkout
Authorization: Bearer {CLAWCALL_API_KEY}
Content-Type: application/json
Submitting a transaction signature to verify payment is another sensitive financial transmission to a third party. If abused, it could confirm unintended purchases or facilitate scams around fake upgrade flows.
Step 3 — Submit transaction signature to confirm:
POST https://api.clawcall.online/api/v1/billing/verify
Authorization: Bearer {CLAWCALL_API_KEY}
Content-Type: application/json
The recovery flow re-registers using email and phone number to rotate the API key, transmitting sensitive identity data to an external service. If triggered incorrectly or by a malicious prompt, it could rotate credentials unexpectedly and disrupt service or enable account takeover attempts.
Re-register with the same email to rotate the key:
POST https://api.clawcall.online/api/v1/register
Content-Type: application/json
{
This code assembles personally sensitive context from IDENTITY.md, USER.md, and optionally MEMORY.md into a phone-facing context blob without any consent check, minimization guard, or indication in this file that the user approved disclosure for a call workflow. In a telephony skill, that context may be spoken over calls or sent to third parties, which increases the risk of privacy leakage beyond the local agent environment.
The manifest description advertises very broad call-related capabilities such as receiving calls, calling users back, running scheduled briefings, and placing autonomous calls, but it does not define clear trigger boundaries, authorization checks, or user-consent constraints. In a phone/voice skill, ambiguous activation language is risky because it can normalize unsolicited outbound actions and make it easier for downstream instructions or integrations to invoke calls in unintended contexts.
Inbound caller speech/text is forwarded to another processing component via the configured agent webhook, but the code provides no caller notice, consent mechanism, or policy guard before transmitting potentially sensitive call content. In a telephony context, callers may reasonably disclose personal or confidential information, so silent forwarding to a local or remote service creates a meaningful privacy and compliance risk.
Caller messages are handed to the OpenClaw CLI for downstream processing without any explicit warning to the caller that their content will be processed by external agent software. Even though this is a local subprocess rather than an HTTP webhook, it still expands the trust boundary and can expose sensitive caller data to additional tooling, logs, plugins, or model backends behind the CLI.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
GET https://api.clawcall.online/api/v1/calls/listen?timeout=25
Authorization: Bearer {CLAWCALL_API_KEY}
Detected: suspicious.dangerous_exec