Back to skill

Security audit

Volcengine Ata Subtitle

Security checks for vulnerabilities and agentic risk

Overview

The skill matches its subtitle-generation purpose, but it can send audio, transcript text, and an API token to any configured endpoint, so users should review it before use.

Install only if you are comfortable sending the selected audio and transcript text to Volcengine/ByteDance infrastructure. Keep VOLC_ATA_API_BASE at the documented HTTPS endpoint, avoid custom endpoints unless you fully trust them, protect any ~/.volcengine_ata.conf file with restrictive permissions, and prefer short-lived or narrowly scoped API tokens. Do not process sensitive recordings until the endpoint validation and upload disclosure gaps are addressed.

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 (1)

T09 · Insecure Skill Coding Practices

Error
Location
volc_ata.py:43
Finding
Unrestricted API Endpoint Can Expose Credentials and Private Media<![CDATA[ ## Vulnerability Details **File Location**: `volc_ata.py`, lines 43–47, 151–169, 208–221, and 277–288 **Vulnerability Type**: Unrestricted sensitive-data transmission endpoint **Risk Level**: High ### Vulnerable Code ```python # volc_ata.py:43-47 self.app_id = app_id or os.environ.get('VOLC_ATA_APP_ID') or self.config.get('credentials', 'appid', fallback=None) self.token = token or os.environ.get('VOLC_ATA_TOKEN') or self.config.get('credentials', 'access_token', fallback=None) self.api_base = api_base or os.environ.get('VOLC_ATA_API_BASE') or self.config.get('api', 'base_url', fallback='https://openspeech.bytedance.com') self.submit_path = self.config.get('api', 'submit_path', fallback='/api/v1/vc/ata/submit') self.query_path = self.config.get('api', 'query_path', fallback='/api/v1/vc/ata/query') ``` ```python # volc_ata.py:151-169 def _submit_task( self, audio_data: str, text: str, format: str, language: str ) -> str: """Submit ATA task to API""" url = f"{self.api_base}{self.submit_path}" payload = { "app": { "appid": self.app_id }, "audio": audio_data, "text": text, "format": format, "language": language } headers = { "Authorization": f"Bearer; {self.token}", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) response.raise_for_status() result = response.json() return result.get('id') ``` ```python # volc_ata.py:208-221 def _query_task(self, task_id: str) -> Dict[str, Any]: """Query task status""" url = f"{self.api_base}{self.query_path}" payload = { "id": task_id } headers = { "Authorization": f"Bearer; {self.token}", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) response.raise_for_status() return response.json() ``` ```python # volc_ata.py:277 ...[truncated 3712 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Allowlist the production endpoint** - Accept only the documented Volcengine hostname by default. - Compare the parsed hostname exactly rather than using substring or suffix checks. - Reject embedded URL credentials, fragments, unexpected ports, and malformed URLs. 2. **Require secure transport** - Reject any scheme other than HTTPS. - Retain TLS certificate verification. - Do not provide an option to disable certificate validation in normal operation. 3. **Separate custom endpoints from production credentials** - Do not automatically send a production bearer token to a custom endpoint. - If custom endpoints are required for testing, require an explicit development mode and separate test credentials. - Display the final parsed destination and require explicit confirmation before transmitting private media to a non-default host. 4. **Constrain API paths** - Prefer fixed submission and query paths for the production service. - If paths must remain configurable, validate that they are relative paths and cannot replace the scheme or authority. 5. **Control redirects** - Disable redirects for requests containing credentials, or validate every redirect destination before following it. - Never forward authorization information to a destination outside the approved origin. 6. **Add network safety controls** - Set explicit connection and response timeouts. - Consider rejecting loopback, link-local, private, and cloud metadata addresses when custom endpoints are enabled. - Apply outbound network policy at the runtime or container level where possible. 7. **Protect credentials operationally** - Prefer environment-based secret injection or a credential store over command-line tokens, which may appear in process listings and shell history. - Document the exact data transmitted to the cloud service. - Recommend narrowly scoped, short-lived tokens and immediate rotation after s ...[truncated 1087 chars]
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (10)

Credential Access

High
Category
Privilege Escalation
Content
## 📦 快速开始
[创建豆包语音应用](https://console.volcengine.com/speech/app)
自动字幕打轴应用,获取APP ID、	Access Token、Secret Key 有20小时试用
<img width="1107" height="761" alt="398d4eed-4abe-497e-96c0-9fd0adae4f39" src="https://github.com/user-attachments/assets/7dfabbe1-b1d7-44e7-b071-007641d0cbad" />

### 安装
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The skill documentation is entirely in Chinese, including setup and usage instructions, and does not indicate that users may choose another language or that the skill is intentionally limited to a Chinese-speaking or region-specific audience. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation.

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill instructs users to run a local Python tool that reads environment variables and config files, reads input files, writes subtitle output, and makes outbound network requests, but the manifest declares no explicit tool scope or permissions. That creates an authorization gap: a reviewer or runtime may underestimate the skill's capabilities, increasing the chance that sensitive files, credentials, or network access are granted implicitly without informed approval.

Session Persistence

Medium
Category
Rogue Agent
Content
## Prerequisites

Set the following environment variables or create a config file:

### Option A: Environment Variables
Confidence
86% confidence
Finding
The skill recommends storing long-lived API credentials in environment variables or a persistent config file under the home directory, including a secret key and access token. Persistent local storage increases the risk of credential leakage through backups, logs, shell history, accidental file exposure, or other skills/processes that can read the user's home directory or environment.

Session Persistence

Medium
Category
Rogue Agent
Content
if not self.app_id or not self.token:
            print("⚠️  Warning: ATA credentials not configured")
            print("   Set VOLC_ATA_APP_ID and VOLC_ATA_TOKEN environment variables")
            print("   Or create ~/.volcengine_ata.conf config file")
            print("   Running in demo mode...\n")
    
    def _load_config(self, config_file: str) -> configparser.ConfigParser:
Confidence
60% confidence
Finding
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.

External Transmission

Medium
Category
Data Exfiltration
Content
"Content-Type": "application/json"
        }
        
        response = requests.post(url, json=payload, headers=headers)
        response.raise_for_status()
        
        result = response.json()
Confidence
93% confidence
Finding
This request submits raw user-provided audio and text to an external network endpoint. In this skill, such transmission is expected functionality, but it is still security-relevant because sensitive content is exfiltrated off-host and the endpoint can be changed via configuration or environment variables, increasing the chance of accidental or unauthorized disclosure.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The tool sends the full base64-encoded audio and subtitle text to a third-party API, but the user-facing flow does not provide a clear consent or disclosure warning at the time of transmission. This can expose sensitive media or transcript content to an external service unexpectedly, which is a privacy and data-handling risk even though external transmission is core to the skill's purpose.

External Transmission

Medium
Category
Data Exfiltration
Content
"Content-Type": "application/json"
        }
        
        response = requests.post(url, json=payload, headers=headers)
        response.raise_for_status()
        
        return response.json()
Confidence
80% confidence
Finding
The polling request sends the task identifier and bearer token to an external endpoint. This is less sensitive than the initial upload because it does not resend the full audio/text payload, but it still depends on a configurable remote host and can leak metadata and credentials if redirected to an untrusted API base.

Natural-Language Policy Violations

Low
Confidence
91% confidence
Finding
The create_subtitle method sets the default language to 'zh-CN', which imposes a specific locale unless the user overrides it. A similar default is also exposed in the CLI, and there is no opt-in flow or justification that this tool is intended only for a China-specific use case.

Natural-Language Policy Violations

Low
Confidence
91% confidence
Finding
The command-line argument parser assigns 'zh-CN' as the default language, which forces a specific locale for users who do not specify one. This can violate language/locale policy expectations when no user choice or region-specific justification is provided.

Static analysis

No suspicious patterns detected.