Back to skill

Security audit

Universal Notify

Security checks for vulnerabilities and agentic risk

Overview

This skill does what it claims: it sends user-provided notifications to selected external notification services, with some credential-handling and input-escaping risks users should understand.

Install only if you are comfortable sending notification text to the configured provider. Avoid putting secrets, personal data, or incident details in messages unless the destination is trusted. Prefer disposable or limited-scope notification tokens, avoid placing real tokens directly in shell history, and be cautious when forwarding untrusted text to the generic webhook channel.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/notify.sh:98
Finding

Notification service credentials exposed through command-line arguments and request URLs

Content
View full analysis
/dev/null || error "gotify request failed" ``` ```bash telegram) [[ -z "$BOT_TOKEN" || -z "$CHAT_ID" ]] && error "--bot-token and --chat-id required for telegram" curl -sf -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \ -d "chat_id=${CHAT_ID}" -d "text=${MESSAGE}" -d "parse_mode=HTML" >/dev/null || error "telegram request failed" ``` ```bash pushover) [[ -z "$APP_TOKEN" || -z "$USER_KEY" ]] && error "--app-token and --user-key required for pushover" curl -sf \ --form-string "token=${APP_TOKEN}" \ --form-string "user=${USER_KEY}" \ --form-string "message=${MESSAGE}" \ --form-string "title=${TITLE:-Notification}" \ --form-string "priority=$(pushover_priority "$PRIORITY")" \ https://api.pushover.net/1/messages.json >/dev/null || error "pushover request failed" ``` The documentation encourages callers to provide credentials directly as arguments: ```bash scripts/notify.sh --channel gotify --url https://gotify.local --token TOKEN --message "Deploy done" scripts/notify.sh --channel telegram --bot-token BOT:TOK --chat-id 12345 --message "Hello" scripts/notify.sh --channel pushover --app-token X --user-key Y --message "Alert" --priority high ``` ### Technical Analysis Sensitive Gotify, Telegram, and Pushover credentials are accepted through command-line options. Such values can remain in interactive shell history and may be visible to local ...[truncated 2023 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/notify.sh:104
Finding

Unescaped user input permits JSON structure injection in webhook payloads

Content
View full analysis
/dev/null || error "webhook request failed" success ;; ``` ### Technical Analysis The webhook payload is assembled using `printf` and direct interpolation of the caller-controlled title, message, and priority values. The code does not perform JSON escaping for quotation marks, backslashes, newlines, control characters, or other special input. An input containing JSON syntax can therefore terminate the intended string and introduce additional properties or alter the payload structure. Less deliberately crafted content containing ordinary quotation marks or line breaks can also produce invalid JSON, causing notification delivery failures. For example, a message containing content conceptually equivalent to: ```text original","admin":true,"message":"replacement ``` would be inserted into the payload without encoding. The resulting interpretation depends on the downstream parser, duplicate-key handling, and webhook application. The shell quoting prevents this flaw from directly becoming shell command injection, but it does not protect the structure of the generated JSON. ### Attack Path 1. An attacker gains influence over a value passed as `--message`, `--title`, or `--priority`, such as through an automated monitoring event or another system invoking the script. 2. The attacker includes quotation marks and JSON delimiters in that value. 3. The script interpolates the value directly into the JSON document without escaping it. 4. The webhook receiver either rejects the malformed payload or ...[truncated 830 chars]
Remediation
View remediation
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 (7)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
86% confidence
Finding

The skill invokes a shell script (scripts/notify.sh) but does not declare any tool scope or allowed-tools boundaries. That omission weakens sandboxing and user awareness, making it easier for an agent to execute shell-based actions without explicit permission constraints.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This skill is explicitly designed to send messages to third-party services including ntfy.sh, webhooks, Telegram, Pushover, SMTP servers, and Gotify, yet it provides no warning that message contents may leave the local environment. In practice, users may include secrets, logs, incident details, or personal data in notifications, causing unintended data exfiltration or privacy violations.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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 · scripts/notify.sh (reported line 91)May include surrounding context.

sh
[[ -z "$TOPIC" ]] && error "--topic required for ntfy"
    HEADERS=(-H "Priority: $(ntfy_priority "$PRIORITY")")
    [[ -n "$TITLE" ]] && HEADERS+=(-H "Title: $TITLE")
    curl -sf "${HEADERS[@]}" -d "$MESSAGE" "${NTFY_SERVER}/${TOPIC}" >/dev/null || error "ntfy request failed"
    success
    ;;

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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 · scripts/notify.sh (reported line 107)May include surrounding context.

sh
[[ -z "$URL" ]] && error "--url required for webhook"
    JSON=$(printf '{"title":"%s","message":"%s","priority":"%s"}' \
      "${TITLE:-Notification}" "$MESSAGE" "$PRIORITY")
    curl -sf -X POST -H "Content-Type: application/json" -d "$JSON" "$URL" >/dev/null || error "webhook request failed"
    success
    ;;

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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 · scripts/notify.sh (reported line 121)May include surrounding context.

sh
telegram)
    [[ -z "$BOT_TOKEN" || -z "$CHAT_ID" ]] && error "--bot-token and --chat-id required for telegram"
    curl -sf -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
      -d "chat_id=${CHAT_ID}" -d "text=${MESSAGE}" -d "parse_mode=HTML" >/dev/null || error "telegram request failed"
    success
    ;;

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 · scripts/notify.sh (reported line 121)May include surrounding context.

sh
telegram)
    [[ -z "$BOT_TOKEN" || -z "$CHAT_ID" ]] && error "--bot-token and --chat-id required for telegram"
    curl -sf -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
      -d "chat_id=${CHAT_ID}" -d "text=${MESSAGE}" -d "parse_mode=HTML" >/dev/null || error "telegram request failed"
    success
    ;;

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 · scripts/notify.sh (reported line 134)May include surrounding context.

sh
--form-string "message=${MESSAGE}" \
      --form-string "title=${TITLE:-Notification}" \
      --form-string "priority=$(pushover_priority "$PRIORITY")" \
      https://api.pushover.net/1/messages.json >/dev/null || error "pushover request failed"
    success
    ;;

Static analysis

No suspicious patterns detected.