Back to skill

Security audit

Podcast Generator

Security checks for vulnerabilities and agentic risk

Overview

The skill does what it claims, but it can make real SkillPay billing calls and write generated files with weak safety controls.

Review before installing if this would run automatically or in a shared environment. Only use it where SkillPay charges are explicitly approved, output paths are controlled, and podcast text is suitable for external TTS processing. Prefer a pinned dependency setup and isolate execution from sensitive files and environment variables.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/generate_audio.py:50
Finding

Predictable Shared Temporary Files Allow Local File Overwrite and Cross-Run Interference

Content
View full analysis
/dev/null 2>&1") == 0 if has_ffmpeg and len(tmps) > 1: lst = "/tmp/pod_list.txt" with open(lst, "w") as f: for t in tmps: f.write(f"file '{t}'\n") ``` ### Technical Analysis The audio generation process creates temporary media files using predictable names such as `/tmp/pod_000.mp3` and writes the FFmpeg input list to the fixed path `/tmp/pod_list.txt`. The system temporary directory is commonly writable by all local users. The code does not: - Create a private, randomly named temporary directory. - Use exclusive file creation. - Reject symbolic links. - Verify file ownership or type before writing. - Isolate files belonging to concurrent executions. The call to `open("/tmp/pod_list.txt", "w")` follows symbolic links and truncates the resolved target. A local attacker who can write to `/tmp` can pre-create that path as a symbolic link to another file writable by the victim. Predictable media names also allow concurrent or malicious executions to overwrite, replace, or mix audio segments. The temporary list file is not included in the cleanup routine, leaving stale state in the shared temporary directory. ### Attack Path 1. A local attacker identifies that the ...[truncated 1546 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:46
Finding

Unpinned Third-Party TTS Dependency Creates a Supply-Chain Risk

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (22)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Claiming TTS generation and billing integration when they may not exist is dangerous because it obscures the actual trust boundary and data flow. Users may assume audio generation and payment handling happen through vetted components, while the real implementation could bypass expected controls or fail open.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

Claiming TTS generation and billing integration when they may not exist is dangerous because it obscures the actual trust boundary and data flow. Users may assume audio generation and payment handling happen through vetted components, while the real implementation could bypass expected controls or fail open.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Claiming TTS generation and billing integration when they may not exist is dangerous because it obscures the actual trust boundary and data flow. Users may assume audio generation and payment handling happen through vetted components, while the real implementation could bypass expected controls or fail open.

Content

No source excerpt is available for this finding.

os.system() or os exec-family call

High
Category
Dangerous Code Execution
Confidence
85% confidence
Finding

os.system() and os exec-family calls run shell commands with the process's full privileges, enabling arbitrary command execution.

Content

Scanner excerpt · scripts/generate_audio.py (reported line 45)May include surrounding context.

python
def synth(segs, output, custom_voice=None):
    has_tts = os.system("which edge-tts >/dev/null 2>&1") == 0
    if not has_tts:
        print("⚠️ edge-tts 未安装,运行: pip install edge-tts")
        print(f"📝 共 {len(segs)} 个片段待转换")

os.system() or os exec-family call

High
Category
Dangerous Code Execution
Confidence
85% confidence
Finding

os.system() and os exec-family calls run shell commands with the process's full privileges, enabling arbitrary command execution.

Content

Scanner excerpt · scripts/generate_audio.py (reported line 71)May include surrounding context.

python
if not tmps:
        return {"segments": len(segs), "output": None, "error": "no segments generated"}

    has_ffmpeg = os.system("which ffmpeg >/dev/null 2>&1") == 0
    if has_ffmpeg and len(tmps) > 1:
        lst = "/tmp/pod_list.txt"
        with open(lst, "w") as f:

Unvalidated Output Injection

High
Category
Output Handling
Confidence
95% confidence
Finding

The script accepts an unvalidated output path and passes it to ffmpeg as the write target with -y, which forces overwrite. In a hosted agent environment, an attacker could choose sensitive writable paths to overwrite files, alter application state, or disrupt service operation.

Content

Scanner excerpt · scripts/generate_audio.py (reported line 77)May include surrounding context.

