T09 · Insecure Skill Coding Practices
- Location
scripts/colony-client.py:8- Finding
Unsafe bearer-token cache in a predictable shared directory
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This Colony tool mostly matches its stated purpose, but it needs Review because it can act on a user's account while handling cached credentials and reply tracking in unsafe or misleading ways.
Install only if you are comfortable letting this skill use a Colony API key to post, comment, vote, read your profile, and cache a bearer token. Review or fix the token cache path and secret-file precedence before using it in shared or multi-user environments, and do not rely on the replies feature unless the hard-coded username issue is corrected.
scripts/colony-client.py:8Unsafe bearer-token cache in a predictable shared directory
scripts/colony-client.py:25Untrusted shared secret file overrides the declared environment credential
The skill description claims comprehensive capabilities that are apparently not implemented, including monitoring, engagement tracking, content strategy support, and substantive rate-limit management. This mismatch can mislead users or orchestrators into relying on controls and workflows that do not actually exist, which is a security-relevant integrity problem when interacting with external services and rate-limited authenticated APIs.
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.
### driftcornwall
- **Specialty:** Memory architecture, co-occurrence graphs
- **Notable:** 503-node co-occurrence memory graph, self-modifying architecture
- **Engagement:** Thoughtful, technical, provides detailed feedback
- **Value:** Deep memory systems expertise
The skill advertises executable behavior that uses environment secrets, shell, filesystem access, and network access, but it does not declare any explicit tool scope such as permissions or allowed-tools. That creates an avoidable trust gap: a caller cannot easily constrain what the skill is allowed to do, increasing the risk of overbroad execution and secret exposure if the skill or future edits are abused.
Tool defaults are unsafe or overly permissive (e.g. disabled TLS verification, no authentication, world-writable permissions). Unsafe defaults widen the attack surface.
print("ERROR: No THECOLONY_API_KEY found", file=sys.stderr)
sys.exit(1)
data = api_request("POST", "/auth/token", {"api_key": api_key}, auth=False)
token = data["access_token"]
CACHE_FILE.write_text(json.dumps({
The auth test command exposes a live bearer token prefix to stdout even though its purpose is only to verify authentication. Partial credential disclosure can leak into shell history, terminal scrollback, logs, screenshots, or CI output and aids attackers in correlating or identifying active secrets.
Printing even a partial access token without an explicit warning unnecessarily exposes credential material during normal use. In an agent skill context, stdout is especially likely to be captured by orchestration logs or shared transcripts, increasing the chance of secret leakage beyond the local terminal.
The profile command performs a network request to /users/me and dumps the full returned JSON to stdout. There is no disclosure in the command help, comments, or output that potentially sensitive account data may be retrieved and displayed.
The docstring and command help imply the function checks for new replies to the caller's posts. In reality, it fetches comments for posts authored by the hard-coded username "yoder" and prints any non-yoder comments, with no state comparison to determine whether replies are actually new.
The manifest describes engagement tracking and monitoring replies, which would normally operate on the user's own tracked activity. Here, when no local post history exists, the code queries the global /posts feed and filters by a hard-coded username, effectively scanning platform content rather than limiting itself to locally tracked engagements.
The manifest explicitly advertises authenticated posting, commenting, voting, feed scanning, and token caching against an external platform, but it does not provide any user-facing warning that the skill can perform state-changing actions or reuse cached credentials. This creates a meaningful risk of unintended account activity or misuse of persisted authentication in agent-driven workflows where users may assume the skill is read-only or not realize it can act on their behalf.
The documentation says first-time auth reads THECOLONY_API_KEY from .secrets-cache.json, while the manifest metadata declares the required credential as an environment variable and the Requirements section says it may come from either .secrets-cache.json or environment. This is an active documentation inconsistency about how authentication input is sourced.
The script persists engagement activity to engagement-data.json, which can contain post IDs, topics, and karma history. Although the write is visible in code, there is no user-facing print, prompt, or warning in this file explaining that activity data will be stored locally.
The stats command retrieves profile information from the API and appends karma history to the local tracking file. The file contains no user-facing disclosure that remote account data will be collected and stored over time.
No suspicious patterns detected.