Back to skill

Security audit

youmind-devto-article

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its Dev.to writing and publishing purpose, but it needs Review because it handles publishing credentials/content and can send them to an unrestricted configured endpoint while installing unpinned npm packages.

Review this before installing. Keep youmind.base_url set to https://youmind.com/openapi/v1, do not use config overrides from untrusted sources, protect ~/.youmind/config.yaml, and assume drafts, prompts, searches, and publish actions may be sent to YouMind and then Dev.to. Prefer draft mode and give explicit approval only when you want a public post. The publisher should add endpoint validation and a lockfile before this is treated as low-risk.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
toolkit/src/config.ts:75
Finding

Configurable API Base URL Can Expose Credentials and User Content to Arbitrary Hosts

Content
View full analysis
; } { const raw = loadLayeredConfig(); const youmind = isPlainObject(raw.youmind) ? raw.youmind : {}; const imageYouMind = getImageYouMindConfig(raw); const apiKey = (typeof youmind.api_key === 'string' && youmind.api_key) || (typeof imageYouMind.api_key === 'string' && imageYouMind.api_key) || ''; const configuredBaseUrl = typeof youmind.base_url === 'string' ? normalizeBaseUrl(youmind.base_url) : ''; return { raw, apiKey, baseUrl: configuredBaseUrl || DEFAULT_YOUMIND_OPENAPI_BASE_URL, }; } ``` The resulting URL is used for credential-bearing requests: ```ts const response = await fetch(`${cfg.baseUrl}${endpoint}`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': cfg.apiKey, 'x-use-camel-case': 'true', }, body: JSON.stringify(body), signal: AbortSignal.timeout(30_000), }); ``` The general YouMind client uses the same pattern: ```ts const resp = await fetch(`${cfg.baseUrl}${endpoint}`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': cfg.apiKey, }, body: JSON.stringify(body), signal: AbortSignal.timeout( endpoint.includes('Chat') || endpoint.includes('Message') ? 120_000 : 15_000 ), }); ``` ### Technical Analysis The `youmind.base_url` con ...[truncated 2323 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
toolkit/package.json:19
Finding

Unpinned npm Dependencies and Missing Lockfile Create Supply-Chain Risk

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
Findings (76)

Tp2

High
Category
MCP Tool Poisoning
Confidence
85% confidence
Finding

Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.

Content

No source excerpt is available for this finding.

Tp2

High
Category
MCP Tool Poisoning
Confidence
85% confidence
Finding

Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The code substantially matches the Dev.to publishing aspect of the description: it parses markdown/front matter, adapts content for Dev.to, previews it, validates connectivity, and publishes drafts or public articles. However, key declared capabilities are not evidenced in this chunk: there is no implementation of topic research through a YouMind knowledge base, nor any obvious AI-driven article writing/generation. Instead, the tool operates on an existing markdown file. In addition, the code includes extra account-management features not mentioned in the description, including listing personal articles/drafts/published posts and publishing/unpublishing existing articles by ID. Those are materially relevant capabilities beyond simple writing/publishing. Therefore the description does not accurately represent the actual behavior overall.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The declared description presents a full Dev.to article creation and publishing skill with AI-assisted research and one-click publishing. The supplied code chunk only handles content adaptation/validation for Dev.to-formatted Markdown. It generates front matter, normalizes tags, warns about code blocks, and adds a TL;DR section, but it does not access any knowledge base, generate article content, tailor writing for a developer audience, or publish anything to Dev.to. This is a material description-to-behavior mismatch, though the formatting portion of the description is consistent with the code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The code clearly aligns with part of the description: it interacts with Dev.to via YouMind and supports creating and publishing articles. However, the declared purpose emphasizes AI-assisted writing features such as topic research via a knowledge base, developer-audience adaptation, and Markdown/front matter generation; none of those behaviors appear in this code. Instead, this chunk is strictly an API client for article CRUD-style management and publication state changes. It also exposes additional management operations (listing, fetching, updating, unpublishing) that are not reflected in the declared description. This is a meaningful description/behavior mismatch, even though the overall domain (Dev.to article publishing) is related.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The code chunk is narrowly a publisher wrapper for Dev.to. It accepts already-written title and markdown content, performs basic validation and tag sanitization, and publishes through a Dev.to API helper. The declared description, however, presents a broader skill that can research topics, write articles with AI, adapt style for a developer audience, and format Markdown with front matter before publishing. Those capabilities are not present in this code. The publishing portion does align with the declaration, but the implemented behavior is materially narrower than the declared purpose, so this is a mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared purpose centers on creating and publishing Dev.to posts. The supplied code does not interact with Dev.to at all—there are no Dev.to API calls, authentication flows, or publishing endpoints. Instead, the code is a general-purpose YouMind client: it searches a YouMind knowledge base, performs web search, lists and fetches boards/materials/crafts, saves Markdown documents into YouMind, mines topics from YouMind content, and can generate images through a YouMind chat agent. While topic research via YouMind partially aligns with the description, the core promised behavior—AI writing for Dev.to, formatting with front matter, and one-click publication to Dev.to—is absent. Additionally, image generation is an undeclared capability. Therefore the description does not accurately represent the code’s actual behavior.

Content

No source excerpt is available for this finding.

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · SKILL.md (reported line 4)May include surrounding context.

md
---
name: youmind-devto-article
version: 1.0.0
description: |
  Write and publish Dev.to articles with AI — topic research via YouMind knowledge base,
  developer-audience adapted writing, Markdown with front matter formatting, and one-click publishing.
  Use when user wants to "write Dev.to article", "publish to Dev.to", "post on Dev.to".
triggers:
  - "dev.to article"
  - "devto article"
  - "publish to dev.to"
  - "publish to devto"
  - "post on dev.to"
  - "write for dev.to"
  - "dev.to post"
  - "devto post"
  - "Dev.to 文章"
  - "发布到 Dev.to"
platforms:
  - openclaw
  - claude-code
  - cursor
  - codex
  - gemini-cli
  - win

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · shared/YOUMIND_HOME.md (reported line 34)May include surrounding context.

md
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

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · shared/YOUMIND_HOME.md (reported line 46)May include surrounding context.

md
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

Anti-Refusal Statement

High
Category
Anti-Refusal
Confidence
80% confidence
Finding

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.

Content

Scanner excerpt · toolkit/src/cli.ts (reported line 273)May include surrounding context.

ts
}
      console.log('');
    } else {
      console.log('No warnings. Article looks good for Dev.to!');
      console.log('');
    }

Lp1

High
Category
MCP Least Privilege
Confidence
75% confidence
Finding

The skill uses 'env' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.

Content

No source excerpt is available for this finding.

Lp1

High
Category
MCP Least Privilege
Confidence
75% confidence
Finding

The skill uses 'network' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

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.

Content

Scanner excerpt · README.md (reported line 26)May include surrounding context.

1. Install dependencies

cd toolkit && npm install && npm run build && cd ..

2. Create shared config (recommended)

mkdir -p ~/.youmind/config cp shared/config.example.yaml ~/.youmind/config.yaml

text

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

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.

Content

Scanner excerpt · README.md (reported line 44)May include surrounding context.

md
### Publishing prerequisite

Before publishing, connect your Dev.to account inside YouMind. The skill no longer reads `devto.api_key` locally and should never ask the user to paste a Dev.to token into this repo.

### Get a YouMind API Key

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

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.

Content

Scanner excerpt · references/api-reference.md (reported line 130)May include surrounding context.

md
### Publishing prerequisite

Before publishing, connect your Dev.to account inside YouMind. The skill no longer reads `devto.api_key` locally and should never ask the user to paste a Dev.to token into this repo.

### Get a YouMind API Key

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

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.

Content

Scanner excerpt · README_CN.md (reported line 27)May include surrounding context.

cd toolkit && npm install && npm run build && cd ..

2. 创建共享配置

mkdir -p ~/.youmind/config cp shared/config.example.yaml ~/.youmind/config.yaml

text

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

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.

Content

Scanner excerpt · README_CN.md (reported line 27)May include surrounding context.

cd toolkit && npm install && npm run build && cd ..

2. 创建共享配置

mkdir -p ~/.youmind/config cp shared/config.example.yaml ~/.youmind/config.yaml

text

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill prominently advertises direct publishing through YouMind/Dev.to, but it does not give a strong upfront privacy and data-transfer warning before encouraging use. Users may provide unpublished drafts, proprietary material, or sensitive notes without realizing that content will be transmitted to external services and potentially published to a connected third-party account.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

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.

Content

Scanner excerpt · SKILL.md (reported line 53)May include surrounding context.

md
> **AI Dev.to Article Writer installed!**
>
> Tell me your topic and I'll write and publish a Dev.to article for you.
>
> **Try it now:** "Write a Dev.to article about building CLI tools with TypeScript"
>

Session Persistence

Medium
Category
Rogue Agent
Confidence
93% confidence
Finding

The skill instructs saving article drafts into a shared home directory accessible to all YouMind skills. That creates a cross-skill persistence channel where sensitive unpublished content may be read, reused, or exfiltrated by other skills, especially if permissions and isolation boundaries are weak.

Content

Scanner excerpt · SKILL.md (reported line 153)May include surrounding context.

md
## Draft Location Rule

**Canonical:** write local article Markdown files to `~/.youmind/articles/devto/<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-devto-article/output/<slug>.md`.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

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.

Content

Scanner excerpt · SKILL.md (reported line 197)May include surrounding context.

md
1. **Self-critique**: Pass all checklist items in the playbook's Step 6
2. **Conformance report**: Generate and present to user (Step 7)
3. **User approval**: Do not auto-publish without confirmation

### Result Links Rule

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The reference explicitly states that setting published: true will publish immediately, but it does not require a user-facing confirmation, warning, or safeguard before triggering a public post. In a publishing skill, this creates a real risk of accidental disclosure, reputational harm, or unintended release of drafts if an agent or workflow chooses the publish path without clear user consent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The Translate sub-mode is defined as converting an article from another language into an English Dev.to post. This imposes a specific language choice by default, and the file does not offer the user a language option or explain why English is required for this workflow.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The pipeline explicitly instructs the agent to read ~/.youmind/config.yaml to obtain an API key, but it does not require explicit user consent or a clear notice that local credentials will be accessed. In an agent setting, silent access to secrets from local config can violate user expectations and broaden the blast radius if the key is later logged, echoed, or used in unintended external requests.

Content

No source excerpt is available for this finding.