Back to skill

Security audit

Moark Tts

Security checks for vulnerabilities and agentic risk

Overview

This TTS skill largely does what it advertises, but it has review-worthy security gaps around fetching user-supplied audio URLs and handling an API key during async polling.

Review before installing. Use this only with a Gitee AI key you are comfortable using from the agent environment, avoid submitting secrets or third-party voice samples without consent, and do not pass reference audio URLs that could point to internal, local, metadata, or private-network resources. Prefer a patched version that validates download URLs, limits file size/type, and only sends the API key to trusted Gitee AI endpoints.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (2)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/perform_voice_feature_extraction.py:37
Finding

Arbitrary URL Fetch Enables SSRF and Sensitive Content Relay

Content
View full analysis
str: if not url.startswith(("http://", "https://")): raise VoiceFeatureConfigError("--file-url must be an http(s) URL") return url ``` ```python def download_file(file_url: str, timeout: int) -> tuple[str, str, bytes]: status, headers, content = request_http("GET", file_url, timeout=timeout) if status < 200 or status >= 300: raise RuntimeError(f"Failed to download file URL: HTTP {status}") parsed = parse.urlparse(file_url) filename = PurePosixPath(parsed.path).name or "audio.bin" content_type = headers.get("Content-Type") or mimetypes.guess_type(filename)[0] return filename, content_type or "application/octet-stream", content ``` ```python file_url = ensure_file_url(args.file_url) filename, content_type, file_content = download_file(file_url, timeout=args.timeout) boundary, body = build_multipart_body( prompt=args.prompt, model=args.model, filename=filename, file_content_type=content_type, file_content=file_content, ) _, headers, raw_response = request_http( "POST", API_URL, headers={ "Authorization": f"Bearer {api_key}", "X-Failover-Enabled": args.failover_enabled, "Content-Type": f"multipart/form-data; boundary={boundary}", }, body=body, timeout=args.timeout, ) ``` ### Technical Analysis The script accepts a user-controlled `--file-url` and validates only that its literal value starts with `http://` or `https://`. It does not validate the destination hostname or resolved IP address. Consequently, the process can be instructed to issue HTTP GET requests to: - Loopback addresses such as `127.0.0.1` or `::1` - RFC 1918 private network ranges - ...[truncated 2719 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/perform_tts.py:668
Finding

Gitee AI Bearer Token Can Be Sent to an Untrusted Async Polling URL

Content
View full analysis
" raise RuntimeError(f"Async task '{fallback_task_id}' does not contain a poll URL") while True: response = request_http( "GET", poll_url, headers={"Authorization": f"Bearer {api_key}"}, ) current = response.json() ``` ### Technical Analysis The async task creation response controls `task["urls"]["get"]`. The script uses this value directly as `poll_url` and attaches the user's Gitee AI bearer token to the resulting request. There is no verification that the polling URL: - Uses HTTPS - Targets `ai.gitee.com` - Uses the same origin as `BASE_URL` - Has an approved path - Resolves to an expected public address Therefore, a malformed or compromised API response can direct the script to send `Authorization: Bearer ` to an attacker-controlled server. The HTTP client also follows redirects by default, and no explicit same-origin redirect policy is enforced. Polling an asynchronous Gitee AI endpoint is required for the declared TTS function. Sending the credential to an arbitrary endpoint supplied in response data is not required and exceeds minimum privilege. The documented fallback endpoint based on `task_id` provides a safer design that does not require trusting an arbitrary URL. ### Attack Path 1. The user initiates TTS generation using a model that operates asynchronously. 2. The script sends the initial task request to the legitimate Gitee AI endpoint. 3. A compromised service, manipulated response source, or unsafe upstream respon ...[truncated 1281 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • 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
Findings (8)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill claims broad model-specific TTS and voice-feature functionality, including parameter routing and Qwen multi-input support, but the analysis indicates the implementation does not actually provide those behaviors. Security-wise, this is dangerous because users and orchestrators may rely on unsupported safeguards or input handling, causing unintended data transmission, malformed requests, or unsafe fallback behavior when the real code does something simpler than advertised.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill invokes Python scripts, uses an API key from the environment, performs network requests to external Gitee AI endpoints, and may write output files, but it does not declare an explicit tool/permission scope. That creates an authorization and review gap: operators and users cannot easily tell what capabilities the skill will exercise, which increases the chance of overbroad execution in agent environments.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill processes user text, reference audio URLs, and possibly voice-cloning inputs by sending them to external Gitee AI services, but it does not clearly warn users about that data flow. In this context, the omission is meaningful because TTS prompts and voice samples may contain sensitive content or biometric data, so users need notice before sharing them with a third party.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This markdown file instructs the skill to use voice feature extraction and pass user-supplied audio reference URLs, and similar cloning-style prompts appear elsewhere in the file. The document gives routing mechanics but does not warn that uploaded or referenced voice samples may be transmitted to external services and may have privacy implications.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The file says to map the user phrases “单音频模式” and “角色音频模式” to mode flags, which hard-codes a specific language for activation behavior. Because no opt-in, alternative language phrasing, or justification is provided, this is a natural-language locale policy issue.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This script explicitly accepts sensitive reference inputs such as prompt text and prompt audio URLs, then forwards them to the external Gitee AI TTS service. In a skill context, users may provide voice samples or transcripts containing personal, confidential, or biometric data without realizing that those materials leave the local environment, so the lack of an explicit disclosure/consent step is a real privacy and compliance risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script fetches audio from a user-supplied URL and forwards that content to a third-party API, which creates a real privacy and data-handling risk if users do not clearly understand that their audio will be downloaded locally and retransmitted off-origin. Audio content can contain sensitive biometric or personal information, so silent forwarding to an external service can violate user expectations, internal policy, or compliance requirements even if the behavior is functionally intended.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The file states that scripts may produce AUDIO_FILE and VOICE_FEATURE_FILE outputs and instructs the agent to return saved file paths, but it does not disclose that artifacts may be written locally. For markdown files, behaviors affecting user data or system integrity should include a warning when local file creation is possible.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.