T05 · Unauthorized Access and Privilege Escalation
- Location
SKILL.md:42- Finding
Persistent State Writes Exceed the Manifest's Declared Capability Ceiling
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md:42-44, 68, 72;distribution-manifest.json:2-6
Vulnerability Type: Capability declaration mismatch permitting persistent state mutations
Risk Level: MediumVulnerable Code Snippets
SKILL.md:42-44:markdown - **Reads**: launch goal, tier, and hard constraints (team availability, store-review submissions, partner/press commitments — User-provided); the stage record in `memory/launch-registry/` when one exists; competitor launch history via `scripts/connectors/producthunt.py`, community rhythm via `scripts/connectors/hn.py`, and news pulse via `scripts/connectors/gdelt.py` (all Measured); the industry event calendar (User-provided). When a connector is unavailable, the user pastes the data instead. - **Writes**: the window comparison + recommendation to `memory/launch/launch-window-planner/`; the chosen window, buffer, and embargo facts are submitted to `memory/events/launches.ndjson` via an authorized `operation: propose` request to `registry-events.py` for [launch-registry](../../../protocol/launch-registry/SKILL.md) to formalize — this skill never writes `memory/launch-registry/` directly. - **Promotes**: the recommended window, embargo lift moment, and buffer decisions to `memory/hot-cache.md` and `memory/open-loops.md` (ask before writing); propose the window choice as a pending-decision item — do not write `decisions.md` directly.SKILL.md:68:markdown 9. **Submit the decision** — write the recommended window, buffer, and embargo definition to `memory/events/launches.ndjson` via an authorized `operation: propose` request to `registry-events.py` for [launch-registry](../../../protocol/launch-registry/SKILL.md) to formalize.SKILL.md:72:markdown After delivering findings, ask: "Save these results for future sessions?" On confirmation, save to `memory/launch/launch-window-planner/YYYY-MM-DD-<topic>.md` — see [Skill Contract](../.. ...[truncated 3472 chars]- Remediation
View remediation
Remediation Suggestions
- Update
distribution-manifest.jsonto declare narrowly scoped proposal and memory-write capabilities for each required destination. Do not use a broad filesystem-write permission when a registry-specific capability is sufficient. - If the
liteprofile cannot permit state writes, remove persistence instructions from this skill. Return a structured proposal to a separately authorized registry skill instead. - Require explicit user confirmation immediately before every persistent operation, including the
operation: proposeregistry submission—not only result saving and optional promotions. - Enforce authorization inside
registry-events.py. Validate the caller identity, declared package capabilities, operation type, destination, and schema before accepting an event. - Restrict registry operations to append-only, schema-validated proposal records. The skill should not be able to approve proposals or modify canonical launch-registry data.
- Restrict memory writes to approved path prefixes and sanitize topic-derived filenames to prevent path traversal.
- Add an automated package-validation check that compares behavioral declarations such as
Reads,Writes, andPromotesagainst manifest capabilities and rejects inconsistent packages. - Keep the existing prohibition against direct writes to
memory/launch-registry/and verify that this boundary is enforced by host tooling rather than relying only on skill instructions.
- Update
