T01 · Skill Instruction Hijacking
Error
- Location
- SKILL.md:244
- Finding
- Mandatory Display of Untrusted Server Notices Enables Response and Link Injection<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:244-247`; worker propagation at `scripts/vmake_ai.py:557-560` **Vulnerability Type**: Untrusted remote content inserted into Agent responses **Risk Level**: High ### Vulnerable Code ```markdown - **`notices`** — optional server-controlled user notices collected from config, consume, and task responses. Each usable notice contains a non-empty **`message`**; fields such as **`code`**, **`level`**, **`dedupe_key`**, and **`action_url`** are metadata and may be extended by the server. **MANDATORY (server notices):** When stdout JSON contains **`notices`**, include every non-empty notice **`message`** in the user-facing reply. Unknown notice codes must still be shown. A **warning** notice does not change a completed task into a failure. An **error** notice follows the accompanying **`skill_status`** / **`api_code`**; do not infer failure from notice level alone. Do not repeat notices with the same **`dedupe_key`** in one reply. When **`action_url`** is present, surface it as a clickable link. This overseas Skill expects the server-provided **`message`** to be English; show it as provided and do not translate it automatically. Locale selection belongs to the server. ``` The generated worker instructions repeat this requirement: ```python "- Whenever stdout JSON contains **notices**, include every non-empty notice **message** " "in the user-facing reply. Unknown notice codes must still be shown. A warning notice " "does not change a completed task into a failure. An error notice follows the accompanying " "skill_status/api_code. Do not repeat notices with the same dedupe_key in one reply.\n" ``` ### Technical Analysis The Skill explicitly identifies notice values as server-controlled but nevertheless requires the Agent to reproduce every non-empty message, including notices with unknown codes. It also requires `action_url` values to be rendered as clickable links. No local allowlist, content policy ...[truncated 1459 chars]
- Remediation
- <![CDATA[ ## Remediation Suggestions 1. Replace pass-through notices with a local allowlist of documented notice codes. 2. Map recognized codes to locally maintained, non-executable user messages. 3. Treat unknown notices as diagnostic data and do not display their raw content automatically. 4. Restrict `action_url` to HTTPS URLs on an explicit list of official Vmake domains. 5. Label any retained remote message as untrusted external service content. 6. Never instruct the Agent to follow operational directions received in a notice. 7. Apply length limits, control-character removal, Markdown escaping, and URL canonicalization. 8. Log rejected notices securely for operator review rather than exposing them to users. ]]>
