T09 · Insecure Skill Coding Practices
- Location
SKILL.md:676- Finding
Persistent Parameter Defaults Are Modified Without User Confirmation
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md, lines 676–681
Vulnerability Type: Unauthorized persistent configuration modification
Risk Level: MediumVulnerable instruction:
markdown - If a service always needs the same identifier (Vercel `teamId`, a Sentry org slug, a DigitalOcean app id), save it with `set_parameter_defaults(service_id, {"teamId": "…"})` as soon as a call using it has succeeded, without asking first, and tell the user in one line what you saved; they see it on the service's page in the Danube dashboard and can remove it there. Later calls that omit it get it filled in (`_meta.defaults_applied` says which). Don't save one-off values such as a single record id, and never save a key or token this way. - **A save replaces the stored object for that scope — it does not merge into it.** One row holds one `defaults` object per (owner, service, tool-or-all), and a save overwrites that objectTechnical Analysis
The Skill instructs the agent to call
set_parameter_defaultsautomatically after a successful service call, explicitly stating that it should do so “without asking first.” This is a separate persistent write, not an intrinsic part of the previously authorized service call.The instruction conflicts with the general consent requirement in
SKILL.mdline 27, which requires explicit user approval before any write. It also conflicts withreferences/rest-api.mdlines 209–212, which state that the identifier should be saved only after the user confirms it.The issue is amplified by the documented replacement semantics: saving defaults replaces the entire stored object for the selected owner/service/tool scope rather than merging an individual value. Therefore, an implicit save may both persist a newly observed identifier and silently remove unrelated defaults already stored in that scope.
The attacker-controllable or externally influenced value is the identifier used in the preceding task, such as a team ...[truncated 1800 chars]
- Remediation
View remediation
Remediation Suggestions
- Remove the instruction to save parameter defaults “without asking first.”
- Before invoking
set_parameter_defaults, show the user:- The service and optional tool scope.
- The identifier and value to be persisted.
- The complete replacement object.
- Existing defaults that will be removed or changed.
- Require an explicit affirmative response for this distinct persistent write.
- Read the current scoped row through
GET /v1/services/{id}/parameter-defaultsbefore constructing a replacement. - Preserve existing values only when the user explicitly approves the resulting complete object.
- Do not infer permission to persist a value from authorization of the preceding tool call.
- Align
SKILL.mdwith the confirmation requirement already documented inreferences/rest-api.md.
