Back to skill

Security audit

Article to Podcast

Security checks for vulnerabilities and agentic risk

Overview

This podcast skill mostly does what it says, but it includes an unsafe fallback that tells agents to extract browser proxy credentials and reuse them in curl.

Review before installing. Use narrowly scoped TOS credentials limited to the podcast bucket or prefix, avoid the documented Chrome proxy-credential extraction workflow, do not paste proxy passwords into shell commands, review images before publishing, and prefer pinned dependencies or a locked environment for running the scripts.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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

Warning
Location
references/source-fetching-guide.md:11
Finding

Browser Proxy Credentials Extracted from Process Command Lines

Content
View full analysis
> page.html` ``` ### Technical Analysis The guide instructs the Agent to inspect system-wide process command lines using `ps aux` and extract plaintext proxy credentials from a Chrome process. It then places those credentials directly into a `curl` command-line argument. Article retrieval does not inherently require discovering credentials from another process. The project already documents browser-based fetching as an alternative, so process-wide credential extraction exceeds the minimum access necessary for the Skill's declared functionality. Credentials supplied as command-line arguments can be exposed through: - Process-listing tools available to other local users or processes. - Shell history and terminal logging. - Agent execution transcripts and diagnostic output. - Monitoring or auditing systems that record process arguments. ### Attack Path 1. A user asks the Skill to process an article that ordinary fetching cannot retrieve. 2. The Agent follows the fallback procedure in `source-fetching-guide.md`. 3. The Agent executes `ps aux`, exposing command-line arguments for Chrome and potentially unrelated processes. 4. The regular expression extracts a SOCKS5 URL containing a plaintext username and password. 5. The Agent inserts the credentials into a `curl` command. 6. The credentials may be retained in process listings, command history, logs, or the Agent transcript. 7. Anyone with access to those records may reuse the proxy credentials for unrelated network traffic until they are revoked. ### Impact Assessment An attacker or u ...[truncated 514 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
scripts/generate_podcast.py:2
Finding

Runtime Dependencies Are Resolved Without Version or Integrity Pinning

