T09 · Insecure Skill Coding Practices
- Location
scripts/update_profile.py:31- Finding
Plaintext Persistence of User Profiles and Conversation Excerpts Without Enforced Privacy Controls
- Content
View full analysis
100 else message, "insights_extracted": { "interests": insights.get("interests", []), "preferences": list(insights.get("preferences", {}).keys()) } } profile["conversation_history"].append(entry) # Keep only last 50 entries if len(profile["conversation_history"]) > 50: profile["conversation_history"] = profile["conversation_history"][-50:] ``` ```python save_profile(profile) ``` The initialization script uses the same unrestricted file-creation approach: ```python with open(profile_path, 'w', encoding='utf-8') as f: json.dump(default_profile, f, ensure_ascii=False, indent=2) ``` ### Technical Analysis The Skill persistently stores behavioral information—including inferred interests, communication preferences, activity patterns, timestamps, and up to 50 conversation excerpts—in a predictable plaintext file under: ```text ~/.openclaw/workspace/memory/user-profile.json ``` The file and its parent directories are created without explicit restrictive permission modes. Consequently, effective access permissions depend on the host process's `umask` and pre-existing directory permissions. On a pe ...[truncated 2285 chars]- Remediation
View remediation
