Back to skill

Security audit

Poku

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its Poku calling and messaging purpose, but its inbound webhook setup can wake the main agent with untrusted messages and its webhook administration controls are under-scoped.

Review this before installing if you plan to enable inbound webhooks. Outbound calls and messages should be confirmed each time, and you should assume Poku and downstream communications providers receive the recipient, message or call prompt, and related metadata. Do not use the webhook example as-is for sensitive agents; route inbound events to a dedicated low-privilege agent, use per-event sessions, verify webhook signatures, clearly label inbound text as untrusted data, and require trusted user confirmation before any follow-up calls, messages, number changes, or webhook deletions.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

T01 · Skill Instruction Hijacking

Error
Location
references/WEBHOOKS.md:61
Finding
Untrusted Inbound Message Content Is Injected Directly into the Main Agent Session## Vulnerability Details **File Location**: `references/WEBHOOKS.md`, lines 61–73 **Vulnerability Type**: Prompt injection through untrusted webhook data **Risk Level**: High ### Vulnerable Code ```json { "match": { "path": "poku" }, "action": "agent", "agentId": "main", "sessionKey": "hook:poku", "wakeMode": "now", "name": "Poku", "deliver": true, "channel": "telegram", "to": "<your-telegram-id>", "messageTemplate": "You received a message from {{payload.payload.from}}: \"{{payload.payload.body}}{{payload.payload.summary}}\"" } ``` ### Technical Analysis The webhook mapping interpolates externally controlled `payload.payload.body` and `payload.payload.summary` values directly into a message sent to the main agent. These values may originate from arbitrary SMS senders or callers and are not isolated, escaped, classified as untrusted data, or constrained by a dedicated processing policy. Because the mapping uses `"action": "agent"`, `"agentId": "main"`, and `"wakeMode": "now"`, receipt of an inbound event immediately places attacker-controlled natural language into an active agent execution context. A malicious sender could format an SMS or call-derived message as instructions, such as requests to disregard existing rules, disclose context, invoke tools, contact third parties, or perform API operations. The fixed `"sessionKey": "hook:poku"` compounds the issue by placing multiple inbound events into the same session. Consequently, hostile content may influence subsequent processing within that shared context rather than being isolated to a single interaction. ### Attack Path 1. An attacker identifies or contacts a phone number connected to the Poku inbound webhook. 2. The attacker sends an SMS containing prompt-injection instructions, or supplies adversarial content during a call that appears in the generated summary. 3. Poku emits a `message.received` or `call.conversation.ended` webhook event containing the attacker-controlled ...[truncated 1512 chars]
Remediation
## Remediation Suggestions 1. **Use a dedicated least-privileged agent.** Route inbound Poku events to an agent that has no sensitive tools by default instead of `"agentId": "main"`. 2. **Establish an explicit trust boundary.** Precede interpolated content with a fixed instruction stating that all webhook fields are untrusted data and must never be treated as commands, policy updates, authorization, or tool-use requests. 3. **Separate data from instructions.** Pass webhook fields through a structured data channel where supported. If natural-language rendering is unavoidable, clearly delimit and encode each field and instruct the agent only to summarize or classify it. 4. **Isolate sessions.** Replace the shared `hook:poku` session with per-event or per-interaction session keys derived from a validated interaction identifier. Do not permit inbound content to control the session key. 5. **Require explicit authorization for consequential actions.** An inbound message must not independently authorize calls, outgoing messages, number management, webhook changes, secret access, or other side effects. Require confirmation from an authenticated user through a trusted channel. 6. **Verify webhook authenticity.** Configure a strong randomly generated signing secret and validate the provider's signature before forwarding an event to any agent. Reject unsigned, invalid, stale, or replayed requests. 7. **Apply content controls.** Enforce length limits, schema validation, allowed event types, character normalization, and prompt-injection detection before agent invocation. 8. **Restrict tool permissions.** Apply destination allowlists, operation-specific scopes, rate limits, and human approval gates to tools available in webhook-triggered contexts. 9. **Avoid immediate autonomous execution where unnecessary.** Prefer delivering inbound content as a notification for user review rather than using `"wakeMode": "now"` to trigger an autonomous agent workflow.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (37)

Vague Triggers

