Back to skill

Security audit

Account Video Downloader

Security checks for vulnerabilities and agentic risk

Overview

The skill matches its downloader purpose, but it has Review-worthy risk because it sends targets through a third-party API and downloads API-provided URLs to disk without strong scoping or validation.

Review before installing. Use this only for media you are authorized to access and store, assume account IDs and work/video URLs are sent to yige.zone, use a limited output directory with available disk quotas, and prefer a scoped or disposable API key that can be rotated if exposed.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/base.py:215
Finding

Unrestricted retrieval of API-controlled download URLs

Content
View full analysis
bool: try: resp = requests.get(download_url, timeout=120, stream=True) resp.raise_for_status() total = int(resp.headers.get("content-length", 0)) downloaded = 0 with open(output_path, "wb") as f: for chunk in resp.iter_content(chunk_size=8192): if chunk: f.write(chunk) downloaded += len(chunk) if total > 0 and downloaded < total * 0.9: warn(f" 文件可能不完整: {downloaded}/{total} bytes") return False return True except requests.exceptions.RequestException as e: error(f" 下载失败: {e}") return False except OSError as e: error(f" 文件写入失败: {e}") return False ``` The URL passed to this method is extracted directly from remote API responses: ```python dl = res.get("downloadUrl") or res.get("url") if dl and rtype == "video" and not result["download_url"]: result["download_url"] = dl ``` The Kuaishou adapter can also use a URL from the work-list response without invoking the parsing endpoint: ```python "directVideoUrl": work.get("videoUrl") or "", ``` ### Technical Analysis The downloader treats URLs returned by `yige.zone` as trusted. It does not validate: - The URL scheme. - The destination hostname. - The resolved IP address. - Redirect destinations. - Whether the destination is loopback, private, link-local, reserved, or a cloud metadata service. - The response content type. - The maximum ...[truncated 1926 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/douyin.py:75
Finding

API credential may be forwarded during automatic redirects

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
scripts/base.py:371
Finding

Untrusted remote metadata is rendered without output-context sanitization

Content
View full analysis
50 else ''}") ``` The account name is inserted directly into a Markdown heading: ```python name = account.get("accountName", account.get("accountId", "未知")) fans = format_number(account.get("followerCount")) label = downloader.platform_label fans_display = f"(粉丝: {fans})" if account.get("followerCount") is not None else "" print(f"\n## 📥 {label}视频下载 — @{name}{fans_display}") ``` Only limited title escaping is applied before constructing links: ```python title_raw = (r.get("title") or "无标题")[:25] title = title_raw.replace("|", "\\|").replace("\n", " ") work_url = r.get("work_url", "") if work_url: title_display = f"[{title}]({work_url})" else: title_display = title ``` API-provided resource types and URLs are also embedded directly: ```python rtype = res.get("type", "") rurl = res.get("downloadUrl") or res.get("url") or "" if rtype and rurl and rtype not in seen_types: seen_types.add(rtype) if rtype == "video": has_video = True resource_parts.append(f"[视频]({rurl})") elif rtype == "image": resource_parts.append(f"[封面]({rurl})") elif rtype == "audio": resource_parts.append(f"[音频]({rurl})") else: resource_parts.append(f"[{rtype}]({rurl})") ``` ### Technical Analysis Titles, account names, resource labels, and resource URLs originate from remote platform or API data. These fields are not comprehensively sanitized for their output contexts. The terminal output does not remove ANSI escape sequences or other control characters. A crafted title coul ...[truncated 1824 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
README.en.md:74
Finding

Runtime dependency is installed without version or integrity pinning

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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (33)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The code is clearly related to the general declared domain of homepage video extraction/downloading, so it is not unrelated or maliciously different. However, the declared description promises a broader multi-platform tool covering Douyin, Kuaishou, Bilibili, and YouTube, while the supplied code chunk is solely a Bilibili implementation (BilibiliDownloader). It validates Bilibili URLs, calls Bilibili-specific API endpoints, extracts mid from space.bilibili.com, and parses Bilibili work/download metadata. Also, the description suggests taking either an account ID or link, but this module requires a homepage URL format. Finally, while the description advertises batch downloading, this code only returns work lists and per-item download URLs rather than performing actual bulk downloads. Therefore the description does not accurately represent this specific code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

