Back to skill

Security audit

SendPulse Transactional Email (SMTP)

Security checks for vulnerabilities and agentic risk

Overview

The skill provides legitimate email integration guidance, but directs permanent address deletion and suggests disabling an account access restriction without clear safeguards.

Before using this skill, replace permanent address deletion with reversible suppression unless you explicitly approve a recoverable cleanup. Keep IP restrictions enabled and add only the intended sending server. Use a separate revocable credential and confirm recipients and attachments before live sends; SendPulse receives the email data.

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
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
Findings (44)

Self-Modification

High
Category
Rogue Agent
Confidence
90% confidence
Finding

Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Content

Scanner excerpt · CHANGELOG.md (reported line 48)May include surrounding context.

md
- Initial release.
- `SKILL.md` core playbook: product routing (SMTP vs Email Service), prerequisite
  checks, OAuth flow, send rules, hygiene rules, troubleshooting order,
  self-update check.
- References: quickstart, account/sender/DNS setup, full SMTP API reference,
  error & troubleshooting tables, deliverability guide, webhooks guide, SMTP
  relay guide (smtp-pulse.com), Email Service API overview.

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
`references/api-reference.md`. Ready-to-run code: `examples/curl.md`,

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
`examples/php.md`, `examples/python.md`, `examples/nodejs.md`.

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

Scanner excerpt · examples/curl.md (reported line 13)May include surrounding context.

Get a token

bash
TOKEN=$(curl -s -X POST https://api.sendpulse.com/oauth/access_token \
  -H "Content-Type: application/json" \
  -d "{\"grant_type\":\"client_credentials\",\"client_id\":\"$SENDPULSE_API_ID\",\"client_secret\":\"$SENDPULSE_API_SECRET\"}" \
  | python3 -c "import sys,json;print(json.load(sys.stdin)['access_token'])")

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/errors.md (reported line 40)May include surrounding context.

md
/ pending confirmation | Check spam folder for the confirmation email; re-request verification. |
| "Maximum number of domains" | Plan's sender-domain limit reached | Remove unused domains or upgrade. |
| Empty/garbled email body received | `html` was not Base64-encoded | Encode `html`; keep `text` plain. |
| Recipient rejected / silently not delivered | Address on the unsubscribe blocklist or bounced earlier | `GET /smtp/unsubscribe/search?email=...`; if legitimately re-opted-in, `POST /smtp/resubscribe` (max 5/24 h) or `DELETE /smtp/unsubscribe`. |
| "Missed 'to'/'from'/'subject'..." | Malformed body — e.g. `to` not an array of objects | Match the schema in [api-reference.md](api-reference.md) exactly. |
| Attachment ignored/corrupted | Binary file put into `attachments` instead of `attachments_binary` | Base64 the file and use `attachments_binary`. |
| Balance / limit exceeded | Monthly email volume of the plan is spent | Check plan usage in dashboard; upgrade or buy extra volume. |

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/quickstart.md (reported line 7)May include surrounding context.

md
(see [setup.md](setup.md) if not done yet) and API credentials from
*Settings → API* in the SendPulse dashboard.

## 1. Get an access token

**Shortcut:** if you generated a **Single API Key** (*Settings → API → API keys*),
skip this step — use that key directly as `YOUR_TOKEN` below; it doesn't expire.

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 · SKILL.md (reported line 40)May include surrounding context.

md
Within SMTP there are two transport options:

- **REST API** (`POST https://api.sendpulse.com/smtp/emails`) — recommended default.
  Structured JSON, message IDs for tracking, list management endpoints.
  → `references/api-reference.md`
- **SMTP relay** (`smtp-pulse.com:465`, SSL) — when the user has an existing app,

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 · SKILL.md (reported line 77)May include surrounding context.

  • OAuth client credentials (alternative) — when short-lived tokens are required:
text
POST https://api.sendpulse.com/oauth/access_token
Content-Type: application/json

{"grant_type": "client_credentials", "client_id": "<ID>", "client_secret": "<Secret>"}

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 · SKILL.md (reported line 100)May include surrounding context.

Minimal working request (see references/quickstart.md for a copy-paste version):

text
POST https://api.sendpulse.com/smtp/emails
Authorization: Bearer <token>
Content-Type: application/json

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 · adapters/chatgpt/instructions.md (reported line 23)May include surrounding context.

md
SSL) for existing apps, CMS plugins, and mail clients.

Non-negotiable technical rules:
1. Auth: POST https://api.sendpulse.com/oauth/access_token
   (`grant_type=client_credentials`, `client_id`, `client_secret` from
   *Account Settings → API*). Token TTL 1 hour — cache it, refresh on HTTP 401.
   Credentials always from environment variables.

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 · adapters/cursor/sendpulse-smtp.mdc (reported line 18)May include surrounding context.

