T09 · Insecure Skill Coding Practices
- Location
toolkit/src/config.ts:110- Finding
Configurable API endpoint can disclose the YouMind API key and user content
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches its Qiita writing purpose, but its CLI can publish publicly despite private-by-default documentation and includes account-changing commands that deserve review.
Review this skill before installing. Use it only with a YouMind API key you are comfortable granting publishing-related access, keep youmind.base_url on the official YouMind endpoint unless you are deliberately testing locally, and do not rely on the current CLI to keep posts private unless you explicitly pass --private or set private: true in front matter. Treat update, delete, and set-public commands as account-impacting actions.
toolkit/src/config.ts:110Configurable API endpoint can disclose the YouMind API key and user content
toolkit/src/cli.ts:115Publishing defaults to public despite the documented private-by-default policy
toolkit/package.json:17Dependency installation is not reproducible because no lockfile is provided
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
The skill advertises a narrower write/publish workflow, but the analysis indicates it may also support listing, reading, updating, deleting, and changing visibility of existing Qiita content. Undisclosed content-management capabilities increase the chance that a user invokes the skill without understanding it can modify or remove existing articles, creating integrity and account-impact risk.
The skill advertises a narrower write/publish workflow, but the analysis indicates it may also support listing, reading, updating, deleting, and changing visibility of existing Qiita content. Undisclosed content-management capabilities increase the chance that a user invokes the skill without understanding it can modify or remove existing articles, creating integrity and account-impact risk.
The skill advertises a narrower write/publish workflow, but the analysis indicates it may also support listing, reading, updating, deleting, and changing visibility of existing Qiita content. Undisclosed content-management capabilities increase the chance that a user invokes the skill without understanding it can modify or remove existing articles, creating integrity and account-impact risk.
The skill advertises a narrower write/publish workflow, but the analysis indicates it may also support listing, reading, updating, deleting, and changing visibility of existing Qiita content. Undisclosed content-management capabilities increase the chance that a user invokes the skill without understanding it can modify or remove existing articles, creating integrity and account-impact risk.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
# YouMind Qiita OpenAPI Reference
This skill talks to Qiita exclusively through YouMind's OpenAPI proxy. The
end user only ever supplies a YouMind API key; the Qiita personal access
token is held server-side after the user connects Qiita inside YouMind.
Base URL: `https://youmind.com/openapi/v1` (override via `youmind.base_url`
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
1. `~/.youmind/config/<skill>.yaml`
2. `~/.youmind/config.yaml`
This is now a hard requirement. Article skills do **not** read repo-local `config.yaml` files or `~/.youmind-skill/credentials.yaml` anymore.
## Canonical Files
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
1. `~/.youmind/config/<skill>.yaml`
2. `~/.youmind/config.yaml`
This is now a hard requirement. Article skills do **not** read repo-local `config.yaml` files or `~/.youmind-skill/credentials.yaml` anymore.
## Canonical Files
Skill instructs the agent to omit warnings, disclaimers, or ethical commentary. Stripping safety caveats hides risk from the user and is a common jailbreak preamble.
}
console.log('');
} else {
console.log('No warnings. Article looks good for Qiita!');
console.log('');
}
The skill uses 'env' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The skill uses 'network' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
cd toolkit && npm install && npm run build && cd ..
mkdir -p ~/.youmind/config cp shared/config.example.yaml ~/.youmind/config.yaml
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
### Publishing prerequisite
Before publishing, connect your Qiita account inside YouMind. The skill no longer reads `qiita.access_token` locally and should never ask the user to paste a Qiita token into this repo.
### Get a YouMind API Key
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
cd toolkit && npm install && npm run build && cd ..
mkdir -p ~/.youmind/config cp shared/config.example.yaml ~/.youmind/config.yaml
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
cd toolkit && npm install && npm run build && cd ..
mkdir -p ~/.youmind/config cp shared/config.example.yaml ~/.youmind/config.yaml
The skill prominently advertises direct publishing and local file writes without an equally prominent warning that these actions can create persistent local artifacts and modify an external account. Users may invoke it expecting drafting help only, leading to unintended publication or sensitive content being stored on disk.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
> **AI Qiita Article Writer installed!**
>
> Tell me your topic and I'll write and publish a Qiita article for you.
>
> **Try it now:** "Write a Qiita article about building CLI tools with TypeScript"
>
The skill instructs writing article drafts to a shared home directory accessible to all YouMind skills, which creates cross-skill data exposure and persistent local storage of potentially sensitive unpublished content. In a multi-skill environment, other skills may read or misuse those drafts unless access boundaries and retention rules are clearly enforced.
## Draft Location Rule
**Canonical:** write local article Markdown files to `~/.youmind/articles/qiita/<slug>.md`. This shared home directory is available to all YouMind skills — see [`shared/YOUMIND_HOME.md`](shared/YOUMIND_HOME.md).
**Legacy fallback** (if `~/.youmind/` is not writable): `skills/youmind-qiita-article/output/<slug>.md`.
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
1. **Self-critique**: Pass all checklist items in the playbook's Step 6
2. **Conformance report**: Generate and present to user (Step 7/8)
3. **Image check**: Zero `cdn.gooo.ai` URLs in final body
4. **User approval**: Do not auto-publish without confirmation
### Result Links Rule
The manifest sets primary_language: "ja", and nearby fields such as the tagline and audience reinforce a fixed Japanese-language output. This is a natural-language locale constraint, but the file does not indicate that users can choose another language or explicitly opt in to Japanese-only behavior.