T09 · Insecure Skill Coding Practices
- Location
roon_controller.py:91- Finding
Roon Authorization Token Stored Without Enforced Restrictive Permissions
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This Roon controller skill is coherent and purpose-aligned, with clear caveats around local token storage and an unpinned dependency.
Before installing, understand that this skill can control your Roon playback and will save a Roon authorization token locally at `~/clawd/roon_config.json`. Use it only on a trusted machine, keep that file private, revoke the Roon extension authorization if you stop using it, and consider pinning `roonapi` in a virtual environment before installation.
roon_controller.py:91Roon Authorization Token Stored Without Enforced Restrictive Permissions
requirements.txt:2Unpinned Third-Party Dependency Permits Unreviewed Future Releases
The skill documentation describes behavior that reads from and writes to the local filesystem by persisting a token in ~/clawd/roon_config.json, but it does not declare any tool scope or permissions boundary. Undeclared file access reduces transparency and reviewability, and in an agent setting can enable unexpected persistence of credentials or modification of local state without explicit user awareness.
The skill persists the Roon authorization token, host, port, and core ID in a JSON file under the user's home directory without any evident permission hardening, encryption, or disclosure. A local attacker or another process running as the same user could read the token and reuse it to control the user's Roon Core, making this a real credential-handling weakness.
Writing an authorization token to a local config file without user-facing disclosure or secure storage increases the risk of credential theft and silent persistence. In this skill's context, the token grants ongoing control over playback infrastructure, so compromise enables unauthorized remote control and potentially reveals device topology such as saved host/core details.
The description and heading text emphasize Chinese command support as a built-in language behavior, but do not indicate that language selection is optional or user-configurable. Under the policy rule, forcing or presuming a specific language without explicit opt-in can be a locale/language policy issue.
The dependency is specified with a lower-bound only (roonapi>=0.1.6), which allows installation of any newer version, including future releases that may introduce breaking changes, vulnerable transitive dependencies, or malicious compromise in the supply chain. In an agent skill that directly controls a local media system and performs network discovery, dependency drift increases the risk of unexpected behavior or exposure through upstream package changes.
# Roon Control Skill Dependencies
roonapi>=0.1.6
The manifest describes controlling playback, querying the current track, auto-discovery, and zone filtering, but does not mention changing or persisting a selected zone. The code adds a separate capability to switch zones and save that preference to disk, which exceeds the described behavior even though it is related to Roon control.
No suspicious patterns detected.