T09 · Insecure Skill Coding Practices
- Location
index.js:21- Finding
Shell Command Injection Through Text-to-Speech Parameters
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill has a real text-to-speech purpose, but its implementation allows unsafe shell execution and overbroad file operations that need review before installation.
Review this skill carefully before installing. It appears intended for text-to-speech, but only use it in a sandboxed environment, avoid sensitive text, do not invoke the install action unless you trust the dependency source, and restrict or fix shell execution, output paths, playback paths, and cleanup behavior before broader use.
index.js:21Shell Command Injection Through Text-to-Speech Parameters
index.js:91PowerShell Code Injection Through Audio File Paths
index.js:43Unrestricted Output Path Allows Writes Outside Skill Temporary Storage
index.js:132Cleanup Action Can Delete Unrelated Files from a Shared Temporary Directory
index.js:183Runtime Installation of Unpinned and Inconsistently Declared Dependencies
The skill can execute 'pip3 install edge-tts' from within the agent via the 'install' action, giving it the ability to modify the host environment beyond normal TTS behavior. Runtime package installation is dangerous because it invokes a shell command, changes system state, may pull unpinned code from the network, and can be abused in environments where skills should not self-install software.
The skill documentation describes TTS features but does not clearly disclose that user-provided text is transmitted to Microsoft's Edge TTS service for processing. This creates a real privacy and data-handling risk because users may submit sensitive content under the assumption processing is local, causing unintended third-party disclosure.
The file is documented as an example script for using the Voice skill, with comments showing demonstration calls and an optional invocation. However, L50 exports VoiceSkill, which is never defined in this file; the only in-scope binding is skill, while VoiceSkill exists only inside the example function. This contradicts the file's apparent documented role as a standalone example and indicates behavior inconsistent with the comments.
The automatic dependency installation path runs a shell command with no confirmation, warning, or policy gate, so a caller can cause immediate environment modification simply by invoking the action. Even if the package is legitimate, silent execution of installation commands increases the risk of unintended software changes, supply-chain exposure, and misuse by downstream agents or prompts.
The skill exposes a generic 'play' action that will play any local file path provided by the caller, which is broader than the documented text-to-speech purpose. In an agent setting, this expands capability scope and could be abused to access or interact with arbitrary local media paths, trigger unwanted playback, or serve as a stepping stone for probing local filesystem state via existence/error behavior.
Line L12 says the skill 'defaults to using Chinese voice zh-CN-XiaoxiaoNeural'. This is a natural-language locale policy concern because it imposes a specific language/locale by default, and this changelog entry does not indicate that users can choose or opt in to that locale.
This markdown file documents actions that save audio to disk (tts) and remove files (cleanup), but it does not include any explicit warning that these operations write to and delete local files. For markdown files, SQP-2 applies when the skill description omits warnings about behaviors that could affect user data or system integrity.
The configuration specifies zh-CN-XiaoxiaoNeural as the default voice, which imposes a specific language/locale preference in natural-language behavior. SQP-3 applies because the file does not indicate that users are asked to choose a locale or that the Chinese default is required for a region-specific purpose.
The markdown explains how to run the cleanup action and notes file retention timing, but it does not plainly warn that invoking cleanup will delete files from the temp directory. Since file deletion is a potentially destructive operation, the skill description should make that consequence explicit.
The options section specifies zh-CN-XiaoxiaoNeural as the default voice, which imposes a specific language/locale by default. The file does not state that users can choose their preferred language before use or justify why Chinese should be the default.
The default voice is hard-coded to zh-CN-XiaoxiaoNeural, which imposes a specific language/locale choice automatically. The file does not indicate that this locale restriction is required or that users are given an explicit opt-in before the default is applied.
The dependency version is specified with a caret range (^1.0.0), which allows newer minor and patch releases to be installed automatically. This creates a supply-chain risk because future upstream changes could introduce malicious code, vulnerable transitive dependencies, or breaking behavior without the skill author explicitly reviewing and pinning the update.
"author": "zhaov1976",
"license": "MIT",
"dependencies": {
"edge-tts": "^1.0.0"
}
}
Detected: suspicious.dangerous_exec