T09 · Insecure Skill Coding Practices
- Location
SKILL.md:77- Finding
Predictable Shared Temporary File Enables Symlink and Output-Substitution Attacks
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill does what it says: converts user text to speech through a disclosed remote TTS endpoint, but users should avoid sending sensitive text and should use safer temporary filenames.
Install only if you are comfortable sending the text you convert to tts.wangwangit.com. Do not use it for secrets, credentials, regulated data, or confidential documents unless you have approved that provider. Prefer a unique private temporary output file instead of the documented fixed /tmp path.
SKILL.md:77Predictable Shared Temporary File Enables Symlink and Output-Substitution Attacks
SKILL.md:15User-Provided Text Is Disclosed to an External TTS Provider Without Privacy Safeguards
The skill sends user-provided text to an external third-party TTS service but does not clearly warn users that their content leaves the system and is processed by another provider. This can expose sensitive, personal, or confidential text if users assume local processing or first-party handling.
The curl example explicitly transmits text content to an external TTS service and writes the returned audio to a local file. Although this is expected for TTS, the lack of warning or safeguards makes accidental disclosure of confidential user content more likely.
单条生成:
curl -s -X POST 'https://tts.wangwangit.com/v1/audio/speech' \
-H 'content-type: application/json' \
-d '{"input":"你好","voice":"zh-CN-YunyangNeural","speed":0.9,"pitch":"0","style":"general"}' \
-o /tmp/tts_output.mp3
The Python example performs a POST request to an external TTS endpoint with raw user text in the JSON body, creating an external data transmission path. In this skill's context, the transfer is the core feature, but it remains risky because users may submit sensitive text and the skill gives no consent, minimization, or provider trust guidance.
"pitch": pitch,
"style": style
}
res = requests.post(ttsurl, json=jd, timeout=300)
res.raise_for_status()
with open(output_file, "wb") as f:
f.write(res.content)
The natural-language instructions throughout the skill are Chinese-only, which effectively forces a specific language without any opt-in or documented regional justification. The stated policy requires language constraints to be optional or clearly justified.