T05 · Unauthorized Access and Privilege Escalation
- Location
SKILL.md:41- Finding
Persistent State Writes Exceed the Declared Capability Ceiling
- Content
View full analysis
Vulnerability Details
File Location:
distribution-manifest.json:2-6;SKILL.md:41-43,65-66,70
Vulnerability Type: Capability declaration mismatch and unauthorized persistent-state modification
Risk Level: MediumVulnerable Code
distribution-manifest.json:2-6json "capabilities": [ "inline-delivery", "canonical-state-read" ], "capability_ceiling": "lite",SKILL.md:41-43markdown - **Writes**: the durable message house to `memory/narrative/message-system-architect/`; the canon-grade block (main narrative, pillars + claim IDs, tagline) to `memory/events/narrative.ndjson` via an authorized `operation: propose` request to `registry-events.py` only — [narrative-registry](../../../protocol/narrative-registry/SKILL.md) is the sole writer of `memory/narrative-registry/canon.md`; every unsubstantiated claim to `memory/events/claims.ndjson` via an authorized `operation: propose` request to `registry-events.py` tagged `[needs source]`, never `memory/claims/claims-ledger.md` directly. - **Promotes**: the approved main narrative, tagline, and pillar set as pending-decision items via `memory/open-loops.md` (ask before writing); durable message choices are proposed as pending decisions — never written to `decisions.md` directly. - **Done when**: the house names a main narrative, three value pillars each traceable to a named positioning value theme (no orphan pillar), a tagline/one-liner, and per-persona proof points each labeled Measured / User-provided / `[needs source]`; the internal-consistency pass finds no tagline↔pillar↔proof contradiction; and every `[needs source]` claim is in `memory/events/claims.ndjson` via an authorized `operation: propose` request to `registry-events.py` with the canon-grade block queued to `memory/events/narrative.ndjson` via an authorized `operation: propose` request to `registry-events.py`.SKILL.md:65-66markdown 8. **Sweep the claims** — list every product or comparative claim used anywh ...[truncated 4382 chars]- Remediation
View remediation
Remediation Suggestions
-
Align the manifest with actual behavior. If persistent proposal writes are intentional, declare narrowly scoped capabilities for writing the specified message-house directory and event streams. Do not use a broad filesystem-write permission where path-specific authorization is available.
-
Enforce capabilities at runtime. The host or
registry-events.pymust verify that the calling skill has explicit permission to perform the requested operation. Authorization must not rely solely on the skill including the word “authorized” in its instructions. -
Require explicit confirmation for every persistent write. Present the exact destination, operation, and proposed content before writing to:
memory/events/claims.ndjsonmemory/events/narrative.ndjsonmemory/open-loops.mdmemory/narrative/message-system-architect/
-
Provide a read-only fallback. Under the current
liteprofile, return the proposed event records and message house inline without writing them. A separately authorized registry component can persist them later. -
Validate event records. Apply schema validation, destination allowlisting, length limits, provenance fields, and escaping before accepting claim or narrative proposals derived from untrusted source material.
-
Preserve separation of duties. Continue preventing this skill from writing directly to
memory/claims/claims-ledger.mdormemory/narrative-registry/canon.md. Promotion should remain the responsibility of independently authorized registry components. -
Add capability-consistency tests. Package validation should fail when skill instructions advertise persistent writes that are absent from the manifest's declared capabilities.
-