python
with open(lst, "w") as f:
            for t in tmps:
                f.write(f"file '{t}'\n")
        subprocess.run(["ffmpeg", "-y", "-f", "concat", "-safe", "0", "-i", lst, "-c", "copy", output],
                       capture_output=True, timeout=120)
    elif tmps:
        import shutil

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill advertises shell, network, environment-variable, and file-write capable workflows but does not declare any explicit tool scope or permissions boundary. This increases the chance the skill is invoked with broader capabilities than necessary, enabling unintended network access, filesystem writes, or secret exposure if downstream scripts are compromised or behave unexpectedly.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The activation criteria are broad enough to match many generic text-transformation requests, which can cause the skill to trigger on content outside the user's intent. In context, this is more dangerous because the skill can invoke billing, shell commands, file writes, and external services, so over-triggering may lead to unintended charges or data processing.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill does not clearly disclose that user-provided content may be sent to an external TTS service during audio generation. This creates a privacy and compliance risk, especially if users submit proprietary, personal, or regulated text under the assumption processing is local.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The listed voice options are all zh-CN voices and the surrounding labels are in Chinese, which indicates the skill template is oriented to a single language/locale. Because the file does not state that this is an optional or region-specific template, it can be read as forcing a specific locale without user opt-in.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The script retrieves SKILLPAY_API_KEY from the environment and sends it as the X-API-Key header on outbound requests. There is no visible warning, comment, or user-facing message informing operators that credentials will be consumed and sent to an external service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The charge() function can initiate a real billing action against an external payment service using only a user_id and API key, with no built-in confirmation, authorization check, or user-notice safeguard in this code path. In a skill context that auto-processes user requests, this increases the risk of unintended or unauthorized charges if the function is invoked without explicit consent handling elsewhere.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script hard-codes Chinese TTS voices (zh-CN-*) and also uses Chinese user-facing strings such as 主播 and status/error messages. This imposes a specific language/locale on all users without offering a language choice or documenting that the skill is intentionally region-specific.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The manifest says the skill converts text into podcast scripts and TTS audio, but does not disclose that it will invoke OS commands and spawn subprocesses. While TTS generation itself is in-scope, shelling out to local binaries is a broader execution capability than the stated purpose implies and could matter for auditability and deployment trust.

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/generate_audio.py (reported line 60)May include surrounding context.

python
tmp = f"/tmp/pod_{i:03d}.mp3"
        v = voice_for(s["speaker"], custom_voice)
        try:
            subprocess.run(
                ["edge-tts", "--voice", v, "--text", s["text"], "--write-media", tmp],
                capture_output=True, timeout=60, check=True
            )

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
84% confidence
Finding

The ffmpeg call itself is made safely with an argument list, but the destination output comes directly from user input and is written without validation or restriction. In an agent or service context this can overwrite arbitrary files writable by the process, enabling file clobbering or corruption of application data.

Content

Scanner excerpt · scripts/generate_audio.py (reported line 77)May include surrounding context.

python
with open(lst, "w") as f:
            for t in tmps:
                f.write(f"file '{t}'\n")
        subprocess.run(["ffmpeg", "-y", "-f", "concat", "-safe", "0", "-i", lst, "-c", "copy", output],
                       capture_output=True, timeout=120)
    elif tmps:
        import shutil

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The natural-language templates and fallback strings are entirely in Chinese, so the skill always generates Chinese podcast scripts regardless of user preference. This is a language-policy issue because the file provides no opt-in, locale selection, or justification for restricting output to Chinese.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The formatted user-facing output is hardcoded in Chinese, which imposes a specific language choice on all users. The file does not offer a language option or explain a justified locale restriction, so this is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The documentation states that Host A uses a female voice and Host B uses a male voice as a fixed default. This imposes a presentation/locale-style choice in natural language without indicating that users can select alternatives, which may conflict with organizational policies favoring user choice for such settings.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The balance() function transmits a user identifier to an external billing service without any visible minimization, consent, or authorization checks in this file. While expected for billing functionality, it still creates a privacy and misuse risk if arbitrary user IDs can be queried or if users are not informed that their identifier is sent off-platform.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The payment_link() function sends user_id and billing-related metadata to an external payment provider without any visible access control or disclosure in this code. Although generating a payment link is less sensitive than charging directly, it can still expose user data and enable phishing-like misuse or unauthorized payment requests if called on behalf of other users.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code saves generation history, including titles, timestamps, durations, and cost data, to a persistent JSON file under the user's home directory. While the behavior is visible in code, there is no confirmation prompt, user-facing notice, or explanatory comment/docstring near the write operation to disclose that user-derived metadata is being stored locally.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.