Back to skill

Security audit

Substack

Security checks for vulnerabilities and agentic risk

Overview

This Substack skill is clearly meant for publishing, but it uses a long-lived browser session cookie and can modify live public posts with broad triggers, so it needs review before installation.

Install only if you intend this agent to publish and edit the Alternative Partners Substack. Treat SUBSTACK_SID as a sensitive account credential, keep it out of chat logs and shell history where possible, rotate it if exposed, and require explicit user confirmation before publishing or editing live posts.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (5)

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 83)May include surrounding context.

Need the numeric post ID. Get it by fetching the post:

bash
curl -s -b "substack.sid=$SUBSTACK_SID" \
  "https://alternativepartners.substack.com/api/v1/posts/{slug}" \
  | python3 -c "import json,sys; d=json.load(sys.stdin); print('id:', d.get('id'))"

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 106)May include surrounding context.

→ slug = the-revops-ai-reality-check-nobodys

bash
curl -s -b "substack.sid=$SUBSTACK_SID" \
  "https://alternativepartners.substack.com/api/v1/posts/THE-SLUG-HERE" \
  | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('id'))"

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The activation description includes broad phrases like 'update the post' and 'edit that Substack' alongside generic editing language, which can cause the skill to trigger on ambiguous user requests that are not clearly intended for publication. In a skill that can publish or modify live content, overbroad routing increases the chance of unauthorized or unintended destructive actions against a production publication.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill instructs use of a long-lived authenticated session cookie and notes it remains valid for months, but does not prominently warn that this cookie is effectively a bearer credential granting account access. Documenting how to extract and reuse the cookie without explicit handling restrictions raises the risk of accidental disclosure, insecure storage, or misuse in logs, shells, and shared environments.

Content

No source excerpt is available for this finding.

Behavior Manipulation

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Subtle instructions detected that may alter agent decision-making or introduce hidden biases.

Content

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

md
This is the `connect.sid` cookie. Valid for months unless you sign out of Substack in Chrome. To rotate: sign out of Substack → sign back in → open DevTools → copy `substack.sid` cookie value → update your secrets store.

The publisher module at `publishers/substack.py` handles auth automatically. Always use it rather than calling the API directly.

---

Static analysis

No suspicious patterns detected.