Back to skill

Security audit

EngageLab SMS

Security checks for vulnerabilities and agentic risk

Overview

This EngageLab SMS skill is mostly purpose-aligned, but it needs review because it can send SMS messages, delete messaging configuration, and its helper client can send credentials to a caller-chosen API host.

Install only if you intend to use EngageLab SMS. Use least-privilege EngageLab credentials, keep calls restricted to smsapi.engagelab.com, avoid entering production secrets into retained prompts, and require an explicit review of recipient lists, template IDs, signature IDs, and deletion targets before running generated commands or the Python helper.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/sms_client.py:44
Finding

Caller-Controlled Base URL Can Expose EngageLab Credentials and SMS Data

Content
View full analysis

Vulnerability Details

File Location: scripts/sms_client.py:44-54
Vulnerability Type: Arbitrary credential forwarding through an unrestricted API base URL
Risk Level: Medium

python
def __init__(self, dev_key: str, dev_secret: str, base_url: str = BASE_URL):
    auth = base64.b64encode(f"{dev_key}:{dev_secret}".encode()).decode()
    self._headers = {
        "Content-Type": "application/json",
        "Authorization": f"Basic {auth}",
    }
    self._base_url = base_url.rstrip("/")

def _request(self, method: str, path: str, payload: Optional[dict] = None) -> Union[dict, list]:
    url = f"{self._base_url}{path}"
    resp = requests.request(method, url, headers=self._headers, json=payload)

Technical Analysis

The constructor accepts an unrestricted base_url and stores a Base64-encoded dev_key:dev_secret value in the Authorization header. Every subsequent request sends that header to the configured URL without validating its scheme or hostname.

Base64 is the encoding required by HTTP Basic authentication, but it does not protect the credentials from a receiving server. Although encoding the credentials is necessary for the declared EngageLab functionality and the code does not print them to stdout, permitting an arbitrary destination exceeds the minimum network privileges required. The documented service uses only https://smsapi.engagelab.com.

Exploitation requires an attacker to influence application configuration, constructor arguments, or code that creates the client. There is no evidence that the Skill automatically obtains an attacker-controlled URL, so the issue is conditional rather than an unconditional exfiltration mechanism.

Attack Path

  1. A user or integrating application supplies valid EngageLab credentials to EngageLabSMS.
  2. An attacker influences the base_url argument, directly or through an exposed configuration value.
  3. The attacker sets it to a server u ...[truncated 1207 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove the public base_url override if production operation only requires the documented EngageLab endpoint.
  2. If configurability is required, parse and validate the URL before storing it:
    • Require the https scheme.
    • Require the exact hostname smsapi.engagelab.com.
    • Reject embedded user information, unexpected ports, fragments, and alternate hosts.
  3. Keep test endpoint support separate from the production client. Test transports should use dedicated non-production credentials and should never inherit production Authorization headers.
  4. Prefer a requests.Session configured for the approved origin and avoid forwarding Authorization headers when the destination origin changes.
  5. Set explicit connection and response timeouts to prevent requests from hanging indefinitely.
  6. Document that credentials must be loaded from an environment variable or secret manager rather than source code, logs, prompts retained in history, or command-line arguments.
  7. Add tests confirming that HTTP URLs, lookalike domains, subdomains, alternate ports, and unrelated HTTPS hosts are rejected before any request is sent.
Vulnerability Patterns
  • 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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (9)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

The skill includes a direct delete endpoint for templates without documenting any confirmation, validation, or guardrails around the templateId parameter. If an agent fills this parameter from ambiguous user input or stale context, it could delete the wrong template and disrupt approved or pending messaging operations.

Content

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

md
**Update** — `PUT /v1/template-configs/:templateId` (same body as create, all fields required)

**Delete** — `DELETE /v1/template-configs/:templateId`

## Signature (Sender ID) Management

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

The signature deletion endpoint is exposed in the skill without safety checks, making it susceptible to parameter misuse or mistaken identity selection. Deleting the wrong sender ID/signature can break message delivery, invalidate templates that depend on it, or cause operational downtime for SMS campaigns.

Content

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

md
**Update** — `PUT /v1/sign-configs/:signId` (same body as create)

**Delete** — `DELETE /v1/sign-configs/:signId`

## Generating Code

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
84% confidence
Finding

A documented DELETE endpoint that takes only a template ID can be dangerous in an agentic context because an LLM-driven tool may delete the wrong resource if it misbinds parameters, acts on ambiguous user intent, or is prompted to perform destructive actions without confirmation. Since this skill is designed to manage SMS templates directly, exposure of destructive operations increases the chance of unauthorized or accidental deletion through tool misuse.

Content

Scanner excerpt · references/template-and-signature-api.md (reported line 139)May include surrounding context.

md
### 5. Delete Template

`DELETE /v1/template-configs/:templateId`

| Path Param | Type | Required | Description |
|------------|------|----------|-------------|

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
84% confidence
Finding

This DELETE signature endpoint presents a real tool-parameter-abuse risk in an agent skill because a single identifier is sufficient to remove a sender signature, and LLMs can confuse IDs or act on incomplete instructions. In the context of SMS platform administration, accidental or unauthorized signature deletion can disrupt approved sender identities and downstream messaging operations.

Content

Scanner excerpt · references/template-and-signature-api.md (reported line 236)May include surrounding context.

md
### 5. Delete Signature

`DELETE /v1/sign-configs/:signId`

| Path Param | Type | Required | Description |
|------------|------|----------|-------------|

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill describes network-capable behavior against external SMS APIs but does not declare any explicit tool scope, permissions, or allowed-tools boundaries. In an agent environment, this can lead to overbroad execution privileges or unclear authorization expectations, increasing the chance of unintended outbound requests or misuse of credentials.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger phrases are broad enough to match generic requests like 'sms api', 'sender id', or partial integration language, which can cause this skill to activate when the user did not specifically intend EngageLab. Misrouting requests to a credentialed messaging skill raises the risk of accidental API usage, secret solicitation, or destructive operations in the wrong context.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill advertises template and signature CRUD capabilities but does not prominently warn that delete operations are destructive and may not be reversible. In a high-impact operational context like messaging configuration, omission of deletion warnings increases the chance of accidental loss of production templates or sender IDs.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This markdown file documents template deletion behavior and constraints, but it does not warn users that deleting a template is a destructive action that may be irreversible or affect existing configurations. For markdown files, destructive behaviors that could affect user data or system integrity should include an explicit warning.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This markdown file documents signature deletion behavior and constraints, but it does not warn users that deleting a signature is a destructive action that may be irreversible or impact dependent templates or message workflows. Markdown documentation should explicitly disclose such potentially harmful operations.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.