代码与描述部分重合:它确实用于提取快手账号主页作品,并解析视频下载链接。但描述将技能定位为“四大平台”的统一提取/批量下载工具,而当前代码片段只覆盖快手模块,且输入限制比描述更严格——不接受快手主页链接或昵称,只接受 kwaiId。此外,代码返回作品列表和下载信息,虽可为批量下载提供基础,但片段中没有体现批量下载的执行能力。因此,按描述与实际行为是否一致来评估,存在明显不完全匹配。

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill prominently advertises watermark-free direct links, bulk downloading, competitor content analysis, and offline hoarding, but does not warn about copyright, terms-of-service, privacy, or storage/bandwidth risks. In this context, the omission is significant because the tool’s core use case is large-scale extraction of third-party media, which increases the likelihood of misuse and potentially unlawful behavior.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README encourages invocation through broad natural-language phrases such as generic requests to download account videos across platforms. This can cause accidental or overly broad activation in agent environments, leading to unintended bulk scraping/downloading actions, especially because the skill is designed for large-scale extraction and local saving.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill instructs the agent to use environment variables, local file output, and external network access, but it does not declare any explicit tool scope or permission boundaries. This increases the risk of over-broad execution in hosts that rely on manifest-level restrictions, making unintended file writes, network calls, or secret exposure harder to constrain and audit.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger phrases are broad enough to match ordinary user requests such as generic 'video save/download' intents, which can cause the skill to activate unexpectedly. In this skill's context, unexpected activation is more dangerous because it can send account identifiers and content links to a third-party API and initiate bulk downloading behavior the user may not have intended.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill routes user-supplied account identifiers and per-work content links to a third-party API service, but it does not clearly warn users that this data leaves the local environment. This is a meaningful privacy and trust issue, especially when users may provide creator identifiers, channel URLs, or other potentially sensitive research targets for competitive analysis or background checks.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The agent trigger examples are ambiguous and lack clear scope constraints, making it easier for the skill to be invoked on vague requests without confirming the user's exact intent, target platform, or consent to contact a third-party service. Because the skill can fetch and download large amounts of content, accidental invocation can create privacy, compliance, and unwanted data-transfer risks.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

User-facing validation and guidance text is written only in Chinese, and the _is_chinese check is used to reject certain inputs based on Chinese-character content. The file does not offer a language or locale choice, which can violate policy when a skill effectively forces a specific language 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 code performs a network download and writes the response to a user-specified local path via open(output_path, "wb"), which is a safety-relevant file write. While there is progress/error logging, there is no explicit warning or confirmation in this code path that local files will be created or overwritten, and this base module describes downloading behavior but does not disclose the filesystem impact to the user.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The code explicitly broadens a video-downloader into a general media extractor by handling image posts and audio resources and by selecting non-video file extensions. In this skill’s context—bulk extraction of creator content across platforms—this increases the scope of data exfiltration and facilitates downloading media types not implied by a narrowly defined video-only tool.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The Markdown renderer prints direct resource URLs for every work, including downloadable media links, which materially lowers friction for mass copying and redistribution. Given the skill description’s emphasis on competitor analysis, backup, and bulk reuse, exposing raw links makes misuse easier and expands the skill from interactive downloading into link harvesting at scale.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/bilibili.py (reported line 66)May include surrounding context.

python
}

        try:
            resp = requests.post(url, json=payload, headers=headers, timeout=30)
            result = resp.json()
        except requests.exceptions.Timeout:
            return {"success": False, "account": None, "works": [], "error": "请求超时,请稍后重试"}

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/bilibili.py (reported line 147)May include surrounding context.

