T09 · Insecure Skill Coding Practices
Warning
- Location
- SKILL.md:23
- Finding
- Plaintext Persistence of Sensitive Resume Profile Data<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 23-35 **Vulnerability Type**: Plaintext storage of sensitive personal information **Risk Level**: Medium ### Vulnerable Code ```markdown ## Phase 1: Profile Collection On first run (no `resume-profile.md` exists), collect user info. Ask one section at a time, confirm before next. Save to `resume-profile.md`. **Confirm preferences first:** 1. **Accent color** — hex/name, default `#6b4c9a` 2. **Language** — 中文 or English 3. **Target region** — mainland China (include birth date) or overseas (exclude) ### Sections (structured data per section) 1. Personal — name, phone, email, birth date, location, LinkedIn 2. Education — school, degree, major, date, honors 3. Work Experience — per role: company, title, dates, 3-6 bullets (quantify!) 4. Side Projects — per project: name, type, status, role, features/metrics, tech stack 5. Skills — domain + technical tools + languages, grouped 6. Certificates & Awards ``` ### Technical Analysis The workflow explicitly collects phone numbers, email addresses, birth dates, locations, employment histories, and education records, and then persists them in a plaintext Markdown file named `resume-profile.md`. The instructions do not establish: - Explicit consent for persistent storage - Restrictive file permissions - Encryption at rest - A retention or automatic deletion policy - A user-facing deletion mechanism - Protection against accidental source-control commits - Data minimization for fields such as birth date This is an insecure storage practice because the profile remains readable to any process or user that can access the workspace. The exposure lasts beyond the immediate resume-generation operation. ### Attack Path 1. A user invokes the Skill and supplies personal and professional information. 2. The Agent writes the information to `resume-profile.md` as instructed. 3. The plaintext profile remains in the workspace after the session finishes. 4. ...[truncated 948 chars]
- Remediation
- <![CDATA[ ## Remediation Suggestions 1. Obtain explicit user consent before persisting any profile information. 2. Make persistent storage optional and default to session-only processing. 3. Collect birth dates only when demonstrably required and explicitly approved by the user. 4. Store the profile in a user-approved private directory rather than an implicitly shared workspace. 5. Create the file with permissions restricted to the current user. 6. Encrypt sensitive profile data at rest when persistent reuse is enabled. 7. Define a clear retention period and provide commands to inspect, export, update, and permanently delete the profile. 8. Add `resume-profile.md` and generated resumes to `.gitignore` and equivalent synchronization exclusions. 9. Warn users before storing data in directories managed by source control, cloud synchronization, or shared development environments. 10. Document which fields are stored, why they are needed, and how long they remain available. ]]>
