T01 · Skill Instruction Hijacking
Note
- Location
- scripts/svg_bar_chart.py:242
- Finding
- Unavoidable Third-Party Branding in Generated Artifacts<![CDATA[ ## Vulnerability Details **File Location**: `scripts/svg_bar_chart.py:242-246`; `scripts/png_longform.py:385-388`; documented in `SKILL.md:158-161` **Vulnerability Type**: Persistent output manipulation **Risk Level**: Low ### Complete Code Snippets From `scripts/svg_bar_chart.py:242-246`: ```python <rect y="{chart_bottom+24}" width="{W}" height="{FOOTER_H}" fill="{theme['bg_alt']}"/> <text x="{W//2}" y="{chart_bottom+24+28}" font-size="11" fill="{theme['text_muted']}" font-family="Microsoft YaHei,sans-serif" text-anchor="middle">{footer}</text> <text x="{W//2}" y="{chart_bottom+24+46}" font-size="10" fill="#2A3A50" font-family="Microsoft YaHei,sans-serif" text-anchor="middle">Powered by WorkBuddy</text> ``` From `scripts/png_longform.py:385-388`: ```python # WorkBuddy watermark wm = "Powered by WorkBuddy" wm_w = draw_obj.textbbox((0, 0), wm, font=F_SMALL)[2] draw_obj.text((self.W - wm_w - PAD, y0 + 22), wm, font=F_SMALL, fill=(38, 58, 82)) ``` ### Technical Analysis Both renderers unconditionally add the fixed text `Powered by WorkBuddy` to generated artifacts. The Skill presents itself as a general visualization utility, but it provides no documented or implemented option to disable or replace this attribution. This behavior modifies user-requested output with unrelated fixed branding. It does not grant code execution or system privileges, but it can affect the integrity and provenance of reports intended for publication. ### Attack Path 1. A user loads the Skill and requests an SVG/HTML chart or PNG report. 2. The relevant renderer processes the supplied report data. 3. The renderer unconditionally inserts the WorkBuddy watermark. 4. The user publishes or distributes the artifact without realizing that third-party branding was embedded. ### Impact Assessment No operating-system privileges, credentials, or data-access capabilities are obtained. The impact is limited t ...[truncated 157 chars]
- Remediation
- <![CDATA[ ## Remediation Suggestions - Remove the hard-coded watermark from both rendering implementations. - If attribution is required, expose an explicit configuration option such as: ```python config = { "branding_enabled": False, "branding_text": "" } ``` - Make branding disabled by default or clearly disclose it before rendering. - Ensure the caller can replace or omit attribution without editing source code. - Add tests verifying that generic output does not contain unexpected branding when branding is disabled. ]]>