python
}

        try:
            resp = requests.post(url, json=payload, headers=headers, timeout=30)
            result = resp.json()
        except requests.exceptions.Timeout:
            return {"success": False, "account": None, "works": [], "error": "请求超时,请稍后重试"}

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/douyin.py (reported line 81)May include surrounding context.

python
}

        try:
            resp = requests.post(url, json=payload, headers=headers, timeout=30)
            result = resp.json()
        except requests.exceptions.Timeout:
            return {"success": False, "account": None, "works": [], "error": "请求超时,请稍后重试"}

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/douyin.py (reported line 158)May include surrounding context.

python
}

        try:
            resp = requests.post(url, json=payload, headers=headers, timeout=30)
            result = resp.json()
        except requests.exceptions.Timeout:
            return {"success": False, "account": None, "works": [], "error": "请求超时,请稍后重试"}

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/kuaishou.py (reported line 74)May include surrounding context.

python
}

        try:
            resp = requests.post(url, json=payload, headers=headers, timeout=30)
            result = resp.json()
        except requests.exceptions.Timeout:
            return {"success": False, "account": None, "works": [], "error": "请求超时,请稍后重试"}

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/kuaishou.py (reported line 156)May include surrounding context.

python
}

        try:
            resp = requests.post(url, json=payload, headers=headers, timeout=30)
            result = resp.json()
        except requests.exceptions.Timeout:
            return {"success": False, "account": None, "works": [], "error": "请求超时,请稍后重试"}

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This code posts the provided Douyin account identifier to a remote API and includes a YIGE_API_KEY header, but there is no confirmation prompt, user-facing log, or warning comment/docstring disclosing that user input and credentials are sent to an external service. A similar undisclosed transmission also occurs in the download-info request path.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The function posts the supplied work URL to a remote endpoint for parsing, which may disclose user-provided targets and associated metadata to a third party. The code provides error handling but no user-facing notice, confirmation, or explanatory comment that this external transmission occurs.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This code file contains natural-language instructions and help text that force a specific language/locale for users. Under the policy, language constraints should either be optional for the user or clearly justified as region-specific; here no such opt-in or justification is provided.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This network call transmits externally supplied account identifiers and an API key to a remote service. In a downloader skill focused on scraping and bulk collection, such outbound transmission increases sensitivity because user targets, research interests, and service credentials are centralized with a third party and may be logged or abused if the service is compromised.

Content

Scanner excerpt · scripts/youtube.py (reported line 67)May include surrounding context.

python
}

        try:
            resp = requests.post(url, json=payload, headers=headers, timeout=30)
            result = resp.json()
        except requests.exceptions.Timeout:
            return {"success": False, "account": None, "works": [], "error": "请求超时,请稍后重试"}

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The code sends a user-supplied YouTube channel URL/identifier plus the YIGE API key to a remote third-party service. In this skill’s context, that transmission is core functionality, but the lack of explicit disclosure/consent means user input and secrets are being forwarded off-platform in a way that may surprise users and expose browsing/research targets to the API operator.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

This request sends a user-provided work URL to an external parser endpoint, enabling third-party observation of exactly which videos the user wants downloaded. Given the skill’s stated use cases include competitor analysis, bulk archiving, and material reuse, the privacy and compliance stakes are higher than a generic metadata lookup because the queried URLs may reveal sensitive business interests or facilitate copyright-violating workflows.

Content

Scanner excerpt · scripts/youtube.py (reported line 110)May include surrounding context.

python
}

        try:
            resp = requests.post(url, json=payload, headers=headers, timeout=30)
            data = resp.json()
        except requests.exceptions.Timeout:
            return {"success": False, "download_url": None, "title": None, "cover": None,

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The download-info lookup forwards a user-provided video URL to a remote API endpoint for parsing. Because this skill is explicitly designed for bulk extraction/downloading across platforms, the remote service learns exactly what content the user is targeting, which creates privacy, compliance, and potential misuse concerns if not clearly disclosed.

Content

No source excerpt is available for this finding.