T09 · Insecure Skill Coding Practices
- Location
scripts/period_tracker.mjs:543- Finding
Unvalidated Webhook Destination Can Enable Sensitive-Data Disclosure and Downstream SSRF
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is purpose-aligned overall, but it handles sensitive menstrual-health data and can place reminder details into scheduler, chat, or webhook paths in plaintext, so users should review the privacy implications before installing.
Install only if users explicitly consent to local encrypted menstrual tracking and to any reminder delivery channel. Avoid webhook delivery unless destinations are administrator-approved, prefer neutral reminder wording, restrict access to OpenClaw config/state/scheduler logs, and treat cron payloads and chat notifications as sensitive health data.
scripts/period_tracker.mjs:543Unvalidated Webhook Destination Can Enable Sensitive-Data Disclosure and Downstream SSRF
scripts/period_tracker.mjs:716Sensitive Menstrual Information Is Embedded in Plaintext Cron Payloads
The example cron payload sends a menstrual prediction and reminder text over a messaging channel tied to a specific user identifier, but the documentation does not warn about consent, channel confidentiality, notification visibility on shared devices, or minimizing sensitive content in messages. Because this skill concerns intimate health information, outbound reminders can disclose protected personal data to unintended viewers through lock-screen previews, compromised chat accounts, or misrouted messages.
The skill declares access to an environment variable (PERIOD_TRACKER_KEY) via metadata but does not declare an explicit tool scope such as permissions or allowed-tools. This creates an authorization gap: a runtime may expose secrets or code execution capabilities more broadly than reviewers expect, which is especially sensitive here because the skill handles private menstrual health data and encryption material.
The deployment guide handles highly sensitive reproductive-health data and documents secret/key placement plus the encrypted store location, but it does not include any privacy guidance, access-control expectations, retention limits, or operational warnings about who can read the config and state files. In this skill context, the data is especially sensitive because it links menstrual history to identifiable users, so missing privacy safeguards increases the chance of accidental exposure or unsafe deployment.
The sample payload hard-codes Chinese reminder text without stating that the user chose that language or consented to the exact wording, which can lead to privacy, usability, and consent problems. In this context, language choice matters because a conspicuous or unexpected message about menstruation may reveal sensitive health information to others who see the notification.
This code persists highly sensitive menstrual health records and reminder configuration to a local file, but there is no confirmation prompt, user-facing log message, or explanatory comment/docstring warning that this data will be stored on disk. For a health-related tracker, local persistence is a privacy-impacting operation that should be explicitly disclosed to the user.
The reminder text and multiple user-visible status messages are hard-coded in Chinese, with no language selection or opt-in mechanism. This imposes a specific language on all users and matches the policy's language/locale violation pattern.
The script reads PERIOD_TRACKER_KEY from the environment to decrypt and encrypt the user's store, but there is no visible disclosure in the code output or inline documentation that the skill depends on a sensitive environment variable. Accessing credential-like environment data falls under the warning requirement when no user-facing notice is present.
The test requires result.currentPhase.label to equal the Chinese string 卵泡期, which implies the skill output is fixed to a specific language. This is a natural-language locale policy concern because the file does not indicate user opt-in or language selection.
No suspicious patterns detected.