T09 · Insecure Skill Coding Practices
- Location
SKILL.md:18- Finding
Shell Command Injection Through Unescaped Tool Arguments
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill performs the advertised blog-to-vault sync, but it under-discloses and mishandles sensitive Ghost Admin credentials.
Review before installing. Use only a dedicated, revocable Ghost integration key, avoid storing the config in synced or shared folders, do not run show_config where logs are captured, and only configure trusted HTTPS Ghost URLs. The package should ideally be updated to use least-privileged Ghost Content API credentials or clearly disclose Admin API use, redact secrets, restrict config permissions, and avoid shell-style command templates.
SKILL.md:18Shell Command Injection Through Unescaped Tool Arguments
sync.py:398Ghost Admin API Credentials Are Exposed Through Command Arguments, Plaintext Configuration, and Configuration Output
sync.py:286Admin Bearer Token Is Sent to an Unrestricted User-Configured URL
SKILL.md:41Documentation Misrepresents Admin API Authentication as Content API Authentication
The skill exposes network access plus local file read/write behavior but does not declare any explicit tool scope or permission boundaries. That omission increases the risk of over-broad execution in host environments, making it harder for operators and automated policy systems to constrain where it can read, write, or connect.
The helper docstring says it builds a 'Ghost Admin API JWT' and that the 'Ghost Content API accepts these tokens,' while the rest of the code uses an admin endpoint ('/ghost/api/admin/posts/') and the CLI/config documentation labels the credential as a generic 'Ghost API key'. This is an intent-level contradiction because the file header claims Ghost support 'via Content API with Admin API key' (L006), but the implementation actually uses the Admin API and an Admin API token format.
The skill stores Ghost API keys in plaintext JSON on disk via save_config(), with no warning, permission hardening, or safer secret-handling option. If the config file is readable by other local users, synced to cloud storage, committed to version control, or harvested by other tools in the vault environment, the Ghost Admin credential can be exposed and used to access or modify blog content via the Ghost Admin API.
The tool description for add_ghost says it requires a Ghost Content API key, which is consistent with a read-only sync tool. However, the Supported Sources table states 'Uses Admin API JWT auth', which implies a different and more privileged API capability. This is an internal documentation contradiction about the skill's intended access level.