High
Confidence
98% confidence
Finding
The skill description says to use this skill any time the user wants to call, message someone, or reserve a phone number, even if they never mention Poku. That creates an overly broad invocation trigger for a capability that can initiate real-world communications and spend resources, increasing the chance the agent routes unrelated or insufficiently confirmed user intents into an external telephony action.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
**Response:** `{ id, phoneNumber, createdAt, updatedAt }`

### DELETE /numbers/:id

Releases a reserved number. Irreversible — confirm with the user before calling. Returns `{ id, number }`.
Confidence
80% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
Updates a webhook. Only fields you send are changed. Updatable: `name`, `url`, `signingSecret`, `headers`, `isActive`, `eventTypes`.

### DELETE /webhooks/:id

Deletes a webhook. Returns `204 No Content`.
Confidence
80% confidence
Finding
Webhook deletion is a destructive administrative action that can silently disable monitoring, integrations, or audit flows if exposed too broadly through the skill. Unlike number release, the documentation provides no warning or confirmation requirement, making accidental or manipulated destructive use more plausible.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The API reference encourages sending calls and messages to third parties but does not warn that user-provided content, phone numbers, and conversational context will be transmitted to an external service. In a communication skill, this omission matters because users may disclose sensitive data without realizing it leaves the local agent boundary.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
Documenting a recording URL without warning that calls may be recorded or stored creates a privacy and consent risk for both the user and the call recipient. Recordings are especially sensitive because they preserve full voice content and may trigger legal obligations in two-party consent jurisdictions.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The documented webhook management API expands the skill beyond its stated purpose of calling, messaging, and number reservation into arbitrary event delivery to external URLs. That broader capability can enable unanticipated data exfiltration or persistence mechanisms if exposed through the skill without clear user understanding and scope restriction.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
Webhook registration sends event data to external URLs, but the documentation does not warn that message/call metadata or other operational data may be delivered outside the platform. Without that disclosure, integrators may unknowingly create a data exfiltration path or route sensitive events to insecure endpoints.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The skill instructs the agent to read and use a sensitive environment variable and send call metadata to an external API without explicitly surfacing that credential-backed outbound transmission to the user. In a calling/messaging skill this behavior is expected operationally, but the lack of disclosure reduces informed consent and can cause unintended sharing of phone numbers or call-routing details.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
echo "$POKU_TRANSFER_NUMBER"
```

- If set: use it automatically in Step 5 — do not ask the user
- If empty: proceed without one; note this in the confirmation (Step 4)

---
Confidence
84% confidence
Finding
The instruction to automatically use a configured transfer number without asking the user reduces user awareness and control over where live calls may be routed. In a calling skill, silent transfer behavior can unexpectedly disclose the user's phone number or connect third parties to the user without explicit consent in that instance.

Natural-Language Policy Violations

Medium
Confidence
98% confidence
Finding
Line L044 instructs the skill to default to a female English-speaking voice and only invite changes afterward. The policy requires flagging language or locale constraints when they are forced without user opt-in, and this default applies before the user has explicitly selected a language/locale.

External Transmission

Medium
Category
Data Exfiltration
Content
Poku API call (no `yieldMs` or `background` in the body):
```bash
curl -s -X POST https://api.pokulabs.com/calls \
  -H "Authorization: Bearer $POKU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
89% confidence
Finding
This instruction sends user-provided call content and phone numbers to an external third-party API using an authorization token. External transmission is core to the skill's purpose, but because the payload can contain personal information and call objectives, it is still a real data-exposure surface if not clearly disclosed and minimized.

External Transmission

Medium
Category
Data Exfiltration
Content
Poku API call (no `yieldMs` or `background` in the body):
```bash
curl -s -X POST https://api.pokulabs.com/calls \
  -H "Authorization: Bearer $POKU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
89% confidence
Finding
This instruction sends user-provided call content and phone numbers to an external third-party API using an authorization token. External transmission is core to the skill's purpose, but because the payload can contain personal information and call objectives, it is still a real data-exposure surface if not clearly disclosed and minimized.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The documentation states that the API response includes a recording URL but does not require warning the user that the call may be recorded or that a retrievable recording artifact will exist. In a phone-call workflow, undisclosed recording creates privacy, consent, retention, and compliance risks that are heightened because conversations may include third parties.

External Transmission

Medium
Category
Data Exfiltration
Content
**Step 4a — Place the call:**
```bash
curl -s -X POST https://api.pokulabs.com/calls \
  -H "Authorization: Bearer $POKU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