text
Non-negotiable rules when generating SendPulse SMTP code:

1. Auth: `POST https://api.sendpulse.com/oauth/access_token` with
   `client_credentials`; cache the Bearer token (~1 h TTL), refresh on 401.
   Credentials from env vars, never hardcoded.
2. Send: `POST /smtp/emails` — the `html` field MUST be Base64-encoded; always

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 · adapters/gemini/GEMINI.md (reported line 23)May include surrounding context.

md
Hard rules (apply even without reading the references):

1. OAuth: `POST https://api.sendpulse.com/oauth/access_token`, cache the Bearer
   token (1 h TTL), refresh on 401, credentials from env vars only.
2. `POST /smtp/emails`: `html` MUST be Base64-encoded; include a `text` part;
   `to` is an array of objects; `from.email` must be a verified sender on a

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 · examples/curl.md (reported line 13)May include surrounding context.

Get a token

bash
TOKEN=$(curl -s -X POST https://api.sendpulse.com/oauth/access_token \
  -H "Content-Type: application/json" \
  -d "{\"grant_type\":\"client_credentials\",\"client_id\":\"$SENDPULSE_API_ID\",\"client_secret\":\"$SENDPULSE_API_SECRET\"}" \
  | python3 -c "import sys,json;print(json.load(sys.stdin)['access_token'])")

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 · examples/curl.md (reported line 24)May include surrounding context.

bash
HTML_B64=$(printf '<h1>Hello!</h1><p>Your order #1234 is confirmed.</p>' | base64 | tr -d '\n')

curl -s -X POST https://api.sendpulse.com/smtp/emails \
  -H "Authorization: Bearer $TOKEN" \
  -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 · examples/curl.md (reported line 42)May include surrounding context.

Send using a stored template with variables

bash
curl -s -X POST https://api.sendpulse.com/smtp/emails \
  -H "Authorization: Bearer $TOKEN" \
  -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 · examples/curl.md (reported line 78)May include surrounding context.

Check delivery status

bash
curl -s https://api.sendpulse.com/smtp/emails/MESSAGE_ID \
  -H "Authorization: Bearer $TOKEN"

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 · examples/curl.md (reported line 86)May include surrounding context.

bash
# Is this address unsubscribed?
curl -s "https://api.sendpulse.com/smtp/unsubscribe/search?email=jane%40example.com" \
  -H "Authorization: Bearer $TOKEN"

# Bounces for the last 24 h

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 · examples/curl.md (reported line 90)May include surrounding context.

md
-H "Authorization: Bearer $TOKEN"

# Bounces for the last 24 h
curl -s https://api.sendpulse.com/smtp/bounces/day \
  -H "Authorization: Bearer $TOKEN"

# Add an address to the blocklist (user opted out in your app)

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 · examples/curl.md (reported line 94)May include surrounding context.

md
-H "Authorization: Bearer $TOKEN"

# Add an address to the blocklist (user opted out in your app)
curl -s -X POST https://api.sendpulse.com/smtp/unsubscribe \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"emails": [{"email": "jane@example.com", "comment": "opted out in app"}]}'

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 · examples/curl.md (reported line 103)May include surrounding context.

List verified senders

bash
curl -s https://api.sendpulse.com/smtp/senders -H "Authorization: Bearer $TOKEN"

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 · examples/php.md (reported line 48)May include surrounding context.

md
return $token; // reuse cached token (TTL 1 h)
    }

    $ch = curl_init('https://api.sendpulse.com/oauth/access_token');
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,

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 · examples/php.md (reported line 72)May include surrounding context.

md
function sendpulseSend(array $email): array
{
    $ch = curl_init('https://api.sendpulse.com/smtp/emails');
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,

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/quickstart.md (reported line 14)May include surrounding context.

Otherwise, with OAuth client credentials:

bash
curl -s -X POST https://api.sendpulse.com/oauth/access_token \
  -H "Content-Type: application/json" \
  -d '{
    "grant_type": "client_credentials",

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/quickstart.md (reported line 49)May include surrounding context.

3. Send the email

bash
curl -s -X POST https://api.sendpulse.com/smtp/emails \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -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/quickstart.md (reported line 72)May include surrounding context.

Save the id — use it to check delivery status:

bash
curl -s https://api.sendpulse.com/smtp/emails/vsyoyxxxxxxxxxx-xxxxx \
  -H "Authorization: Bearer YOUR_TOKEN"

Static analysis

No suspicious patterns detected.