Content
View full analysis
=3.9" # dependencies = ["requests", "tos", "markdown"] # /// ``` The documented execution path includes: ```text uv run scripts/generate_podcast.py ... ``` ### Technical Analysis The PEP 723 dependency declaration identifies packages only by name and does not constrain versions or verify artifact hashes. When the documented `uv run` fallback is used in an environment without an existing resolution, the package manager may download dependency versions that were not part of this audit. This creates a mutable execution boundary: future releases of `requests`, `tos`, `markdown`, or their transitive dependencies can be executed without review. Although no malicious dependency is present in the audited repository, the absence of version and integrity constraints increases exposure to upstream compromise, account takeover, dependency substitution, and incompatible releases. This is particularly security-sensitive because the resulting Python process can access: - `DOUBAO_TTS_API_KEY` - `TOS_ACCESS_KEY` - `TOS_SECRET_KEY` - `TOS_BUCKET` - `TOS_REGION` - Podcast scripts, notes, source articles, images, and generated audio ### Attack Path 1. A user follows the documented `uv run scripts/generate_podcast.py ...` workflow. 2. `uv` resolves the unpinned direct and transitive dependencies from the configured package index. 3. A compromised, replaced, or newly vulnerable package version is selected. 4. Package code executes during installation, import, or normal runtime. 5. The dependency reads credentials and podcast material available to the process. 6. The compromised code can disclose data, alter uploaded objects, modify the generated RSS feed, or misus ...[truncated 705 chars]
Remediation
View remediation
", # "tos==", # "markdown==", # ] ``` 2. Generate and commit a lockfile covering direct and transitive dependencies. 3. Require artifact hashes where supported and reject packages whose hashes do not match the reviewed lock data. 4. Use a controlled, authenticated package index or internal mirror with package provenance checks. 5. Add automated dependency vulnerability and provenance scanning to the release process. 6. Perform dependency updates through reviewed change requests rather than resolving unrestricted versions during production execution. 7. Run the pipeline with narrowly scoped TOS credentials limited to the intended bucket and preferably the `podcasts/` object prefix. 8. Separate TTS and storage credentials where practical so one compromised component does not automatically receive both privilege sets. ]]>
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
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (51)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The declared description presents a broad end-to-end podcast production and maintenance skill: transforming source material into a published podcast episode and updating existing podcast metadata. The supplied code does not do those things. It only estimates or calibrates section timestamps for a podcast timeline based on script text and optionally MP3 duration, then prints the timeline. While timeline generation could be a supporting component within a podcast pipeline, this code chunk’s actual primary function is much narrower and materially different from the declared purpose. No publishing, content transformation, metadata editing, RSS repair, or source ingestion behavior is present.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents a broad end-to-end podcast production and maintenance skill: converting articles/blogs/text or URLs into published podcast episodes, plus updating shownotes, descriptions, cover art, and RSS feeds. The supplied code chunk only implements the audio synthesis stage from an existing parsed podcast script. It calls a TTS API, splits and preprocesses text, handles retries/caching, applies narration-specific audio effects, concatenates WAV clips, and encodes an MP3. There is no evidence of source ingestion from URLs/articles, no LLM/script-writing pipeline, no publishing backend interaction, and no metadata or RSS maintenance paths. This is a material mismatch in primary purpose and capabilities, not just an implementation-detail gap.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description presents a creation/publishing workflow for turning source material into a podcast episode and maintaining published episodes. However, this code chunk does not implement generation, transformation, publishing, audio synthesis, metadata updates, or feed maintenance. Its sole purpose is validation of existing script and shownotes markdown files against formatting rules. That is a materially different primary purpose, not just a supporting detail of the declared skill, so this is a clear description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This code chunk does not implement the declared podcast creation or podcast metadata maintenance workflow. Instead, it is a testing helper that mocks the tos storage SDK in memory so other scripts can be tested without real storage access. That is a materially different primary purpose from the declared user-facing skill behavior. While such a mock could support a podcast pipeline in tests, this chunk itself is unrelated to the described triggers and functionality, so it should be flagged as a mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description focuses on an end-to-end blog/article-to-podcast publishing workflow plus maintenance actions like updating shownotes, cover art, and RSS feed state. The supplied code does not implement or exercise podcast publishing, episode updates, metadata management, RSS repair, URL/article ingestion, or orchestration of a podcast pipeline. Instead, it contains unit tests for a TTS preprocessing layer, emphasizing normalized billing text and cache-key stability. While TTS could be a supporting component inside a podcast pipeline, this specific chunk’s primary purpose is materially different and much narrower: validating text cleanup and chunking for speech synthesis. Therefore the code chunk does not accurately represent the declared skill behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared purpose describes an end-user podcast production and publishing workflow: converting source material into a podcast episode and maintaining published episode metadata. The actual code does not implement article/blog-to-podcast conversion, episode publishing, metadata update commands, cover changes, or operational RSS repair flows. Instead, it is a unit test file focused narrowly on validating an RSS feed generator's output invariants. While RSS feed correctness is tangentially related to podcast publishing, this code chunk's primary behavior is testing internal feed-generation logic rather than performing the declared skill behavior. Therefore, the description does not accurately represent what this code chunk actually does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description describes an end-user skill that transforms source material into a podcast episode and maintains published episodes. The supplied code chunk does not implement that workflow. Instead, it contains unit tests for parsing a markdown podcast script format and related helper functions such as segment grouping and title extraction. While script parsing could be a supporting component inside a podcast pipeline, this chunk’s actual purpose is narrowly to test parser semantics, not to ingest articles/blogs, create audio shows, publish episodes, or update metadata/RSS. Therefore the description does not accurately represent what this code chunk actually does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents an end-to-end 'blog/article/text to published podcast episode' skill plus post-publication maintenance operations such as updating shownotes, descriptions, covers, and RSS. The supplied code chunk does not implement or test those workflows. Instead, it tests a TTS client and audio assembly internals: synthesizing text chunks into audio, retry logic, handling stream truncation/errors, writing WAV output, and applying narration-specific ffmpeg filters during podcast audio assembly. While audio synthesis could be a supporting component of a podcast pipeline, this chunk’s actual behavior is much narrower and materially different from the declared primary purpose. It also directly overlaps with plain TTS functionality, which the description explicitly says should be skipped in favor of a separate TTS path. Therefore this is a description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about an end-user podcast production and publishing pipeline, including converting source material into podcast episodes and updating published episode metadata. The supplied code chunk, however, is only a test module for timeline estimation/calibration behavior in a generate_timeline component. It checks formatting and duration invariants and monkeypatches audio duration retrieval for calibration tests. There is no evidence here of article ingestion, TTS/podcast generation, publication, metadata maintenance, or RSS/feed operations. This is a materially different primary purpose from the declared skill behavior, so it should be flagged as a mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The declared description promises an operational podcast-production and maintenance pipeline: converting written source material into a podcast episode and handling published-episode updates. The actual code shown does none of that. It is only a test file for validation logic, exercising quality-gate checks on podcast scripts and notes. While script/notes validation could be a supporting component inside a broader podcast pipeline, this chunk’s observable behavior is narrowly focused on linting/validation and lacks any code for source ingestion, transformation into audio, publishing, metadata updates, or RSS repair. Therefore the code chunk’s actual behavior is materially different from the declared primary purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description is for an end-user skill that converts source material into published podcast episodes and maintains podcast metadata. The supplied code does not implement that workflow. It is strictly testing infrastructure: fixture builders for script/notes markdown, a pytest helper for asserting failed exits, and a fake transport that intercepts HTTP calls to a TTS service. While TTS is tangentially related to podcast generation, this module only simulates TTS behavior for tests and does not perform real synthesis, article ingestion, episode publication, metadata updates, or RSS maintenance. Therefore the code's actual behavior is materially different from the declared purpose.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
97% confidence
Finding

