T09 · Insecure Skill Coding Practices
- 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;SKILL.md:42-43, 67, 71
Vulnerability Type: Capability declaration mismatch and insecure configuration
Risk Level: MediumThe package manifest declares only inline delivery and canonical-state read capabilities:
json "capabilities": [ "inline-delivery", "canonical-state-read" ], "capability_ceiling": "lite",However, the Skill contract directs the Agent to perform several persistent writes:
markdown - **Writes**: a user-facing program design + a reusable summary to `memory/launch/early-access-designer/`; stage definitions (names, entry/exit criteria, target dates, the GA opt-out-inclusion decision) 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 chosen stage ladder, graduation thresholds, and invite-throttle decision to `memory/hot-cache.md` and `memory/open-loops.md` (ask before writing); durable program choices as pending-decision items — never writes `decisions.md` directly.It also makes submission to persistent event storage part of the normal workflow:
markdown 8. **Submit the stage definitions to the registry** — stage names, entry/exit criteria, target dates, and the GA opt-out-inclusion decision go 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 as the canonical record the `RAMP-R1` stage-truth check reads. This skill never writes the canonical record.Technical Analysis
The manifest presents the package as requiring only inline output and canonical-state reading, while the Skill instructions define write operations against m ...[truncated 3400 chars]
- Remediation
View remediation
Remediation Suggestions
- Update
distribution-manifest.jsonto declare every required state-mutation capability, including event proposal and persistent memory-write operations. - Raise the capability profile or ceiling if the
liteprofile does not permit the required write operations. - Make the manifest the enforceable source of truth: the host should reject any tool call or filesystem mutation not covered by the package’s declared capabilities.
- Separate design generation from persistence. By default, return a structured proposal inline and require a separately authorized component to commit it.
- Require explicit, operation-specific user confirmation before every persistent mutation, including registry proposal submission—not only summary, hot-cache, and open-loop writes.
- Display the exact destination, operation, and data fields before requesting approval.
- Restrict writes to allowlisted paths and prevent path substitution or traversal.
- Validate and sanitize all user-provided or exported values before placing them into NDJSON or Markdown state files.
- Record an audit log containing the approving user, destination, operation, timestamp, and content digest.
- Add automated package validation that compares paths and mutating operations referenced by
SKILL.mdagainst the capabilities declared in the distribution manifest, and fail packaging when they do not match.
- Update
