Back to skill

Security audit

Zen+ Health

Security checks for vulnerabilities and agentic risk

Overview

This wellness skill is mostly coherent and read-only, but it handles sensitive health-adjacent account data with broad triggers and sends the API key to a configurable endpoint without built-in validation.

Review before installing. Use only a dedicated, revocable read-only Zen+ Health API key; set ZEN_API_BASE_URL exactly to the official HTTPS API endpoint; avoid shared or logged workspaces for personal wellness queries; and ask the agent to confirm before fetching profile, notification, timeline, or schedule data.

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
SKILL.md:44
Finding
Bearer API Key Can Be Sent to an Untrusted Configurable Endpoint## Vulnerability Details **File Location**: `SKILL.md:8-9, 44-45, 56-89, 97-110` **Vulnerability Type**: Unrestricted credential destination **Risk Level**: Medium The Skill defines the API destination through an environment variable and then sends the Zen+ Health bearer credential to that destination without requiring validation of its scheme, host, port, or embedded credentials. ```yaml base_url_env: ZEN_API_BASE_URL api_key_env: ZEN_API_KEY ``` The vulnerable pattern appears in all documented API commands, including: ```bash curl -H "Authorization: Bearer ${ZEN_API_KEY}" \ "${ZEN_API_BASE_URL}/v1/me/notifications?limit=10" ``` ```bash curl -H "Authorization: Bearer ${ZEN_API_KEY}" \ "${ZEN_API_BASE_URL}/v1/me/timeline?days=7" ``` ```bash curl -H "Authorization: Bearer ${ZEN_API_KEY}" \ "${ZEN_API_BASE_URL}/v1/catalog" ``` ```bash curl -H "Authorization: Bearer ${ZEN_API_KEY}" \ "${ZEN_API_BASE_URL}/v1/me" ``` The response-processing examples repeat the same behavior: ```bash # Get notification titles curl -s -H "Authorization: Bearer ${ZEN_API_KEY}" \ "${ZEN_API_BASE_URL}/v1/me/notifications" | jq -r '.notifications[].title' # Count timeline events curl -s -H "Authorization: Bearer ${ZEN_API_KEY}" \ "${ZEN_API_BASE_URL}/v1/me/timeline" | jq '.events | length' # List catalogue categories curl -s -H "Authorization: Bearer ${ZEN_API_KEY}" \ "${ZEN_API_BASE_URL}/v1/catalog" | jq -r '.tasks[].category' | sort -u ``` ### Technical Analysis `ZEN_API_BASE_URL` is externally configurable and is interpolated directly into each `curl` destination. The Skill does not require the agent or a wrapper to verify that the parsed URL: - Uses HTTPS. - Has the exact approved hostname `api.zenplus.health`. - Uses an approved port. - Contains no embedded credentials or malformed URL components. As a result, configuration tampering or setup error ...[truncated 1828 chars]
Remediation
## Remediation Suggestions 1. Hardcode `https://api.zenplus.health` as the API origin if alternative environments are not strictly required. 2. If configurability is necessary, place all requests behind a wrapper that parses and validates the URL before adding the authorization header. 3. Require: - The `https` scheme. - An exact hostname allowlist, such as `api.zenplus.health`. - An approved port, normally `443`. - No username or password component. - No ambiguous or malformed hostname encoding. 4. Fail closed if validation fails; do not fall back to the supplied URL. 5. Perform structured URL parsing rather than prefix or substring checks. For example, a value such as `https://api.zenplus.health.attacker.example` must not pass validation. 6. Add the bearer header only after destination validation. 7. Prevent commands, debug traces, error handling, and API response logs from exposing the credential. 8. Use a dedicated, revocable key with only the scopes required by enabled Skill features. 9. Consider separating public catalogue access from authenticated personal-data operations so credentials are not attached where authentication is unnecessary. 10. Update `SECURITY.md` to distinguish recommended configuration from enforced controls and document the destination-validation requirement.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (3)

Missing User Warnings

High
Confidence
97% confidence
Finding
The skill handles highly sensitive wellness-related information, including mood-adjacent activity history, notifications, and user profile data, but the user-facing description does not clearly warn that data will be fetched from an external third-party service. This undermines informed consent and increases the chance that private mental-health-related information is accessed or disclosed without the user's clear understanding.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The README encourages connecting an API key to expose wellness notifications, timeline, profile data, and working-hours preferences, but it does not clearly warn that these may constitute sensitive personal or health-adjacent data. In a chat-platform integration context, users may disclose or route this information through third-party systems, logs, or shared workspaces without understanding the privacy implications, increasing the risk of unintended exposure.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The trigger conditions are very broad and include common emotional states and everyday requests such as feeling stressed, wanting to relax, or asking for self-care ideas. Because this skill requires authentication and can retrieve sensitive wellness, profile, notification, and timeline data from a third-party service, overbroad triggering creates a real risk of unintended invocation and unnecessary access to private information.

Static analysis

No suspicious patterns detected.