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

Content
View full analysis

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
View 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
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
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).

Content

Scanner excerpt · references/API.md (reported line 121)May include surrounding context.

md
**Response:** `{ id, phoneNumber, createdAt, updatedAt }`

### DELETE /numbers/:id

Releases a reserved number. Irreversible — confirm with the user before calling. Returns `{ id, number }`.

Tool Parameter Abuse

High
Category
Tool Misuse
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.

Content

Scanner excerpt · references/API.md (reported line 147)May include surrounding context.

md
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`.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
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.

Content

Scanner excerpt · references/CALLS.md (reported line 18)May include surrounding context.

echo "$POKU_TRANSFER_NUMBER"

text

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

---

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
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.

Content

Scanner excerpt · references/CALLS.md (reported line 60)May include surrounding context.

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 '{

External Transmission

Medium
Category
Data Exfiltration
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.

Content

Scanner excerpt · references/CALLS.md (reported line 60)May include surrounding context.

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 '{

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
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.

Content

Scanner excerpt · references/CALLS.md (reported line 83)May include surrounding context.

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 '{

External Transmission

Medium
Category
Data Exfiltration
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.

Content

Scanner excerpt · references/MESSAGES.md (reported line 43)May include surrounding context.

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 '{

External Transmission

Medium
Category
Data Exfiltration
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.

Content

Scanner excerpt · references/MESSAGES.md (reported line 43)May include surrounding context.

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 '{

External Transmission

Medium
Category
Data Exfiltration
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.

Content

Scanner excerpt · references/MESSAGES.md (reported line 66)May include surrounding context.

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 '{

External Transmission

Medium
Category
Data Exfiltration
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.

Content

Scanner excerpt · references/MESSAGES.md (reported line 78)May include surrounding context.

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 '{

External Transmission

Medium
Category
Data Exfiltration
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.

Content

Scanner excerpt · references/MESSAGES.md (reported line 101)May include surrounding context.

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 '{

External Transmission

Medium
Category
Data Exfiltration
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.

Content

Scanner excerpt · references/MESSAGES.md (reported line 116)May include surrounding context.

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 '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/API.md (reported line 59)May include surrounding context.

Path A — Auto-select (user wants any number)

bash
curl -sG https://api.pokulabs.com/numbers/available \
  -H "Authorization: Bearer $POKU_API_KEY"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/CALLS.md (reported line 98)May include surrounding context.

Path A — Auto-select (user wants any number)

bash
curl -sG https://api.pokulabs.com/numbers/available \
  -H "Authorization: Bearer $POKU_API_KEY"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/NUMBERS.md (reported line 19)May include surrounding context.

Path A — Auto-select (user wants any number)

bash
curl -sG https://api.pokulabs.com/numbers/available \
  -H "Authorization: Bearer $POKU_API_KEY"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/NUMBERS.md (reported line 32)May include surrounding context.

Path A — Auto-select (user wants any number)

bash
curl -sG https://api.pokulabs.com/numbers/available \
  -H "Authorization: Bearer $POKU_API_KEY"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/NUMBERS.md (reported line 45)May include surrounding context.

Path A — Auto-select (user wants any number)

bash
curl -sG https://api.pokulabs.com/numbers/available \
  -H "Authorization: Bearer $POKU_API_KEY"

Static analysis

No suspicious patterns detected.