Back to skill

Security audit

toncall-videourl-text

Security checks for vulnerabilities and agentic risk

Overview

This skill appears intended to transcribe video URLs, but it needs Review because it downloads arbitrary URLs and sends extracted audio to cloud services with weak scoping and cleanup controls.

Install only if you are comfortable sending video audio to Volcengine TOS and ASR using your own credentials. Run it in a sandbox with restricted network egress, avoid private or sensitive media, and do not process arbitrary URLs from untrusted users until URL allowlisting, size/runtime limits, private signed object access, and reliable cleanup are added.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/video_url_to_text.py:376
Finding

Unrestricted Video URL Fetch Enables Server-Side Request Forgery

Content
View full analysis
5: ext = ".mp4" output_filename = f"{filename}{ext}" output_path = os.path.join(output_dir, output_filename) print(f"[1/5] 正在下载视频: {url}") print(f"保存到: {output_path}") response = requests.get(url, stream=True, timeout=300) response.raise_for_status() with open(output_path, "wb") as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) file_size = os.path.getsize(output_path) print(f"下载完成,文件大小: {file_size / 1024 / 1024:.2f} MB") return output_path, filename ``` ### Technical Analysis The URL originates directly from a command-line argument or standard input and is passed to `requests.get()` without validating its scheme, hostname, resolved IP address, port, or redirect destinations. The `requests` library follows redirects by default. An attacker can therefore cause the system running the Skill to send requests to destinations that may not be accessible from the attacker's own network position, including: - Loopback services such as `127.0.0.1` or `::1` - RFC 1918 private-network services - Link-local services and cloud instance metadata endpoints - Internal administrative interfaces - Redirectors that initially appear public but redirect to a protected address Parsing the URL solely to derive a filename extension does not provide any security validation. The downloaded response is written locally, processed by `ffmpeg`, and may subsequently be uploaded to TOS. ### Attack Path 1. An attacker submits a URL pointing directly to an inte ...[truncated 1124 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/video_url_to_text.py:390
Finding

Unbounded Media Download and ASR Polling Permit Resource Exhaustion

Content
View full analysis
Remediation
View remediation
MAX_VIDEO_BYTES: raise ValueError("Video exceeds the permitted size") f.write(chunk) ``` 3. Configure separate connection and read timeouts for every network operation. 4. Apply a total workflow deadline independent of per-request timeouts. 5. Limit ASR polling by elapsed time and attempt count, and use bounded exponential backoff. 6. Stream TOS uploads instead of reading the entire audio file into memory where supported. 7. Enforce process-level CPU, memory, disk, and runtime limits through the execution environment. 8. Delete partially downloaded files when a size limit, timeout, or validation error occurs. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/video_url_to_text.py:188
Finding

Extracted Audio May Be Exposed Through a Directly Accessible TOS Object URL

Content
View full analysis
.mp3`. 3. It constructs a direct HTTPS object URL without a read signature. 4. The ASR provider retrieves the object using that URL, implying that the URL may be usable without the caller's TOS credentials. ...[truncated 661 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/video_url_to_text.py:201
Finding

Incorrect Signed DELETE Expiration May Prevent Remote Audio Cleanup

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (14)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The documented behavior says the skill should ask the user for confirmation when only a video URL is provided, but the detected behavior indicates automatic execution on any supplied URL. It also persists transcription results locally in a texts directory, which creates an undisclosed data-retention risk for potentially sensitive audio content and can surprise users who did not consent to processing or storage.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 54)May include surrounding context.

md
py scripts/video_url_to_text.py <视频URL>

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 76)May include surrounding context.

md
py scripts/video_url_to_text.py <视频URL>

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill declares powerful behavior—network access, shell execution, and file writes—but does not scope or constrain those capabilities in metadata. In this context, the skill downloads arbitrary user-supplied URLs, invokes ffmpeg, writes local files, and uploads data externally, so the lack of explicit tool restrictions increases the blast radius if the skill is triggered unexpectedly or modified later.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

Broad trigger conditions can cause the skill to activate on ordinary messages containing a URL, leading to unintended downloading, external uploads, and transcription of content the user did not mean to process. Because this skill performs costly and privacy-sensitive actions on arbitrary remote resources, accidental invocation is more dangerous than in a purely local or read-only skill.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill description does not prominently warn users that provided media will be uploaded to a third-party cloud storage service and processed by an external speech-recognition API. This is a meaningful privacy and compliance risk because users may submit confidential or personal audio without understanding that data leaves the local environment and may be retained or logged by external providers.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/video_url_to_text.py (reported line 51)May include surrounding context.

python
# 检查ffmpeg
    try:
        result = subprocess.run(["ffmpeg", "-version"], capture_output=True)
        if result.returncode != 0:
            raise FileNotFoundError()
    except FileNotFoundError:

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/video_url_to_text.py (reported line 418)May include surrounding context.

python
]
    
    try:
        result = subprocess.run(cmd, check=True, capture_output=True)
        if os.path.exists(output_path):
            file_size = os.path.getsize(output_path)
            print(f"音频提取完成,文件大小: {file_size / 1024 / 1024:.2f} MB")

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The workflow uploads extracted audio derived from an arbitrary user-supplied video URL to Volcengine TOS and submits it to a speech-recognition API without an execution-time warning or consent prompt. In this skill's context, the data may include sensitive conversations, copyrighted material, or private recordings, so undisclosed third-party transmission materially increases privacy, compliance, and data-handling risk.

Content

No source excerpt is available for this finding.

Tainted flow: 'output_text_path' from input (line 562, user input) → open (file write)

Medium
Category
Data Flow
Confidence
65% confidence
Finding

Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.

Content

Scanner excerpt · scripts/video_url_to_text.py (reported line 474)May include surrounding context.

python
print(f"识别结果:\n{text}")
            
            os.makedirs(os.path.dirname(output_text_path), exist_ok=True)
            with open(output_text_path, "w", encoding="utf-8") as f:
                f.write(text)
            
            print(f"\n文本已保存到: {output_text_path}")

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The code comments and flow indicate that processing starts immediately once a video URL is received, which conflicts with the skill metadata requiring confirmation when a user sends only a URL. In this skill context, that matters because the workflow downloads third-party content and uploads extracted audio to external cloud services, creating privacy and consent risks if the user did not explicitly request transcription.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

All human-readable comments in the file are written in Chinese, with no indication that the skill supports other languages or that the file is intended only for a Chinese-speaking or China-specific audience. This can violate a language/locale policy when a skill implicitly forces a specific language without user opt-in or documented justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill's docstring, prompts, status messages, and usage guidance are all presented in Chinese, including required runtime prompts such as the URL input request. There is no indication that language choice is configurable or that the Chinese-only behavior is a documented regional constraint.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

The manifest description presents the workflow as downloading, transcribing, and automatically cleaning local and TOS temporary files. However, the code documentation explicitly states that it saves the recognition text to a persistent texts directory, which is additional retained output not mentioned in the manifest and changes the practical data-handling behavior.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.