T05 · Unauthorized Access and Privilege Escalation
- Location
SKILL.md:40- Finding
Persistent State Writes Exceed the Declared Capability Ceiling
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md:20, 40-43, 62, 65, 70;distribution-manifest.json:2-6
Vulnerability Type: Capability declaration mismatch and unauthorized persistent-state modification
Risk Level: MediumVulnerable Code
distribution-manifest.json:2-6:json "capabilities": [ "inline-delivery", "canonical-state-read" ], "capability_ceiling": "lite",SKILL.md:40-43:markdown - **Reads**: the user's own posts/emails/decks; open own-profiles via keyless sources where available; accepted channel projection and declared operating profile; persona evidence; current Narrative canon/version; and prior voice-view revision when revising. - **Writes**: the working dossier to `memory/social/voice-dossier-builder/`; the registry-grade voice record to `memory/events/channels.ndjson` via an authorized `operation: propose` request to `registry-events.py` for promotion ([channel-registry](../../../protocol/channel-registry/SKILL.md) is the sole writer of `memory/channels/`); disclosure or boilerplate wording that makes a product/offer claim to `memory/events/claims.ndjson` via an authorized `operation: propose` request to `registry-events.py`. - **Promotes**: a 1-2 line banned-phrase + disclosure-line pointer to `memory/hot-cache.md` (ask first); corpus gaps (platforms with under 10 usable own posts) to `memory/open-loops.md`. - **Done when**: every register row and every few-shot cites an own post (ID/URL/date); disclosure lines cover founder/employee/advocate and AI-media contexts; pillars sum to 100% with every % labeled Estimated; and the versioned record sits in `memory/events/channels.ndjson` via an authorized `operation: propose` request to `registry-events.py`.SKILL.md:62-65:markdown 5. **Codify banned phrases and disclosure lines** — the confirmed banned list, then one disclosure line per context: founder/employee posting about the product, advocate reshar ...[truncated 5410 chars]- Remediation
View remediation
Remediation Suggestions
-
Align the manifest with actual behavior. If persistent writes are necessary, declare narrowly scoped capabilities for:
- Workspace-result writes under
memory/social/voice-dossier-builder/. - Proposal-only appends to
memory/events/channels.ndjson. - Proposal-only appends to
memory/events/claims.ndjson. - Any permitted cache or open-loop updates.
- Workspace-result writes under
-
If the
liteprofile must remain read-only, remove all filesystem and registry writes. Return the dossier inline and instruct an independently authorized component to perform optional persistence. -
Require explicit, informed confirmation immediately before every persistence operation. The prompt should identify:
- The exact destination.
- The categories of data being stored.
- Whether the data will affect future sessions or other agents.
- The retention and deletion behavior.
-
Enforce manifest capabilities at runtime rather than trusting natural-language instructions. Reject undeclared write operations even if the Skill labels them “authorized.”
-
Restrict
registry-events.pywith operation-level authorization, destination allowlists, append-only semantics, schema validation, record-size limits, and audit logging. -
Minimize persisted content. Store references or redacted summaries where possible, and avoid copying sensitive source emails, decks, or posts into shared registries.
-
Clarify the consent rule in
SKILL.mdso that “Do not write memory without asking” unambiguously covers working copies, event streams, cache files, and open-loop files. -
Add automated package validation that compares paths and operations mentioned in Skill instructions against the capabilities declared in
distribution-manifest.json, failing publication when they conflict.
-
