Back to skill

Security audit

WP Publisher

Security checks for vulnerabilities and agentic risk

Overview

This WordPress publishing skill is mostly transparent, but it includes unsafe credential handling and permanent delete commands that need review before use.

Review carefully before installing. Use only an https WordPress endpoint with normal certificate validation, remove -k from commands, use a dedicated least-privilege application password, and avoid enabling delete or update operations unless you explicitly need them with strong confirmation controls.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:23
Finding

TLS Certificate Verification Disabled for Authenticated WordPress Requests

Content
View full analysis
HTML content here", "status": "publish", "categories": [CAT_ID], "slug": "post-slug" }' | python3 -c "import sys,json;d=json.load(sys.stdin);print(f'Published: {d[\"link\"]}')" ``` ```bash curl -sk -u "USER:PASS" "$WP_API_BASE/posts?per_page=5&search=keyword" ``` ```bash curl -sk -u "USER:PASS" \ -X PUT "$WP_API_BASE/posts/POST_ID" \ -H 'Content-Type: application/json' \ -d '{"title":"New Title","content":"

Updated

"}' ``` ```bash curl -sk -u "USER:PASS" -X DELETE "$WP_API_BASE/posts/POST_ID?force=true" ``` ### Technical Analysis The `-k` option instructs curl to skip server-certificate verification. These requests also use HTTP Basic Authentication through `-u`, which places the WordPress username and application password in the HTTP Authorization header. Although HTTPS encryption is requested through the configured API URL, disabling certificate verification prevents the client from establishing that it is communicating with the legitimate WordPress server. An attacker able to intercept or redirect network traffic can present an arbitrary certificate, impersonate the server, and receive the authenticated request. The pre-scan concern about remote script execution is not confirmed. The pipeline on lines 23-27 sends API JSON into a local Python JSON parser; it does not pipe a d ...[truncated 1301 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:88
Finding

Unsafe Regex-Based Markdown-to-HTML Conversion Permits Active Content Injection

Content
View full analysis
\1', md) md = re.sub(r'`([^`]+)`', r'\1', md) md = re.sub(r'^### (.+)$', r'

\1

', md, flags=re.M) md = re.sub(r'^## (.+)$', r'

\1

', md, flags=re.M) md = re.sub(r'^# (.+)$', r'

\1

', md, flags=re.M) md = re.sub(r'\*\*\*(.+?)\*\*\*', r'\1', md) md = re.sub(r'\*\*(.+?)\*\*', r'\1', md) md = re.sub(r'\*(.+?)\*', r'\1', md) md = re.sub(r'\[([^\]]+)\]\(([^)]+)\)', r'\1', md) md = re.sub(r'^- (.+)$', r'
  • \1
  • ', md, flags=re.M) md = re.sub(r'(
  • .*
  • \n?)+', r'
      \g<0>
    ', md) md = re.sub(r'^(?!<[a-z/]|$)(.+)$', r'

    \1

    ', md, flags=re.M) return md.strip() ``` ### Technical Analysis The converter inserts Markdown-derived values directly into HTML without context-appropriate escaping. In particular, the link destination captured by `([^)]+)` is placed directly into an `href` attribute, and no URL-scheme allowlist is applied. Link text, headings, list items, code blocks, and inline code are likewise inserted without HTML escaping. The converter also does not remove or sanitize raw HTML already present in the Markdown input. Regex substitution is not a safe substitute for a structured Markdown parser and HTML sanitizer because it does not model HTML parsing contexts, malformed markup, attribute boundaries, or dangerous URL schemes. Whether active content ultimately executes depends on WordPress configuration and the capabilities of the account used to publish. WordPress may sanitize content for accounts without the `unfiltered_html` capability. If sanitization is absent, bypassed, altered by plugins, or the API account is pr ...[truncated 1404 chars]
    Remediation
    View remediation
    ` tags, event-handler attributes, malformed tags, encoded dangerous schemes, attribute-boundary attacks, and unsafe links. ]]>

    other

    Warning
    Location
    SKILL.md:67
    Finding

    Permanent Post Deletion Exceeds the Skill's Publishing Requirements

    Content
    View full analysis
    Remediation
    View remediation
    Vulnerability Patterns
    • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
    • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
    • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
    • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
    • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
    Findings (8)

    External Script Fetching

    High
    Category
    Supply Chain
    Confidence
    90% confidence
    Finding

    Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

    Content

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

    Get your own categories:

    bash
    curl -sk -u "USER:PASS" "$WP_API_BASE/categories?per_page=50" | python3 -c "
    import sys,json
    for c in json.load(sys.stdin):
        print(f'{c[\"id\"]}: {c[\"name\"]}')
    

    External Script Fetching

    High
    Category
    Supply Chain
    Confidence
    90% confidence
    Finding

    Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

    Content

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

    Create Post (Publish)

    bash
    curl -sk -u "USER:PASS" \
      -X POST "$WP_API_BASE/posts" \
      -H 'Content-Type: application/json' \
      -d '{
    

    Context-Inappropriate Capability

    High
    Category
    Not specified by scanner
    Confidence
    98% confidence
    Finding

    The documented force=true delete operation enables permanent removal of WordPress posts, which is far more destructive than the stated goal of publishing content. In an agent setting with reusable credentials, this creates a clear path for accidental or unauthorized data destruction.

    Content

    No source excerpt is available for this finding.

    Missing User Warnings

    Medium
    Category
    Not specified by scanner
    Confidence
    89% confidence
    Finding

    The workflow instructs use of Basic Auth application credentials and transmission of post content to a remote WordPress endpoint without warning about credential handling, TLS requirements, or privacy implications. Users may expose sensitive blog credentials or unpublished content without understanding the trust and transport assumptions.

    Content

    No source excerpt is available for this finding.

    External Transmission

    Medium
    Category
    Data Exfiltration
    Confidence
    86% confidence
    Finding

    This command transmits article content and authentication credentials to an external WordPress REST API. While external transmission is inherent to publishing, it is still security-relevant because misuse, endpoint substitution, or insecure transport could leak credentials or sensitive content.

    Content

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

    Create Post (Publish)

    bash
    curl -sk -u "USER:PASS" \
      -X POST "$WP_API_BASE/posts" \
      -H 'Content-Type: application/json' \
      -d '{
    

    Description-Behavior Mismatch

    Medium
    Category
    Not specified by scanner
    Confidence
    97% confidence
    Finding

    The skill is presented as a publishing tool, but it also documents listing, updating, and deleting posts, which materially expands its effective capability beyond the stated purpose. This kind of scope mismatch increases the chance that an agent or user invokes unintended content-modification actions with stored WordPress credentials.

    Content

    No source excerpt is available for this finding.

    External Transmission

    Medium
    Category
    Data Exfiltration
    Confidence
    82% confidence
    Finding

    The list/update workflow also sends authenticated requests and potentially sensitive content or search terms to the remote WordPress service. In context, this broadens external data exposure beyond simple publishing and increases the blast radius if the endpoint or credentials are abused.

    Content

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

    List Posts

    bash
    curl -sk -u "USER:PASS" "$WP_API_BASE/posts?per_page=5&search=keyword"
    

    Update Post

    Missing User Warnings

    Medium
    Category
    Not specified by scanner
    Confidence
    97% confidence
    Finding

    A destructive delete command is documented without any safeguard, warning, or confirmation step. In conversational or agent-driven workflows, omission of confirmation materially raises the risk of accidental irreversible deletion from ambiguous prompts or prompt injection.

    Content

    No source excerpt is available for this finding.

    Static analysis

    No suspicious patterns detected.