T09 · Insecure Skill Coding Practices
- Location
scripts/miniflux-cli.py:27- Finding
Miniflux API key is stored in a plaintext configuration file without enforced restrictive permissions
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill does what it says for Miniflux, but it stores and reuses an API key in ways that need careful review before installation.
Install only if you are comfortable giving the skill a Miniflux API key that can read and modify your feed state. Prefer MINIFLUX_URL and MINIFLUX_API_KEY environment variables over --api-key, use an HTTPS Miniflux URL you control, avoid running it in shared environments, and check or restrict permissions on ~/.local/share/miniflux/config.json if you ever use CLI flags.
scripts/miniflux-cli.py:27Miniflux API key is stored in a plaintext configuration file without enforced restrictive permissions
scripts/miniflux-cli.py:35Unvalidated server URL can transmit the API key over plaintext HTTP or to an unintended host
scripts/miniflux-cli.py:51API key accepted through command-line arguments and silently persisted
scripts/miniflux-cli.py:3Runtime dependency is automatically downloaded using an open-ended version constraint
The README explicitly instructs users to pass a URL and API key via CLI flags and states that these values are saved to ~/.local/share/miniflux/config.json, but it does not warn that this results in local persistent storage of sensitive credentials, likely in plaintext. API keys for feed-management access can be abused by other local users, malware, backups, or logging/history mechanisms, leading to unauthorized access to the user's Miniflux instance.
The skill advertises executable behavior that can read environment variables and persist configuration, but it does not declare any explicit tool scope or permissions boundary. In an agent setting, this weakens reviewability and can lead to unintended access to secrets or filesystem writes because consumers cannot tell from the manifest what capabilities the skill requires.
The skill instructs users to pass API keys via CLI flags and notes that they may be saved to a local config file, but it does not clearly warn about credential exposure risks. CLI arguments may be visible in shell history or process listings, and persisted credentials on disk may be accessible to other local processes or users if not protected.
The CLI stores the Miniflux API key on disk in a JSON config file, expanding the exposure window of a bearer credential beyond the current session. In agent environments, local state may be readable by other tools, users, backups, or logs, so unnecessary persistence materially increases the risk of credential theft.
The config file path is derived from XDG_DATA_HOME, which is taken directly from the environment, and the tool writes credentials to that path without validating that it is safe or intended. In an agent or multi-tenant context, a manipulated environment could redirect the API key to an attacker-controlled location or an unexpected file, causing credential disclosure or overwriting sensitive files accessible to the process.
def save_config(base_url: str, api_key: str):
CONFIG_PATH.parent.mkdir(parents=True, exist_ok=True)
with open(CONFIG_PATH, "w") as f:
json.dump({"base_url": base_url, "api_key": api_key}, f, indent=2)
The tool silently persists a sensitive API key to disk when --url or --api-key is supplied, without warning the user that a long-lived secret will be written locally. This is dangerous because users may reasonably expect CLI credentials to be session-only, and silent persistence increases the chance of accidental disclosure through shared filesystems, backups, or later compromise.
The manifest focuses on listing/reading articles, marking them read, and managing feeds/categories, which suggests interaction with existing Miniflux content state. The refresh command initiates server-side feed polling/update activity, a broader operational action not described in the manifest text.
The documentation includes commands that change Miniflux state, such as marking articles read or unread and refreshing feeds, without clearly warning that these operations modify remote data. In an agent workflow this can cause unintended actions or data integrity issues if a user expects read-only browsing behavior from a content-access skill.
The script performs remote API operations against the configured Miniflux server, potentially transmitting article metadata, feed state changes, and credentials. While this is part of the CLI's purpose, the code lacks any direct user-facing warning at execution time about contacting the remote server or using supplied credentials.
No suspicious patterns detected.