T06 · System Persistence
- Location
SKILL.md:136- Finding
Highest-Privilege Logon Persistence Through a Scheduled Task
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This TTS skill is mostly purpose-aligned, but it exposes a costly unauthenticated server by default and includes unsafe startup/configuration patterns that need review before installation.
Install only if you are comfortable reviewing and hardening the scripts first. Bind the server to 127.0.0.1 unless you intentionally expose it, add authentication and request limits for remote use, avoid the elevated scheduled-task example, do not run setup/start as administrator, and replace unsafe .env sourcing and shell-built JSON before using it with untrusted inputs.
SKILL.md:136Highest-Privilege Logon Persistence Through a Scheduled Task
scripts/setup.sh:135Arbitrary Shell Execution Through Sourced Environment Configuration
scripts/say.sh:32Python Code Injection Through the TTS_FORMAT Environment Variable
scripts/tts_server.py:39Unauthenticated TTS Generation Service Exposed on All Network Interfaces
scripts/setup.sh:63Unpinned Dependencies and Mutable Model Downloads
scripts/batch_seeds.sh:35JSON Injection in Batch TTS Requests
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
# One-click setup (Python 3.10+ and CUDA GPU required)
bash scripts/setup.sh ./my-tts
# Configure voice in .env
echo 'TTS_SEED=201' >> ./my-tts/.env
echo 'TTS_INSTRUCT=Your voice description here' >> ./my-tts/.env
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
# One-click setup (Python 3.10+ and CUDA GPU required)
bash scripts/setup.sh ./my-tts
# Configure voice in .env
echo 'TTS_SEED=201' >> ./my-tts/.env
echo 'TTS_INSTRUCT=Your voice description here' >> ./my-tts/.env
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
# One-click setup (Python 3.10+ and CUDA GPU required)
bash scripts/setup.sh ./my-tts
# Configure voice in .env
echo 'TTS_SEED=201' >> ./my-tts/.env
echo 'TTS_INSTRUCT=Your voice description here' >> ./my-tts/.env
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
# One-click setup (Python 3.10+ and CUDA GPU required)
bash scripts/setup.sh ./my-tts
# Configure voice in .env
echo 'TTS_SEED=201' >> ./my-tts/.env
echo 'TTS_INSTRUCT=Your voice description here' >> ./my-tts/.env
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
# One-click setup (Python 3.10+ and CUDA GPU required)
bash scripts/setup.sh ./my-tts
# Configure voice in .env
echo 'TTS_SEED=201' >> ./my-tts/.env
echo 'TTS_INSTRUCT=Your voice description here' >> ./my-tts/.env
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cp "$SCRIPT_DIR/batch_seeds.sh" "$INSTALL_DIR/batch_seeds.sh" 2>/dev/null || true
# Create .env template
if [[ ! -f "$INSTALL_DIR/.env" ]]; then
cat > "$INSTALL_DIR/.env" << 'ENVEOF'
# Qwen3-TTS Configuration
# Uncomment and edit as needed
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cp "$SCRIPT_DIR/batch_seeds.sh" "$INSTALL_DIR/batch_seeds.sh" 2>/dev/null || true
# Create .env template
if [[ ! -f "$INSTALL_DIR/.env" ]]; then
cat > "$INSTALL_DIR/.env" << 'ENVEOF'
# Qwen3-TTS Configuration
# Uncomment and edit as needed
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cp "$SCRIPT_DIR/batch_seeds.sh" "$INSTALL_DIR/batch_seeds.sh" 2>/dev/null || true
# Create .env template
if [[ ! -f "$INSTALL_DIR/.env" ]]; then
cat > "$INSTALL_DIR/.env" << 'ENVEOF'
# Qwen3-TTS Configuration
# Uncomment and edit as needed
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cp "$SCRIPT_DIR/batch_seeds.sh" "$INSTALL_DIR/batch_seeds.sh" 2>/dev/null || true
# Create .env template
if [[ ! -f "$INSTALL_DIR/.env" ]]; then
cat > "$INSTALL_DIR/.env" << 'ENVEOF'
# Qwen3-TTS Configuration
# Uncomment and edit as needed
The skill documents shell commands, environment-variable configuration, and server deployment, but it does not declare any explicit tool scope or permissions. That increases the chance an agent may invoke shell or env capabilities without clear operator consent or policy review, especially because the skill includes setup, networking, and background-process management steps.
The documentation encourages use of a network-accessible TTS service over HTTP and references binding the server to 0.0.0.0, but it does not warn that submitted text and generated audio may traverse the network unencrypted or be exposed to other hosts. In agent contexts, users may send sensitive prompts or private content to the service without realizing it is remote and potentially reachable by others.
The skill explicitly sends user-provided text to an HTTP endpoint via curl, which is an external data transmission path. In this context that is expected functionality, but it still matters because agents may forward sensitive user content to a remote server without authentication, encryption, or clear disclosure.
curl -X POST $TTS_URL/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"input": "Hello!"}' -o speech.mp3
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
python tts_server.py
# Start (background, Linux/macOS)
nohup python tts_server.py > server.log 2>&1 &
# Auto-restart (Windows — scheduled task + guard script)
# Create tts_guard.bat:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
out="$OUT_DIR/seed_${seed}.mp3"
printf "Seed %-10s → " "$seed"
t0=$(date +%s)
http_code=$(curl -s -o "$out" -w "%{http_code}" \
-X POST "http://${HOST}:${PORT}/tts" \
-H "Content-Type: application/json" \
-d "{\"text\": \"${TEXT}\", \"seed\": ${seed}, \"format\": \"mp3\"}")
This shell script sends the user-supplied TEXT value in an HTTP POST request to a TTS service, which is a network operation that transmits user data. While the script logs that generation is happening, it does not disclose that the text content is being sent over the network to a service endpoint, so users are not warned about the privacy implication of the transmission.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
AUTO_PLAY=0
fi
curl -s -o "$OUTPUT" \
-X POST "${TTS_URL}/tts" \
-H "Content-Type: application/json" \
-d "$BODY"
The script performs an HTTP POST that transmits the user's input text to a TTS server, which can affect privacy if the text contains sensitive content. Although the header comments mention a server URL, there is no clear runtime disclosure, confirmation, or explicit warning that input text is being sent over the network.
The .env template and test command embed Chinese-only sample content such as the persona text and text=你好, which presents a language-specific default in natural-language guidance. Because the script does not state that the skill is China- or Chinese-specific, this can violate language/locale policy by implicitly forcing a specific language without user opt-in.
The startup path uses source "$INSTALL_DIR/.env", which executes the file as shell code rather than parsing it as data. If an attacker can modify the local .env file or trick a user into using a tainted install directory, arbitrary commands will run with the privileges of the user starting the service.
The examples and repeated guidance for TTS_INSTRUCT are exclusively in Chinese, including the main voice description example and descriptor lists, which implies a specific language/locale expectation for users. The file does not explicitly state that this is optional, user-selected, or limited by model behavior, so it can be read as a language-policy constraint without opt-in.
The example usage and default TEXT both force Chinese output text as the built-in default behavior. This may violate language/locale policy expectations because the script does not present this as a user choice or document why a Chinese-only default is required.
The only demonstrated usage examples are Chinese text inputs, which can imply a fixed language expectation without any stated user choice or opt-in. For natural-language policy review, this is a minor locale/language constraint signal that is not explicitly justified or presented as optional.
No suspicious patterns detected.