T05 · Unauthorized Access and Privilege Escalation
- Location
distribution-manifest.json:2- Finding
Persistent state writes exceed the capabilities declared by the package manifest
- Content
View full analysis
Vulnerability Details
File Location:
distribution-manifest.json:2-6; related instructions inSKILL.md:39-40, 52, 68, 72
Vulnerability Type: Capability-boundary violation
Risk Level: MediumVulnerable Code
The package manifest declares only inline delivery and canonical-state read access:
json "capabilities": [ "inline-delivery", "canonical-state-read" ], "capability_ceiling": "lite",However, the skill contract instructs the agent to perform persistent writes:
markdown - **Writes**: the voice + naming draft to `memory/narrative/brand-language-codifier/`; complete canon-grade voice rules and naming taxonomy as an authorized `operation: propose` request through `registry-events.py` to `memory/events/narrative.ndjson` for narrative-registry to resolve; any product or comparative claim used as fact as a separate claims proposal tagged `[needs source]` — this skill never performs canonical mutations or adjudicates claims. - **Promotes**: the approved banned-phrase list and the naming tax as pending-decision items via `memory/open-loops.md` and a one-line summary to `memory/hot-cache.md` (ask before writing); never writes `decisions.md` directly.Additional instructions direct writes to event registries:
markdown 5. **Sweep the claims** — if a sample's voice example carries a product or comparative claim ("the fastest…", "trusted by X"), do not encode it as on-brand fact: mark it `[needs source]` and submit it to `memory/events/claims.ndjson` via an authorized `operation: propose` request to `registry-events.py`.markdown 7. **Stage for canon** — write canon-grade voice rules and the naming tax to `memory/events/narrative.ndjson` via an authorized `operation: propose` request to `registry-events.py`.markdown After delivering the canon, ask: "Save these results for future sessions?" On confirmation, save to `memory/narrative/brand-language-codifier/YY ...[truncated 2706 chars]- Remediation
View remediation
Remediation Suggestions
- Update
distribution-manifest.jsonto declare every required persistent-state write capability, including the permitted path scope and whether writes occur directly or throughregistry-events.py. - If the
liteprofile does not allow persistent writes, remove the write and staging instructions and return proposed records inline for an explicitly authorized component to persist. - Require a distinct, informed confirmation immediately before every persistent operation. The prompt should list the exact destination path, operation type, and data being written.
- Separate inline generation from persistence so successful skill completion does not depend on undeclared writes.
- Restrict writes to an allowlist of exact paths and reject path traversal, symlinks, unexpected registry destinations, and direct canonical-state mutation.
- Validate and sanitize all user-provided or scraped material before including it in persistent proposals. Preserve provenance labels and prevent source text from being interpreted as executable agent instructions.
- Add automated package validation that compares file-write instructions and tool usage against the capabilities declared in the distribution manifest.
- Ensure the host denies operations outside declared capabilities rather than relying exclusively on natural-language instructions or user confirmation.
- Update