The skill advertises and instructs use of network, shell, environment variables, and file read/write capabilities, but it does not declare an explicit tool scope such as allowed-tools or permissions. This creates an overbroad execution surface where an agent may invoke powerful operations without clear policy constraints, increasing the risk of unintended command execution, credential exposure, or file/network abuse.

Content

No source excerpt is available for this finding.

Behavior Manipulation

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Subtle instructions detected that may alter agent decision-making or introduce hidden biases.

Content

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

md
## Scripts

**Always use these scripts instead of writing inline Python** — they handle config,
cover_url, episodes.json state and feed regeneration correctly.

CLI entry points:

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The document mandates a fixed Chinese opening phrase and Chinese-script punctuation conventions, which imposes a language/locale requirement rather than offering user choice. This is a natural-language policy concern because the skill appears broadly applicable to article/blog conversion but does not state that Chinese output is optional or limited to a region-specific use case.

Content

No source excerpt is available for this finding.

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
80% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · assets/mic_tap.b64.txt (reported line 677)May include surrounding context.

text
//////////////////////////////////////////////////////8AAP//////////////////
////////////////AAD//wAA/////////////////////////////wAAAAD/////////////////
////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The guide explicitly instructs operators to fetch remote content through the browser's authenticated session, which can cause requests to be made with existing cookies, session state, or network access that the normal gateway environment does not have. That creates a privacy and trust-boundary risk: untrusted article-controlled URLs or adjacent workflow changes could leverage a privileged browser context to retrieve content the user did not intend to access, with no warning or validation steps.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file explicitly requires 'Chinese throughout' for the notes format. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale constraint is clearly documented and justified as region-specific; here it is framed as a blanket requirement for the skill output.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The spec requires Chinese role names only, and later quality rules require conversational Chinese prose. This is a natural-language locale constraint that appears mandatory rather than optional, with no user choice or explicit justification that the skill is region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file explicitly states 'Conversational Chinese' as a requirement for outputs, which enforces a specific language/locale. Under the policy, this should either be user-selectable or clearly justified as a region-specific constraint.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The guide explicitly instructs operators to recover authenticated SOCKS5 proxy credentials from Chrome process arguments and reuse them in curl. That exposes unrelated secrets and grants network access beyond the podcast skill's stated need to fetch source content, creating a credential-harvesting and lateral-use pathway if the skill is followed as written.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The file tells users to obtain and use authenticated proxy credentials but provides no guidance on secret handling, redaction, storage, or avoiding disclosure in shell history/logs. This increases the chance of credential leakage and misuse, especially because the credentials are extracted from another process and then pasted into command lines.

Content

No source excerpt is available for this finding.

Cloud Storage Exfiltration

Medium
Category
Data Exfiltration
Confidence
73% confidence
Finding

The script automatically uploads every image file found under a sibling images/ directory without prompting or validating provenance. In an agent setting, if the working directory contains unintended files or symlinked content, this can cause accidental disclosure of local assets to cloud storage as part of publication.

Content

Scanner excerpt · scripts/generate_podcast.py (reported line 349)May include surrounding context.

python
ct = {".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg",
                      ".gif": "image/gif", ".webp": "image/webp"}.get(suffix, "image/jpeg")
                key = f"{slug_dir_key}images/{img.name}"
                uploader.upload_file(str(img), key, content_type=ct)
                print(f"  ✅ images/{img.name} -> {key}")

    if not args.notes:

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_timeline.py (reported line 83)May include surrounding context.

python
def get_duration_seconds(path: str) -> int:
    result = subprocess.run([
        "ffprobe", "-v", "quiet", "-show_entries", "format=duration",
        "-of", "default=noprint_wrappers=1:nokey=1", path
    ], capture_output=True, text=True)

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

python
def get_duration_seconds(path: str) -> int:
    result = subprocess.run([
        "ffprobe", "-v", "quiet", "-show_entries", "format=duration",
        "-of", "default=noprint_wrappers=1:nokey=1", path
    ], capture_output=True, text=True)

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The docstring states that the feed language defaults to "zh-cn" when no language is provided. This imposes a specific locale by default without offering user choice or documenting a clear region-specific constraint, which matches the language/locale policy violation category.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.