Ae1
- Category
- analysis-evasion
- Confidence
- 100% confidence
- Finding
Referenced artifact was not completely inspected
- Content
md r, and full Squarespace/WordPress/Substack migrations. All 18 workflows are in `references/workflows.md`.
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly a coherent Ghost publishing assistant, but it under-discloses several high-impact actions such as browser-based code injection guidance, broad destructive API references, third-party calls, cron automation, and mass newsletter sends.
Install only if you are comfortable granting an agent the ability to publish, edit, schedule, and potentially email content from your Ghost site. Use a dedicated revocable Ghost integration key where possible, avoid owner-level tokens unless a specific task requires them, do not let the agent run browser code-injection steps autonomously, and require explicit confirmation before deletes, bulk writes, cron/webhook automation, or newsletter sends.
Referenced artifact was not completely inspected
r, and full Squarespace/WordPress/Substack migrations. All 18 workflows are in `references/workflows.md`.
Referenced artifact was not completely inspected
r, and full Squarespace/WordPress/Substack migrations. All 18 workflows are in `references/workflows.md`.
Exposing a raw DELETE /posts/{id}/ capability without guardrails creates a tool-parameter abuse risk: an agent or attacker controlling prompts could supply arbitrary post IDs and remove content. Because this skill is designed for automation against production Ghost Admin APIs, the context makes destructive misuse more dangerous than in passive documentation alone.
Filter options: `status:draft`, `status:published`, `tag:name`
### Delete post
`DELETE /posts/{id}/`
---
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
TOKEN=... # generate JWT
SLUG="your-post-slug"
curl -s "{url}/ghost/api/admin/posts/slug/${SLUG}/?fields=id,title,slug,status"
-H "Authorization: Ghost ${TOKEN}" | python3 -c "import json,sys; p=json.load(sys.stdin)['posts'][0]; print(p['status'], p['title'])"
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
required: true
binaries:
- node
- curl
- python3
license: MIT
metadata: ~
The skill asserts that no external calls occur outside the Ghost instance, but later instructs users to fetch YouTube oEmbed data from youtube.com. This is a real security/integrity issue because operators may rely on the stated trust boundary when deciding whether the skill is safe for restricted environments, and the undocumented third-party call can leak usage metadata or violate network policy.
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.
</gate>
<gate id="settings_wall" priority="5" severity="soft" scope="pre_settings">
<condition>About to write to Ghost site settings, code injection, redirects, or staff</condition>
<question>Does the task require owner-level access that integration tokens cannot provide?</question>
<pass_action>Stop. This operation is a Ghost platform limitation — outside the scope of this skill. Flag it to the user: this endpoint returns 403 for integration tokens by design and cannot be automated via the Admin API.</pass_action>
<fail_action>Do not attempt. Do not suggest browser fallback. State the platform limitation clearly and stop.</fail_action>
The documented capability scope says operations are limited to posts, analytics, images, scheduling, and newsletters, but the file also advertises theme management. That mismatch weakens least-privilege review because theme upload/activation can alter site-rendered code and carries broader security consequences than ordinary content publishing.
This is the same trust-boundary inconsistency expressed elsewhere: the document claims no external calls outside the Ghost instance while instructing a call to YouTube's oEmbed endpoint. Misrepresenting egress behavior is dangerous because defenders may approve the skill under false assumptions about data flow and network exposure.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Create a tag
r = requests.post(
f'{GHOST_URL}/ghost/api/admin/tags/',
headers=headers,
json={"tags": [{"name": "Your Tag", "slug": "your-tag"}]}
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Fetch tag id first via list, then:
r = requests.put(
f'{GHOST_URL}/ghost/api/admin/tags/{TAG_ID}/',
headers=headers,
json={"tags": [{"id": TAG_ID, "name": "Updated Name", "slug": "updated-slug"}]}
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
existing_tags = [{"id": t["id"]} for t in post.get("tags", [])]
if not any(t["id"] == TAG_ID for t in existing_tags):
existing_tags.append({"id": TAG_ID})
requests.put(
f'{GHOST_URL}/ghost/api/admin/posts/{post["id"]}/',
headers=headers,
json={"posts": [{"id": post["id"], "updated_at": post["updated_at"], "tags": existing_tags}]}
The documentation normalizes a single API call that both publishes content and emails all subscribers, but does not prominently warn about the blast radius or require confirmation. In an automation context, this increases the chance of accidental mass mail, reputational damage, spam complaints, and unintended subscriber outreach from a mistaken or malicious prompt.
The delete-post endpoint is documented as a simple operation without any warning that it is destructive and may be irreversible in an automated workflow. In a tool-using agent context, that omission raises the risk of accidental deletion, prompt-induced misuse, or unauthorized content removal affecting site integrity and business operations.
The skill is explicitly described as Admin-API-only, yet this section provides browser-based code injection instructions for modifying site-wide JavaScript. That expands the operational scope from API publishing into persistent client-side code modification, which can be abused for defacement, tracking injection, phishing content, or malicious script persistence across all visitors.
Although the text says the step is owner-only and manual, it still gives exact autonomous execution primitives for reading and overwriting the CodeMirror editor contents. In practice, those instructions are sufficient for an agent to perform a sensitive dashboard action, undermining the stated safety boundary and enabling unauthorized or insufficiently reviewed site-wide script changes.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# 1. Upload image
curl -X POST "{url}/ghost/api/admin/images/upload/" \
-H "Authorization: Ghost {token}" \
-F "file=@/path/to/image.jpg" \
-F "purpose=image"
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.
**Make — cross-post to LinkedIn:**
- Trigger: Webhooks module (post.published)
- Action: HTTP module → LinkedIn API → create post with excerpt + link
**OpenClaw cron as webhook receiver:**
You can point Ghost webhooks at your OpenClaw gateway (if externally accessible) to trigger agent actions directly on publish events.
This markdown file gives step-by-step instructions for sending a newsletter to all members by reverting and republishing an already-published post, which can affect user data and trigger irreversible outbound email. Although a precondition notes approval and irreversibility, the workflow is presented as a normal operational pattern without a stronger top-level caution banner or explicit warning summary for accidental misuse.
The example HTML hard-codes lang="en", which imposes a specific language/locale choice in the skill guidance. The file does not present this as optional or limited to English-only sites, so it can conflict with the policy against forcing a locale without user opt-in.
The skill repeatedly frames itself as Admin-API-only and says unsupported endpoints should simply be treated as platform limitations, yet this pitfall guidance suggests a different acquisition path via page HTML (data-key=) for a Content API key. That advice contradicts the stated 'Admin API only' positioning and expands operational guidance beyond the declared interface. The contradiction is documented in the text itself.
The document's book-style HTML examples and rules instruct wrapping content in lang="en" / English language settings for hyphenation, which effectively forces a specific locale in the generated content. There is no user choice or opt-in, and the guidance is framed as a general pattern rather than a clearly region- or language-specific workflow.
No suspicious patterns detected.