T09 · Insecure Skill Coding Practices
- Location
index.js:190- Finding
Plaintext Retention of Complete Conversation Content
- Content
View full analysis
100) { logs.splice(0, logs.length - 100); } writeJson(LOG_FILE, logs); ``` ### Technical Analysis `ChatLearning.log()` writes message roles and complete message contents to `log.json` without encryption, redaction, sensitivity filtering, or an explicit consent check. Conversations may contain personal information, confidential business data, authentication tokens, or other secrets. The count-based limit of 100 entries reduces the amount of active data but does not impose a time-based retention policy. The implementation also does not provide a user-facing deletion mechanism or explicitly create the data directory and files with owner-only permissions. ### Attack Path 1. A user sends a message containing personal, confidential, or credential-like data. 2. `handleSkill()` passes `context.message.content` to `ChatLearning.log()`. 3. `ChatLearning.log()` stores the complete content in `mio-companion-data/log.json`. 4. A local user, process, backup service, or compromised component with access to the workspace reads the plaintext log. 5. The stored information is exposed or used for subsequent attacks. ### Impact Assessment The vulnerability affects the confidentiality of up to 100 recently recorded messages. An attacker does not gain additional application privileges directly, but any process or account that can read the workspace may obtain sensitive conversation content. Copies retained in backups or snapshots may extend the exposure beyond the application's active retention window. ]]>- Remediation
View remediation
