T09 · Insecure Skill Coding Practices
- Location
crm.py:54- Finding
Plaintext CRM records stored without enforced restrictive file permissions
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a functional local CRM skill, but it ships live-looking contact data and can import a fixed private lead file from the user's home directory without clear scoping or preview.
Install only if you intend to use this personal Gracie CRM workflow. Review or remove the bundled crm.json records first, understand that the import command may copy leads from the fixed ~/StudioBrain/30_INTERNAL/WLC-Services/LEADS/MASTER_LEAD_LIST.md path, and keep the CRM data file in a private location with restrictive permissions.
crm.py:54Plaintext CRM records stored without enforced restrictive file permissions
The trigger conditions are broad enough to match generic CRM and lead-management requests without clear boundaries, which can cause the agent to invoke this skill in situations the user did not specifically intend. That increases the risk of inappropriate access, modification, or disclosure of sales lead data, especially if other skills or workflows overlap in scope.
The script is hard-coded to read from a user-home path outside the skill directory and import its contents into the local CRM store. That creates an unexpected cross-boundary data access path that can expose unrelated personal or internal lead data and silently duplicate sensitive information into another file when the import command is run.
The import feature reads a hard-coded personal/internal markdown file and ingests its contents without any warning, confirmation, or scope limitation. In this skill context, that is more dangerous because a sales CRM will store names and phone numbers, so the behavior can quietly copy sensitive business contact data from an unrelated location into a new datastore.
This code writes CRM lead data to crm.json, which is a user-data-affecting file write. Although the action is part of the tool's purpose, there is no docstring, comment, or command-level warning disclosing that lead additions, notes, calls, and imports persist data to disk.
The _parse_master_leads docstring says a valid lead row may contain either a bold business name or a plausible non-header name. However, the code immediately below rejects any row where no bold text is found, so the documented parsing behavior contradicts the actual implementation.
No suspicious patterns detected.