87% confidence
Finding
The non-blocking mode also transmits call prompts and phone numbers to the external API, creating the same third-party data-sharing risk as blocking mode. The asynchronous pattern can make the transmission less visible to users because the operation continues in the background after the initial request returns.

External Transmission

Medium
Category
Data Exfiltration
Content
### Send an SMS

```bash
curl -s -X POST https://api.pokulabs.com/messages/sms \
  -H "Authorization: Bearer $POKU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
91% confidence
Finding
The direct reference to api.pokulabs.com confirms outbound transmission to an external service. In a communications skill this is operationally necessary, but it is still a genuine security-relevant behavior because user data and metadata are being delivered off-platform.

External Transmission

Medium
Category
Data Exfiltration
Content
### Send an SMS

```bash
curl -s -X POST https://api.pokulabs.com/messages/sms \
  -H "Authorization: Bearer $POKU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
91% confidence
Finding
The direct reference to api.pokulabs.com confirms outbound transmission to an external service. In a communications skill this is operationally necessary, but it is still a genuine security-relevant behavior because user data and metadata are being delivered off-platform.

External Transmission

Medium
Category
Data Exfiltration
Content
**Option 1 — Free-form from Poku's WhatsApp account:**

```bash
curl -s -X POST https://api.pokulabs.com/messages/whatsapp \
  -H "Authorization: Bearer $POKU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
92% confidence
Finding
The WhatsApp flow sends message bodies and recipient numbers to the external Poku API. This is inherent to the feature, but it creates privacy and abuse risk if the agent is induced to send sensitive or unauthorized content to third parties.

External Transmission

Medium
Category
Data Exfiltration
Content
**Option 2 — From your own WhatsApp number using a Meta-approved template:**

```bash
curl -s -X POST https://api.pokulabs.com/messages/whatsapp \
  -H "Authorization: Bearer $POKU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
90% confidence
Finding
This variant transmits data to the external API while also allowing use of the user's own WhatsApp-enabled number and template variables. That increases the chance of impersonation, accidental disclosure, or misuse of approved templates if the agent is not tightly constrained.

External Transmission

Medium
Category
Data Exfiltration
Content
Prerequisite: you must have joined the Poku Slack workspace or added the Poku bot to your own workspace.

```bash
curl -s -X POST https://api.pokulabs.com/messages/slack \
  -H "Authorization: Bearer $POKU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
90% confidence
Finding
The Slack messaging flow transmits message content and target identifiers to an external API and may post into user or channel destinations. In context this is intended behavior, but it can still leak internal information or enable unauthorized messaging if the agent accepts unverified IDs or ambiguous instructions.

External Transmission

Medium
Category
Data Exfiltration
Content
### Send via a Saved Channel. Must configure a channel card on the Poku dashboard and retrieve a channel_ID first.

```bash
curl -s -X POST https://api.pokulabs.com/messages/<CHANNEL_ID> \
  -H "Authorization: Bearer $POKU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
93% confidence
Finding
The saved-channel endpoint allows posting to a dynamic CHANNEL_ID and optionally overriding medium, recipient, and sender, which expands the blast radius of external transmission. If channel identifiers or overrides are attacker-controlled or insufficiently validated, the agent could route messages to unintended destinations or bypass expected channel restrictions.

External Transmission

Medium
Category
Data Exfiltration
Content
### Path A — Auto-select (user wants any number)

```bash
curl -sG https://api.pokulabs.com/numbers/available \
  -H "Authorization: Bearer $POKU_API_KEY"
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Path A — Auto-select (user wants any number)

```bash
curl -sG https://api.pokulabs.com/numbers/available \
  -H "Authorization: Bearer $POKU_API_KEY"
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Path A — Auto-select (user wants any number)

```bash
curl -sG https://api.pokulabs.com/numbers/available \
  -H "Authorization: Bearer $POKU_API_KEY"
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Path A — Auto-select (user wants any number)

```bash
curl -sG https://api.pokulabs.com/numbers/available \
  -H "Authorization: Bearer $POKU_API_KEY"
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Path A — Auto-select (user wants any number)

```bash
curl -sG https://api.pokulabs.com/numbers/available \
  -H "Authorization: Bearer $POKU_API_KEY"
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

No suspicious patterns detected.