Back to skill

Security audit

Notify with Pushover

Security checks for vulnerabilities and agentic risk

Overview

This skill does what it claims: it sends user-requested Pushover notifications, with no hidden persistence or unrelated data access found.

Install only if you are comfortable sending notification content to Pushover. Use environment variables or a secret manager for the Pushover app token and user key, avoid --token or --user command-line arguments, and do not put passwords, API keys, personal data, or confidential operational details in notification messages.

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/pushover_send.js:40
Finding
Pushover Credentials Exposed Through Command-Line Arguments## Vulnerability Details **File Location**: `scripts/pushover_send.js`, lines 40–44 **Vulnerability Type**: Command-line secret exposure **Risk Level**: Medium ### Vulnerable Code ```js const token = process.env.PUSHOVER_APP_TOKEN || process.env.PUSHOVER_TOKEN || args.token; const user = process.env.PUSHOVER_USER_KEY || process.env.PUSHOVER_USER || args.user; if (!token) die("Missing Pushover app token. Set PUSHOVER_APP_TOKEN (or pass --token)."); if (!user) die("Missing Pushover user key. Set PUSHOVER_USER_KEY (or pass --user)."); ``` ### Technical Analysis The script permits the Pushover application token and user key to be supplied through the `--token` and `--user` command-line arguments. Process arguments are not an appropriate secret-transport mechanism because they may be exposed through process inspection, shell history, job metadata, monitoring systems, audit logs, and diagnostic output. Environment variables are preferred by the documentation, but the executable explicitly supports and advertises the unsafe command-line fallback. Exploitation requires the victim to invoke the script using these options and the attacker to have access to a process-listing, command-history, or logging source that records the invocation. ### Attack Path 1. A user or automated job invokes the script with credentials, for example: ```bash node scripts/pushover_send.js \ --token SECRET_APP_TOKEN \ --user SECRET_USER_KEY \ --message "Test" ``` 2. The full command line is retained in shell history, job metadata, process monitoring, audit telemetry, or diagnostic logs, or is observed while the process is running. 3. A local user or service with access to that data recovers the application token and user key. 4. The attacker submits requests directly to the Pushover Messages API using the recovered credentials. 5. The attacker sends unauthorized notifications to the associated Pushover account, subject to the permissions and limits of the compr ...[truncated 593 chars]
Remediation
## Remediation Suggestions 1. Remove support for the `--token` and `--user` command-line options. 2. Remove error messages that recommend passing credentials through command-line arguments. 3. Obtain credentials only through a protected secret-injection mechanism, such as: - Environment variables supplied by a trusted runtime secret store. - A dedicated secrets manager. - A credential file restricted to the owning account, with permissions such as `0600`. 4. Fail securely when the approved credential source is unavailable. 5. Ensure operational logs and exception handlers never include credential values. 6. Update usage documentation to explicitly prohibit command-line credentials. 7. Rotate any credentials previously supplied through command-line arguments if they may have been retained in shell history, process telemetry, or logs. A hardened implementation should use only approved secret sources: ```js const token = process.env.PUSHOVER_APP_TOKEN; const user = process.env.PUSHOVER_USER_KEY; if (!token) die("Missing Pushover app token. Set PUSHOVER_APP_TOKEN."); if (!user) die("Missing Pushover user key. Set PUSHOVER_USER_KEY."); ```
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (6)

Lp3

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding
The skill invokes a Node script that requires environment variables and sends data over the network, but the manifest does not declare any tool scope or allowed-tools equivalent. That omission weakens policy enforcement and user visibility, increasing the chance the skill can access secrets or perform outbound requests without explicit authorization boundaries.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill encourages sending arbitrary notification content through Pushover but does not clearly warn that titles, messages, URLs, and related metadata are transmitted to a third-party service. Users may unknowingly send sensitive operational details, personal data, or secrets off-platform, creating privacy, confidentiality, and compliance risks.

External Transmission

Medium
Category
Data Exfiltration
Content
if (v != null && v !== "") body.set(k, String(v));
  }

  const res = await fetch("https://api.pushover.net/1/messages.json", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body,
Confidence
60% 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
if (v != null && v !== "") body.set(k, String(v));
  }

  const res = await fetch("https://api.pushover.net/1/messages.json", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body,
Confidence
60% 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
if (v != null && v !== "") body.set(k, String(v));
  }

  const res = await fetch("https://api.pushover.net/1/messages.json", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body,
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Low
Confidence
84% confidence
Finding
This code sends a message plus Pushover token and user key to an external API, which is a network operation involving credentials and user-provided content. While the file header describes usage, there is no explicit user-facing warning, confirmation, or disclosure that message content and identifiers are transmitted to a third-party service.

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/pushover_send.js:40