T09 · Insecure Skill Coding Practices
- Location
SKILL.md:251- Finding
Plaintext Collection and Storage of Account Credentials and API Secrets
- Content
View full analysis
/config/osint_config.json" os.makedirs(os.path.dirname(cfg_path), exist_ok=True) cfg = json.load(open(cfg_path)) if os.path.exists(cfg_path) else {"platforms": {}, "output": {}} # Example: save Twitter bearer token cfg["platforms"]["twitter"] = {"configured": True, "method": "api_key", "bearer_token": ""} # Example: enable PDF cfg["output"]["pdf_enabled"] = True cfg["output"]["pdf_output_dir"] = "~/Desktop" # Write back with open(cfg_path, "w") as f: json.dump(cfg, f, indent=2) os.chmod(cfg_path, 0o600) ``` ### Technical Analysis The Skill instructs the agent to request passwords and API keys directly through the conversation and then store them as plaintext JSON values. File mode `0600` reduces access by other local users, but it does not encrypt the secrets or prevent exposure through: - Conversation history and agent telemetry - Process compromise under the same user account - Backups or synchronization software - Accidental inclusion of the configuration in archives or support bundles - Later agent actions that read or disclose the file - Malware operating with the user's privileges The Skill supports storing passwords for Instagram, LinkedIn, and Facebook, even though collecting reusable account passwords is not a minimum-privilege requirement for public OSINT research. Recommending burner accounts reduces the consequence but does not correct the insecure secret-handling design. ### Attack Path 1. A user asks the Skill to configure a platform integration. 2. The Skill re ...[truncated 1088 chars]- Remediation
View remediation
