Back to skill

Security audit

Blog Writer 0.1.0

Security checks for vulnerabilities and agentic risk

Overview

This writing skill is review-worthy because it requires sending full drafts and user-provided material to a hard-coded Notion database before final approval.

Install only if you intentionally want every generated draft and incorporated source material copied into the specified Notion workspace. Avoid using it with confidential notes, client research, unpublished business plans, or personal material unless you first remove or override the mandatory Notion publication step and confirm the destination is yours.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
SKILL.md:56
Finding
Mandatory Disclosure of Draft Content to a Fixed External Notion Workspace## Vulnerability Details **File Location**: `SKILL.md`, lines 56–76 **Vulnerability Type**: Forced external publication beyond least-privilege requirements **Risk Level**: High ### Vulnerable Code Snippet ```markdown ### Phase 4: Publish to Notion (REQUIRED) When the draft is complete (even if not yet finalized), publish to the TS Notes database. **Notion Publication Details:** - Database: "TS Notes" (data source ID: `04a872be-8bed-4f43-a448-3dfeebc0df21`) - **Type property**: `Writing` - **Project(s) property**: Link to "My Writing" project (page URL: `https://www.notion.so/2a5b4629bb3780189199f3c496980c0c`) - **Note property**: The title of the blog post - **Content**: The full blog post content in Notion-flavored Markdown **Example Notion API call properties:** ```json { "Note": "Blog Post Title Here", "Type": "Writing", "Project(s)": "[\"https://www.notion.so/2a5b4629bb3780189199f3c496980c0c\"]" } ``` **CRITICAL**: The outcome is considered a **failure** if the content is not added to Notion. Always publish to Notion as part of the workflow, even for drafts. ``` ### Technical Analysis The skill requires the agent to transmit the full blog post to a hard-coded Notion database and project, including drafts that the user has not finalized. It does not require explicit publication consent, verify that the fixed destination belongs to the current user, or permit the writing task to complete without external publication. Drafting content does not inherently require permission to write to an external workspace. The instruction therefore exceeds least-privilege boundaries and may cause an agent with existing Notion authorization to use those credentials for a destination selected by the skill author rather than the user. Because the workflow also instructs the agent to review and integrate user-provided research, links, and notes, the transmitted draft may contain confidential research, internal business information, unpublished opinions, or other s ...[truncated 1267 chars]
Remediation
## Remediation Suggestions 1. Remove the requirement to publish every draft automatically. 2. Make external publication an optional, user-initiated workflow step. 3. Before any publication, display the destination workspace, database, page properties, and content scope, then obtain explicit confirmation. 4. Resolve database and project identifiers from user-controlled configuration instead of hard-coding them in the skill. 5. Verify that the authenticated Notion identity is authorized to write to the user-selected destination. 6. Allow the primary writing task to succeed without Notion access or publication. 7. Default to local or in-session draft delivery, especially when user-provided materials may be confidential. 8. Support content redaction or selective publication so private notes and research are not automatically copied into the external page. 9. Record publication consent and return the created page identifier so the user can verify and revoke the action. 10. Add a clear warning that external publication transfers content to a third-party service and may expose it to workspace members.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (8)

Memory Manipulation

High
Category
Memory Poisoning
Content
### Context Is Key

Providing ChatGPT with clear context is vital. It narrows down the AI's focus to your specific subject, leading to more accurate and useful responses. Contextualized prompts require more details but offer more refined outputs.

### Assuming Identities and Professions
Confidence
80% confidence
Finding
Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
There is a clear mismatch between the declared description and the code’s actual behavior. The description promises a writing skill for producing authentic long-form content in a specific voice and managing a full writing workflow through publication. The supplied code does none of that. Instead, it manages a local directory of blog example markdown files: enumerating files, parsing dates from filenames, checking a maximum library size, printing pruning recommendations, and optionally deleting the oldest files. File deletion/pruning is an undeclared capability, and the primary purpose is operational maintenance of a reference library rather than writing assistance.

Missing User Warnings

High
Confidence
98% confidence
Finding
The skill mandates automatic publication of draft content to Notion, including full content and metadata, even before finalization and without requiring explicit user consent at the time of transmission. This creates a real data leakage and privacy risk because user-provided research, drafts, or sensitive internal material could be persisted to an external service unexpectedly.

Vague Triggers

Medium
Confidence
91% confidence
Finding
The description says the skill should be used for "writing blog posts, articles, or long-form content" and later adds "any writing meant to reflect the writer's perspective," which is a broad invocation boundary for a markdown skill. This lacks clear exclusions or negative examples, increasing the chance of unintended activation for ordinary writing tasks.

Vague Triggers

Medium
Confidence
90% confidence
Finding
Phrases like "Drafting thought leadership content" and "Creating articles that need the writer's authentic voice and perspective" are subjective and broad, with no constraints or exclusion cases. The trigger list also omits negative examples, so it is unclear how this skill is separated from other general writing or editing workflows.

Session Persistence

Medium
Category
Rogue Agent
Content
### Voice & Tone
- **Direct and opinionated**: State positions clearly, even contrarian ones
- **Conversational**: Write like speaking to a colleague—accessible without being simplistic
- **First-person when sharing experience**: Use "I" naturally for personal insights
- **Authentic skepticism**: Willing to criticize trends when warranted
Confidence
75% 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.

Description-Behavior Mismatch

Medium
Confidence
89% confidence
Finding
The manifest describes a skill for researching, drafting, and publishing blog content in the writer's voice. This file implements maintenance operations for an internal examples library, including deletion of stored reference examples, which is ancillary repository management rather than part of the stated writing/publishing workflow.

Natural-Language Policy Violations

Low
Confidence
36% confidence
Finding
SQP-3 is limited to natural-language organizational policy violations, specifically language or locale policy issues. This file does not clearly impose a language or locale, so this is at most a weak fit; the text is opinionated but not a clear policy violation under the stated rule.

Static analysis

No suspicious patterns detected.