Back to skill

Security audit

ifly-voiceclone-tts

Security checks for vulnerabilities and agentic risk

Overview

This skill does perform iFlytek voice cloning, but it handles voice recordings and API credentials over insecure network paths and lacks clear privacy and consent warnings.

Review before installing. Use only voices you have explicit permission to clone, avoid sensitive recordings or private synthesis text, and assume training audio, metadata, API credentials, and text are sent to iFlytek. The current implementation should be fixed to use authenticated HTTPS for training/auth and normal TLS certificate validation for synthesis before use on untrusted networks or with valuable accounts.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/voiceclone.py:49
Finding

Plaintext HTTP Transmission of Credentials, Access Tokens, and Biometric Voice Data

Content
View full analysis
dict: return { "X-Sign": sign, "X-Token": self.token, "X-AppId": self.app_id, "X-Time": str(self._ts), "Content-Type": "application/json", } def _post(self, path: str, body: dict) -> dict: """POST JSON to training API.""" self._ensure_token() sign = self._sign_body(body) headers = self._headers(sign) data = json.dumps(body).encode("utf-8") req = urllib.request.Request( TRAIN_BASE_URL + path, data=data, headers=headers, ) with urllib.request.urlopen(req, timeout=60) as resp: return json.loads(resp.read().decode("utf-8")) ``` Local biometric voice recordings are also loaded and transmitted to the plaintext training endpoint: ```python with open(audio_path, "rb") as f: audio_data = f.read() ``` ```python headers = { "X-Sign": sign, "X-Token": self.token, "X-AppId": self.app_id, "X-Time": str(ts), "Content-Type": f"multipart/form-data; boundary={boundary}", } req = urllib.request.Request( TRAIN_BASE_URL + "/task/submitWithAudio", data=body_bytes, hea ...[truncated 2584 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/voiceclone.py:79
Finding

TLS Certificate and Hostname Verification Disabled for Voice Synthesis

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (7)

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The custom WebSocket client disables both certificate validation and hostname verification for WSS connections by setting check_hostname=False and verify_mode=ssl.CERT_NONE. This makes the supposedly TLS-protected synthesis channel vulnerable to man-in-the-middle interception or modification, exposing API credentials, synthesized content, and server responses.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill clearly requires access to environment variables, local files, and outbound network connections, but the manifest does not declare any tool scope or permissions. That creates a least-privilege and transparency problem: users or hosting platforms cannot easily constrain what the skill is allowed to access, increasing the risk of unintended secret exposure or unauthorized file/network use.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

This skill enables voice cloning and uploads voice samples to a third-party service, but the documentation does not warn users about consent, impersonation, biometric privacy, or cross-border/third-party data handling risks. In this context, omission is dangerous because users may clone another person's voice or transmit sensitive biometric data without informed authorization, creating privacy, fraud, and compliance exposure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The training workflow sends user-provided audio, task metadata, and identifiers to external iFlytek endpoints, which is privacy-relevant because voice samples are sensitive biometric data. Although the code performs the upload as part of its function, there is no explicit warning in the user-facing help or comments near the upload commands that local audio will be transmitted to third-party services for training.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
98% confidence
Finding

A substantial troubleshooting section is presented only in Chinese, despite the rest of the document being primarily in English and without indicating that the user can choose their preferred language. This creates a language/locale policy issue because the skill effectively forces one language for important operational guidance without user opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

The task creation logic defaults the training language to "cn", and the CLI examples and defaults are centered on Chinese unless the user overrides them. This can be interpreted as forcing a locale-specific behavior by default rather than prompting for or clearly requesting the user's language preference.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The synthesis path transmits user-supplied text and the voice resource identifier to an external WebSocket API. The script logs progress, but it does not explicitly disclose in the help text or nearby comments that synthesis input leaves the local machine and is processed by a remote provider.

Content

No source excerpt is available for this finding.