T09 · Insecure Skill Coding Practices
- Location
toolkit/src/config.ts:77- Finding
Unrestricted API Base URL Can Redirect or Expose the YouMind API Key
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This Hashnode publishing skill mostly matches its stated purpose, but it includes under-disclosed destructive delete commands and can send the YouMind API key to an arbitrary configured API endpoint.
Review this skill before installing. Use it only with a trusted YouMind API key, keep base_url set to https://youmind.com/openapi/v1 unless you intentionally use a local test backend, prefer draft-first publishing, and be aware that the package contains permanent delete commands not shown in the main docs.
toolkit/src/config.ts:77Unrestricted API Base URL Can Redirect or Expose the YouMind API Key
toolkit/package.json:17Dependency Installation Is Not Reproducible Because No Lockfile Is Present
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.
Most of the declared functionality is accurately represented: the code supports draft-first publishing, immediate publishing, published-post listing, draft listing, tag lookup, connectivity validation, and content adaptation/preview. However, the code also exposes additional substantive capabilities not mentioned in the description: deleting drafts, deleting published posts, and retrieving individual posts/drafts by ID. The deletion commands are especially material because they are destructive account/content operations and are not implied by the stated purpose. Also, the description mentions 'clear connector / pricing guidance when the user's Hashnode account is not ready inside YouMind,' but this specific guidance behavior is not evident in the shown code beyond generic config/connectivity error messages. Therefore the description does not fully and accurately represent the actual behavior.
The declared description presents an end-to-end Hashnode integration skill with YouMind/OpenAPI operations for writing, publishing, draft management, post listing, tag lookup, and user guidance when the account is not ready. The supplied code chunk instead only performs content adaptation and validation on markdown and metadata. While this adapter is plausibly a supporting component for a Hashnode publishing skill, the actual behavior of this chunk is materially narrower than the declared purpose and does not implement the key claimed capabilities or any network/API interactions. Therefore this is a mismatch between declared functionality and observed code behavior.
The declared description is specifically about writing and publishing Hashnode articles through YouMind, including draft-first publishing, listing published posts and drafts, tag lookup, and readiness/pricing guidance. The supplied code does none of the Hashnode-specific operations: there are no Hashnode endpoints, no publish/update post flow, no draft vs published post listing, no tag lookup, and no account-status guidance logic. Instead, the code is a reusable YouMind client for search, storage, browsing internal content, and even image generation. This is a material purpose mismatch, with multiple undeclared capabilities unrelated to the stated Hashnode connector behavior.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
Do not ask the user to fill local `hashnode.token` or `hashnode.publication_id`. That flow is obsolete.
## Draft Output Rule
All locally generated article files must go under `output/`.
Referenced artifact was not completely inspected
| `toolkit/src/cli.ts` | Real CLI used for validate / publish / list flows |
Referenced artifact was not completely inspected
| `toolkit/src/hashnode-api.ts` | YouMind OpenAPI client for Hashnode |
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 Hashnode!\n');
}
const outputPath = opts.output ? resolve(opts.output) : getDefaultPreviewOutput(filePath);
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.
The file implements chat-based image generation through a general-purpose agent mode (message_mode: 'agent') even though the declared skill is for Hashnode article publishing. This unnecessary capability expansion increases the attack surface, enables unintended outbound requests and tool use, and violates least-privilege for the skill's stated purpose.
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.
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.
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.
npm install npm run build cd .. mkdir -p ~/.youmind/config cp shared/config.example.yaml ~/.youmind/config.yaml
The README documents a --publish path for directly making content public, but it does not include an explicit warning that this action has immediate public/irreversible effects. In a publishing skill, that increases the chance of accidental disclosure of drafts, sensitive content, or unreviewed material, especially because the same tool also supports safer draft-first workflows.
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.
name: youmind-hashnode-article
version: 1.0.0
description: |
Write and publish Hashnode articles through YouMind OpenAPI. Supports draft-first
publishing, published post listing, draft listing, tag lookup, and clear connector / pricing
guidance when the user's Hashnode account is not ready inside YouMind.
triggers:
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.
This skill has no skill-specific overrides. All commands read `youmind.api_key` and `youmind.base_url` from `~/.youmind/config.yaml`. Keep the documented domain as `https://youmind.com/openapi/v1`. If you test against a local `youapi`, override `~/.youmind/config.yaml` — never the docs.
Do not ask the user to fill local `hashnode.token` or `hashnode.publication_id`. That flow is obsolete.
## Draft Output Rule
Reading ~/.youmind/author-profile.yaml introduces cross-session and potentially cross-skill persistence of user profile data. Even if intended for convenience, this can create privacy risk, unexpected personalization, or leakage of sensitive writing preferences if the shared file contains more than the skill strictly needs.
This skill is **self-contained and fully usable standalone.** The `youmind-article-dispatch` hub is an optional companion; it is NOT required for anything.
- **Primary mode — standalone:** Invoke directly ("Write a Hashnode article about X"). Works with zero other YouMind skills installed.
- **Author voice lookup:** This skill reads `~/.youmind/author-profile.yaml` (shared home directory — see `shared/YOUMIND_HOME.md`) for cross-platform voice preferences. Works whether or not dispatch is installed.
- **Optional dispatch-mode invocation:** When dispatch invokes this skill with a content brief containing `resolved_author`, the skill uses those fields as extra context. Without such a brief, the skill runs its own pipeline normally. Hashnode's depth-first DNA stays native to this skill.
- **Capability manifest (opt-in):** `dispatch-capabilities.yaml` is metadata that lets dispatch route intelligently. Deleting it reverts to defaults; it never breaks this skill.
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. **Canonical URL**: Set correctly for cross-posts (trailing slash matters)
4. **User approval**: Do not auto-publish without confirmation
### Result Links Rule
The translation section instructs that technical terms should be kept in English as an industry standard. This imposes a language choice on translated output without offering the user a preference or explaining a region-specific requirement, which conflicts with the policy against forced language/locale constraints.
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.
Platform skills MUST work in both modes:
### Standalone mode
User invokes the platform skill directly (`"Write an article about X for this platform"`):
- No content brief is provided
- Skill follows its own pipeline from scratch
- **Fallback for author DNA**: skill MAY read `~/.youmind/author-profile.yaml` to apply user voice/preferences. If the shared profile does not exist, proceed with platform defaults. Legacy fallback paths are optional migration aids, not the canonical location.
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
| File | Owned by | Purpose |
|------|----------|---------|
| `shared/DISPATCH_CONTRACT.md` (this file) | Shared | The interface definition |
| `skills/youmind-article-dispatch/SKILL.md` | Hub | Hub behavior, onboarding, dispatch pipeline |
| `skills/youmind-article-dispatch/references/content-brief-format.md` | Hub | Brief schema detail |
| `~/.youmind/author-profile.yaml` | Shared user home | User's cross-platform author DNA |
| `~/.youmind/dispatch-roster.yaml` | Shared user home | User's active platform list |