T09 · Insecure Skill Coding Practices
- Location
scripts/pregnancy_helper.py:29- Finding
Pregnancy Health Data Stored in Plaintext Without Restrictive File Permissions
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This pregnancy tracker is purpose-aligned but needs review because it stores and retains sensitive pregnancy data locally without clear privacy, deletion, or user-isolation safeguards.
Install only if you are comfortable with pregnancy-related information being stored locally in plaintext and potentially retained after tracking stops. Before use, the publisher should add clear consent, documented storage and deletion behavior, stronger per-user isolation, restrictive file permissions or secure storage, and avoid creating persistent memory for birth or pregnancy status without explicit confirmation.
scripts/pregnancy_helper.py:29Pregnancy Health Data Stored in Plaintext Without Restrictive File Permissions
scripts/pregnancy_helper.py:56Caller-Controlled User Identifiers Permit Cross-User Record Access and Modification
SKILL.md:62Stop-Tracking Workflow Retains Health Records and Directs Persistent Memory Duplication
The code is related to pregnancy care, but it implements only a narrow subset of the declared functionality. It provides static milestone/advice data and simple helper functions for trimester lookup and upcoming checklist items. It does not show multiple-user management, personalized recommendations, full gestational age tracking features, or distinct weekly updates. So the description overstates the implemented capabilities enough to constitute a mismatch.
The skill instructs the agent to call a helper script that stores and updates pregnancy-related user data, but the manifest declares no explicit tool scope or permission boundaries. In a multi-user, sensitive-health context, undeclared file read/write capabilities increase the risk of unintended data access, persistence, or cross-user leakage because operators and users cannot clearly see what storage actions are authorized.
The skill handles highly sensitive health and role data for multiple users but does not warn users that such data may be stored and separated by user identity. In a pregnancy-care context, lack of disclosure around collection and retention increases privacy risk and can lead to users sharing medical information without informed consent, especially where multiple-user isolation is only described, not proven.
The skill explicitly instructs agents to archive user data and create a Core Memory entry when pregnancy tracking ends, but it gives no user-facing retention warning or consent step. Because pregnancy status and birth events are sensitive health and family data, silent archival can create long-lived records that outlast the user's expectation and increase exposure in future interactions.
The persona section instructs the agent to address the pregnant person as "She" when speaking to a partner. This forces a specific gendered reference without confirming the user's preferred language or pronouns, which is a natural-language policy issue.
This code contains user-facing titles, descriptions, and advice primarily in Chinese, while also mixing in English labels. Under the policy, forcing a specific language without user opt-in is a natural-language locale violation unless the locale constraint is clearly documented and justified, which is not present here.
The code persists highly sensitive pregnancy-related data, including last menstrual period, role/relationship information, completed tasks, and custom milestones, to a predictable local JSON file without any consent flow, notice, encryption, or access-control mechanism. In a multi-user or shared-host environment, this creates a real confidentiality risk because intimate health data may be exposed through local filesystem access, backups, logs, or improper workspace sharing.
The usage guide lists "Update me" as a user phrase for invoking the pregnancy status flow. This phrase is very generic in everyday conversation and the document does not provide limiting context or negative examples to clarify when it should activate this skill versus other update-related tasks.
The natural-language documentation and parsing logic explicitly support Chinese-formatted dates using 年/月/日 while not offering any locale selection mechanism. This introduces a locale-specific behavior in the skill without documenting it as region-specific or making it user-selectable.
No suspicious patterns detected.