T08 · Insecure Dependencies
- Location
scripts/bootstrap_env.py:10- Finding
Unpinned Runtime Dependency Installation
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly does what it claims, but it installs unpinned runtime packages and downloads/extracts a remote model without strong integrity checks, so users should review it before installing.
Review before installing in a sensitive environment. Use a virtual environment, pin and verify dependencies, prefer a preverified local model directory where possible, and treat media_info.json as private because it may contain reusable media URLs and Referer/Origin context.
scripts/bootstrap_env.py:10Unpinned Runtime Dependency Installation
scripts/pipeline_common.py:53SenseVoice Model Archive Downloaded Without Integrity Verification
scripts/pipeline_common.py:184Archive Extraction Does Not Reject Symbolic or Hard Links
The main mismatch is scope. The description presents a general-purpose workflow for arbitrary web pages, with Toutiao as just one special case. This code explicitly rejects non-Toutiao page URLs and tells the user to capture a direct media URL first, so page extraction is not generic. The code does support direct media URLs and local transcription to TXT/DOCX, which aligns with part of the description, and it uses helper functions consistent with downloading media and transcribing. However, the declared capability to extract from arbitrary web pages, including various stream types, is not represented in this chunk. Also, the described cleaning/chapterization step is absent here. Therefore the description materially overstates what this specific skill code does.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
### 5. Stay within scope
- Only download URLs that the user supplied directly or that the extractor captured from the target page.
- Do not request, store, or exfiltrate cookies, access tokens, or account credentials.
- Do not attempt to bypass DRM, login walls, or geo-restriction controls.
- If a page requires authenticated browser state that is not already available, say so plainly and stop at the supported boundary.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
If it cannot find a browser, install Chrome or Edge, or extend the script for the local environment.
## Output rules
- Keep the raw transcript and the refined transcript as separate files.
- Use raw transcript files for auditability.
The skill advertises and instructs use of sensitive capabilities including shell execution, filesystem access, network access, and browser-driven extraction, but it does not declare any explicit tool scope or permissions boundary. In an agent marketplace or automation environment, this increases the risk of overbroad execution because operators and policy layers cannot easily constrain what the skill is allowed to do.
The skill metadata strongly frames output as Chinese transcription/cleaned Chinese text without making language choice explicit. While not a classic security flaw, this can cause the system to override user expectations, mishandle non-Chinese content, or apply the skill to requests where language handling should be user-directed, increasing the chance of incorrect processing and unintended disclosure in multilingual contexts.
The default prompt uses broad, trigger-like phrasing ('Use $web-video-transcribe-docx to...') that can cause the skill to be invoked in situations where the user did not explicitly request this specific workflow. Because the skill performs powerful actions such as extracting media from arbitrary web pages and producing deliverables, accidental activation could lead to unnecessary network access, unintended processing of content, or overreach beyond user intent.
The workflow explicitly instructs users to pass and preserve request headers such as Referer and Origin when downloading media, but it provides no warning that captured headers or related request metadata can contain sensitive information or reveal browsing context. In a media-extraction skill, this creates a realistic risk of unintentionally storing or sharing sensitive request details in output artifacts or logs, especially when users generalize the pattern to authenticated pages.
The instruction to preserve media_info.json for later retries encourages retention of extracted media URLs and headers without noting that those artifacts may embed sensitive request metadata, internal URLs, or account-linked identifiers. Because this skill is designed to capture browser-observed media requests from arbitrary pages, the context makes silent retention of metadata more dangerous than in a purely local-only workflow.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
missing = missing_packages()
if missing:
subprocess.run([sys.executable, "-m", "pip", "install", *missing], check=True)
else:
print("All required Python packages are already installed.")
The script automatically installs missing Python packages as soon as it is executed, without an explicit runtime confirmation step. In a skill that handles arbitrary web media workflows, this increases supply-chain and environment-modification risk because executing the helper causes immediate network retrieval and installation of executable third-party code.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
print("All required Python packages are already installed.")
if args.install_playwright_browser:
subprocess.run([sys.executable, "-m", "playwright", "install", "chromium"], check=True)
print("Environment bootstrap complete.")
return 0
The script passively captures request and response metadata from a browser session and exports selected request headers to JSON alongside discovered media URLs. Even if sanitize_captured_headers() removes some sensitive fields, this workflow can still persist session-linked headers such as Referer, Origin, or other tokens that may disclose browsing context or enable reuse against protected media endpoints, and there is no explicit user warning or consent prompt before recording them.
The script passively captures request and response metadata from arbitrary web pages, then persists selected headers and media URLs to stdout or a JSON file without any explicit warning, consent gate, or redaction guarantee visible in this file. In this skill’s context, captured headers such as Referer, Origin, cookies, authorization-like values, or signed playback tokens may expose session context or reusable access parameters, making local persistence and later reuse more sensitive than ordinary scraping.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def run_ffmpeg(args: list[str]) -> None:
cmd = [ffmpeg_executable(), "-nostdin", "-y", "-v", "error", *args]
subprocess.run(cmd, check=True)
def guess_suffix_from_url(url: str) -> str:
The function automatically downloads a model archive from the network and extracts it into a local cache without any authenticity verification such as a pinned checksum or signature. Although path traversal is mitigated by the extraction check, a compromised upstream release, MITM in a misconfigured environment, or poisoned cache could lead to execution of untrusted model assets in downstream tooling.
This path forwards captured headers to ffmpeg for remote manifest retrieval, which can disclose request metadata to attacker-controlled URLs and trigger ffmpeg's network stack on untrusted inputs. In this skill context, arbitrary web-page media extraction makes SSRF-style internal network access or sensitive header leakage more plausible if the source URL or captured headers are attacker influenced.
The argument parser sets --language to default to zh, which imposes a specific language/locale choice unless the user explicitly overrides it. The policy allows locale constraints only when the user is given a choice up front or the constraint is clearly documented and justified; here the default silently prefers Chinese.
The instruction specifies chapter headings using the Japanese form ## 第1章 ..., which imposes a particular language/locale convention. The file does not indicate that Japanese output is optional, user-selected, or required by a region-specific use case.
This markdown file includes commands for a real smoke test that generate TXT and DOCX outputs under an output directory, but the surrounding instructions do not explicitly warn the user that running them will create files on disk. For markdown files, SQP-2 applies when the skill description omits warnings about behaviors that could affect user data or system state.
The example command hard-codes the document title as 视频章节整理稿, which imposes a specific language in user-facing output. The workflow does not indicate that the skill is region-specific or offer an option to choose the output language.
When the optional flag is supplied, the script launches a subprocess to install Chromium via Playwright, which changes the local system state and may download substantial external artifacts. The code includes argparse help text, but no explicit runtime disclosure or confirmation is shown when this action actually occurs.
The function performs a network request and sends headers such as User-Agent and optionally captured Origin/Referer values, but there is no confirmation prompt, log message, or explanatory comment/docstring warning that outbound requests will transmit metadata. In this file, the behavior is not disclosed to the user at the point of execution.
When the output directory already exists, the function unlinks matching part_*.wav files before generating new segments, but there is no confirmation, visible log message, or explanatory comment warning about this deletion behavior. Users may not realize prior outputs will be removed as a side effect.
The function signature sets the default language to "zh", which means the skill implicitly prefers a specific language/locale when the caller does not choose one. The policy allows locale constraints when they are clearly justified or user-selected, but this code applies the preference automatically.
No suspicious patterns detected.