Back to skill

Security audit

b站视频自动生成高质量图文笔记自动截图并上传至Notion笔记

Security checks for vulnerabilities and agentic risk

Overview

The skill has a coherent Bilibili-to-Notion purpose, but it asks for risky local execution and Notion-write behavior without enough scoping or confirmation.

Review this skill before installing. Use it only in a constrained environment with a minimally scoped Notion integration, avoid passing sensitive Bilibili cookies or private local files, verify BBDown yourself before execution, and do not allow automatic Notion cleanup/archive actions without seeing the exact target pages first.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (4)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/bilibili_to_notion_workflow.py:14
Finding
Shell Command Injection and Notion Token Exposure in Workflow Execution<![CDATA[ ## Vulnerability Details **File Location**: `scripts/bilibili_to_notion_workflow.py`, lines 14-23 and 101-120 **Vulnerability Type**: OS command injection and sensitive credential exposure through process arguments **Risk Level**: Critical ### Vulnerable Code ```python def run_command(cmd, description=""): """运行命令并返回结果""" if description: print(f"\n🔍 {description}...") try: result = subprocess.run( cmd, shell=True, capture_output=True, text=True, check=True ) return json.loads(result.stdout) except subprocess.CalledProcessError as e: print(f"❌ 命令执行失败: {e.stderr}") return {"success": False, "error": e.stderr} except json.JSONDecodeError as e: print(f"❌ JSON解析失败: {e}") return {"success": False, "error": str(e)} ``` The workflow constructs shell commands from command-line arguments, downloaded metadata, and generated content: ```python download_result = run_command( f"python3 download_bilibili_cc.py --url '{args.url}' --output '{subtitles_dir}'", "下载B站字幕", ) ``` ```python cmd_parts = [ "python3 create_notion_notes_with_images.py", f"--token '{args.token}'", f"--database-id '{args.database_id}'", f"--video-title '{video_title}'", f"--video-url '{args.url}'", f"--segments '{json.dumps(segments)}'", f"--images-dir '{screenshots_dir}'", ] if markdown_content: temp_md_path = output_dir / "temp_markdown.md" temp_md_path.write_text(markdown_content) cmd_parts.append(f"--markdown-content '{temp_md_path}'") cmd = " ".join(cmd_parts) create_result = run_command(cmd, "创建Notion笔记") ``` ### Technical Analysis `subprocess.run(..., shell=True)` passes the assembled string to a command shell. Several interpolated values can originate from untrusted or indirectly controlled sources: - `args.url`, `args.output_dir`, `args.database_id`, and `args.token` - `video_title`, which can originate from remote Bilibili metadata - ...[truncated 2080 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `shell=True` and pass every subprocess invocation as an argument list: ```python result = subprocess.run( cmd, shell=False, capture_output=True, text=True, check=True, ) ``` 2. Build commands as lists rather than concatenated strings: ```python cmd = [ sys.executable, str(script_dir / "download_bilibili_cc.py"), "--url", args.url, "--output", str(subtitles_dir), ] ``` 3. Resolve bundled script paths relative to `Path(__file__).resolve().parent` rather than relying on the current working directory. 4. Do not put the Notion token in process arguments. Prefer directly importing and calling the relevant Python function. If process separation is required, pass the token through a minimally scoped environment variable or protected file descriptor. 5. Validate Bilibili URLs against the expected HTTPS host and validate database identifiers according to Notion's identifier format. 6. Treat remote titles and subtitle-derived content as data only. Never interpolate them into shell commands. 7. Rotate any Notion token that may previously have been exposed through process arguments. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/create_notion_notes_with_images.py:17
Finding
Arbitrary Local File Disclosure Through Markdown Image Uploads<![CDATA[ ## Vulnerability Details **File Location**: `scripts/create_notion_notes_with_images.py`, lines 17-22, 76-78, 192-194, and 226-245 **Vulnerability Type**: Unrestricted local file read and upload **Risk Level**: High ### Vulnerable Code The upload function accepts any existing filesystem path: ```python def upload_file_to_notion(notion_token: str, file_path_str: str) -> Dict[str, Any]: """ 上传文件到Notion 返回文件上传ID """ file_path = Path(file_path_str) if not file_path.exists(): return {"success": False, "error": f"文件不存在: {file_path_str}"} ``` It then opens and transmits the file without checking that it is an expected screenshot: ```python with open(file_path, "rb") as f: files = {"file": (file_path.name, f, mime_type)} response = requests.post(upload_url, headers=headers_upload, files=files) ``` Markdown image paths are normalized and uploaded: ```python def _normalize_image_path(url: str, base_dir: str) -> str: if url.startswith(("http://", "https://")): return url if os.path.isabs(url): return url return os.path.join(base_dir, url) ``` ```python def _upload_local_image(local_path: str) -> Optional[str]: if not upload_local_images: return None try: from upload_file_to_notion import upload_file_to_notion res = upload_file_to_notion(notion_token, local_path) if res.get("success"): return res.get("file_upload_id") return None except Exception: return None ``` ```python img_match = re.search(r"!\[(.*?)\]\((.*?)\)", line) if img_match: flush_paragraph() alt, url = img_match.group(1), img_match.group(2) full = _normalize_image_path(url, images_base_dir) if full.startswith(("http://", "https://")): blocks.append( { "object": "block", "type": "image", "image": {"type": "external", "external": {"url": full}}, } ) ...[truncated 2297 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Define a single approved screenshot root and require every uploaded path to remain beneath it after canonical resolution: ```python allowed_root = Path(images_dir).resolve(strict=True) candidate = Path(file_path_str).resolve(strict=True) if allowed_root != candidate.parent and allowed_root not in candidate.parents: raise ValueError("File is outside the approved screenshot directory") ``` 2. Reject path traversal, symlinks, device files, FIFOs, sockets, and anything that is not a regular file: ```python if candidate.is_symlink() or not candidate.is_file(): raise ValueError("Only regular non-symlink files may be uploaded") ``` 3. Restrict uploads to a small allowlist of image formats, such as JPEG and PNG. 4. Inspect the actual file signature with a maintained image library rather than trusting the extension. 5. Generate and maintain an allowlist of screenshot paths created during the current workflow. Upload only files present in that allowlist. 6. Set a conservative file-size limit before reading or uploading the file. 7. Require explicit user confirmation before uploading local files not generated during the current run. 8. Do not silently fall back to `file://` external URLs when validation or upload fails. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/upload_file_to_notion.py:49
Finding
Bearer Token and File Data Forwarded to an Unvalidated Upload URL<![CDATA[ ## Vulnerability Details **File Location**: `scripts/upload_file_to_notion.py`, lines 49-84; duplicate implementation in `scripts/create_notion_notes_with_images.py`, lines 51-78 **Vulnerability Type**: Unvalidated remote endpoint used for authenticated file upload **Risk Level**: Medium ### Vulnerable Code In `scripts/upload_file_to_notion.py`: ```python response = requests.post(create_url, headers=headers, json=create_data) if response.status_code != 200: return { "success": False, "error": f"Failed to create file upload: {response.status_code}", "detail": response.text[:200], } upload_data = response.json() upload_url = upload_data.get("upload_url") file_upload_id = upload_data.get("id") if not upload_url: return { "success": False, "error": "No upload_url returned from create file upload", } ``` The returned URL receives both the bearer token and local file data: ```python headers_upload = { "Authorization": f"Bearer {notion_token}", "Notion-Version": "2026-03-11", } with open(file_path, "rb") as f: response = requests.post( upload_url, headers=headers_upload, files={"file": (file_path.name, f, mime_type)}, ) ``` A duplicate pattern appears in `scripts/create_notion_notes_with_images.py`: ```python upload_data = response.json() upload_url = upload_data.get("upload_url") file_upload_id = upload_data.get("id") ``` ```python with open(file_path, "rb") as f: files = {"file": (file_path.name, f, mime_type)} response = requests.post(upload_url, headers=headers_upload, files=files) ``` ### Technical Analysis The code treats `upload_url` from the API response as trusted without validating its scheme, hostname, port, or path. It then sends the Notion bearer token and file contents to that URL. Under normal operation the initial request uses TLS and targets `api.notion.com`, reducing exploitability. Nevertheless, secure handling of credenti ...[truncated 1376 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Parse `upload_url` with `urllib.parse.urlparse`. 2. Require HTTPS and reject embedded credentials, unexpected ports, fragments, and malformed URLs. 3. Enforce the exact hostname and path patterns documented by Notion. If Notion uses multiple upload hosts, maintain a narrow explicit allowlist. 4. Do not forward the bearer token to an origin unless the documented API explicitly requires it. 5. Disable redirects for authenticated uploads: ```python response = requests.post( upload_url, headers=headers_upload, files=files, allow_redirects=False, timeout=(5, 60), ) ``` 6. If a redirect is part of the documented protocol, validate every redirect target and never forward authorization across origins. 7. Consolidate the duplicate upload implementations into one reviewed helper so that endpoint validation cannot diverge. ]]>

T08 · Insecure Dependencies

Error
Location
SKILL.md:362
Finding
Unverified Third-Party Executable Download and Unpinned Python Dependency<![CDATA[ ## Vulnerability Details **File Locations**: - `README.md`, lines 59-63 - `CONFIGURATION.md`, lines 35-40 - `FINAL_SUMMARY.md`, lines 104-109 - `SKILL.md`, lines 362-367 **Vulnerability Type**: Unsafe software supply-chain installation instructions **Risk Level**: High ### Vulnerable Code The installation instructions download and make a precompiled third-party executable runnable without integrity or signature verification: ```bash # 安装Python依赖 pip install requests # 下载BBDown(B站下载器) curl -L -o /tmp/BBDown.zip "https://github.com/nilaoda/BBDown/releases/download/1.6.3/BBDown_1.6.3_20240814_linux-x64.zip" unzip /tmp/BBDown.zip -d /tmp/ chmod +x /tmp/BBDown ``` Equivalent instructions appear in all four listed documentation files. The downloaded program is later executed by the Skill, including in `scripts/download_bilibili_cc.py`: ```python cmd = [ bbdown_path, url, "--sub-only", "--skip-ai", "false", "--work-dir", str(output_path), ] result = subprocess.run(cmd, capture_output=True, text=True, timeout=120) ``` ### Technical Analysis The instructions use a versioned HTTPS GitHub release URL, which is safer than an unencrypted or mutable arbitrary URL. However, the archive is not checked against a pinned digest or cryptographic signature before extraction and execution. BBDown is a third-party precompiled executable from an individual GitHub repository rather than code shipped and reviewed as part of this Skill. If the release asset, repository, maintainer account, or delivery path is compromised, the downloaded program can execute arbitrary code under the Skill user's account. The instructions also use `pip install requests` without an exact version or hash. This makes installation results dependent on the current package index state and prevents reproducible verification. The use of `/tmp/BBDown` introduces an additional local trust concern when the temporary directory is shared. The scripts will execute a file ...[truncated 1521 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Publish a trusted SHA-256 digest for the exact BBDown archive and verify it before extraction: ```bash echo "<approved-sha256> /tmp/BBDown.zip" | sha256sum --check - ``` 2. Prefer a cryptographically signed release and verify the signature against a pinned maintainer key. 3. Do not execute binaries directly from a shared `/tmp` path. Install into a user-owned directory with restrictive permissions, such as `$HOME/.local/lib/bilibili-cc-to-notion/`. 4. Before execution, verify that the binary is a regular file, is owned by the expected user, is not a symlink, and matches the approved digest. 5. Pin Python dependencies to reviewed versions and hashes using a lock file or requirements file: ```text requests==<reviewed-version> --hash=sha256:<approved-hash> ``` 6. Prefer distribution-maintained packages or build the utility from a pinned, reviewed source commit in a controlled build environment. 7. Run BBDown in a sandbox with a restricted filesystem view, no access to unrelated credentials, and only the network destinations needed for Bilibili. 8. Avoid passing account cookies on command lines. Use a protected credential mechanism and scope Bilibili authentication to the minimum permissions required. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (76)

YARA rule 'backdoor_persistence': Backdoor persistence with malicious payloads (shell commands, SSH key injection, hidden root users) [malware]

High
Category
YARA Match
Content
# 配置说明

## 📋 快速配置指南

### 1. 获取Notion API Token

1. 访问 [Notion Integrations](https://www.notion.so/my-integrations)
2. 点击 "New integration"
3. 填写名称并选择工作空间
4. 复制 **Internal Integration Token**(格式:`secret_xxx`)

### 2. 设置环境变量

```bash
# 编辑 ~/.bashrc 或 ~/.zshrc
echo 'export NOTION_API_KEY="secret_xxx"' >> ~/.bashrc
source ~/.bashrc

# 可选:设置默认数据库ID
echo 'export NOTION_DATABASE_ID="your_database_id"' >> ~/.bashrc
source ~/.bashrc
```

### 3. 分享数据库给Integration

1. 打开你的Notion数据库
2. 点击右上角 `...` 菜单
3. 选择 "Connections"(连接)
4. 搜索并选择你创建的integration

### 4. 安装依赖

```bash
# 安装Python依赖
pip install requests

# 下载BBDown(B站下载器)
curl -L -o /tmp/BBDown.zip "https://github.com/nilaoda/BBDown/releases/download/1.6.3/BBDown_1.6.3_20240814_linux-x64.z
Confidence
75% confidence
Finding
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
整体主用途与声明大体一致:都是从 B站视频获取字幕、处理后创建 Notion 学习笔记,且支持 URL/BV 输入。没有发现明显越权、无关资源访问或恶意/不相关功能。不过,声明中的关键卖点“带截图的 Notion 学习笔记/生成带截图标记”在这段代码里没有得到体现;代码既没有下载视频帧,也没有调用 ffmpeg 进行截图,也没有构造明显的截图时间点字段。FFmpeg 仅被检查可用性,但未实际参与流程。因此描述比代码展示的能力更强,存在一定描述—行为不一致。

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
声明描述的是一个端到端的B站视频转Notion学习笔记工具,包含输入BV号/URL、下载字幕、分析内容、生成带截图笔记等多个环节。但提供的代码块只实现了最后一步:把调用方传入的字幕片段整理成Notion页面内容并上传。其输入要求是现成的video_title、video_url和segments JSON,而不是BV号或B站链接解析结果;也没有任何与B站、字幕抓取、截图提取相关的逻辑。因此,声明与实际行为存在明显的能力夸大和范围不一致。

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
声明描述的是一个面向 B 站视频的端到端流程工具:输入 BV 号或 URL,自动获取字幕、分析内容、生成带截图的 Notion 学习笔记。而代码片段仅覆盖流程的后半段——将外部传入的字幕片段或 Markdown 内容写入 Notion,并支持图片嵌入/上传。代码需要调用者直接提供 --video-title、--video-url、--segments,说明字幕提取与视频处理并未在此实现。虽然“创建带截图的 Notion 学习笔记”这一部分与声明部分吻合,但声明中的关键前置能力(B站输入支持、CC字幕下载、字幕提取)缺失,导致描述与实际行为存在实质性不匹配。

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
声明描述的是一个端到端技能:输入 B 站视频后,下载字幕、分析内容、生成带截图标记的结构化学习笔记,并创建 Notion 笔记。但提供的代码块实际只实现了字幕下载相关功能:检测 BBDown、调用其 --sub-only 下载字幕、在本地查找 .srt/.ass 文件并返回结果。代码中没有任何字幕解析、内容总结、结构化笔记生成、截图抓取、时间戳截图标记、Notion API 调用或写入逻辑。因此,实际行为仅覆盖声明中的一个前置子步骤,无法支持其宣称的主要用途,属于明显的描述与行为不一致。

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
声明描述的是一个端到端的B站视频转Notion学习笔记工具,包括接受BV号/URL、自动下载CC字幕、智能分析内容并创建Notion笔记。实际代码块仅是一个字幕后处理脚本,输入为本地字幕文件路径(--input),只支持解析SRT格式文本,不包含任何B站访问、URL解析、字幕下载、视频处理、截图采集或Notion API调用。它生成的是Markdown字符串和JSON结果,而非Notion页面。虽然“生成带截图标记的结构化学习笔记”这一小部分与实际行为部分吻合,但整体主用途和关键能力明显少于声明,因此属于描述与行为不一致。

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
声明描述的是一个较完整的 B 站视频到 Notion 学习笔记流水线,包括接收 B 站标识、下载 CC 字幕、分析内容、生成结构化笔记,并包含截图标记。实际代码并不处理 B 站、字幕、内容分析或 Notion;它只读取本地 Markdown,识别其中的 Screenshot-[hh:mm:ss] 标记,并对本地视频文件调用 ffmpeg 生成截图,再将标记替换为 Markdown 图片链接。这不是对声明功能的简单子步骤说明,而是一个明显更窄且不同的实际能力,因此属于描述与行为不匹配。

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The declared description presents an end-user skill for fetching Bilibili CC subtitles, processing them, and producing Notion learning notes. However, the supplied code chunk is only a test utility that checks whether /tmp/BBDown and ffmpeg are installed and then prints instructions for using another script. Its primary purpose is environment validation, not subtitle extraction, note generation, or Notion integration. This is a material description-behavior mismatch.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
声明描述的核心功能是围绕 B 站视频字幕到 Notion 学习笔记的完整处理流程,但提供的代码与该流程基本无关。代码没有访问 B 站、没有处理视频链接、没有下载或解析字幕、没有生成任何笔记内容;它唯一的功能是把指定本地文件上传到 Notion 并返回上传 ID。虽然上传文件到 Notion 可能在更大系统中作为辅助步骤存在,但单独这段代码的主要目的与声明的主要目的明显不一致,且体现出一个未声明的独立能力,因此应判定为描述与行为不匹配。

Missing User Warnings

High
Confidence
96% confidence
Finding
The duplicate-page cleanup step archives pages in Notion, which is a destructive integrity-affecting action against user data, but the skill lacks a prominent warning and explicit approval flow for that behavior. If triggered incorrectly, it could archive legitimate user notes with matching titles, causing data loss or workflow disruption.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
print(f"\n🔍 {description}...")

    try:
        result = subprocess.run(
            cmd, shell=True, capture_output=True, text=True, check=True
        )
        return json.loads(result.stdout)
Confidence
99% confidence
Finding
This is a concrete tool-parameter abuse issue because the workflow builds shell commands from multiple untrusted parameters and executes them with shell=True. The skill context makes this more dangerous, not less, because it is designed to ingest external video URLs and content and then chain several tools together, allowing one malicious input to propagate into command execution across the workflow.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
This markdown file presents all instructions and user-facing guidance exclusively in Chinese, which effectively forces a specific language/locale on users. The policy allows locale constraints only when justified or when the user is offered a choice, neither of which is present here.

External Transmission

Medium
Category
Data Exfiltration
Content
pip install requests

# 下载BBDown(B站下载器)
curl -L -o /tmp/BBDown.zip "https://github.com/nilaoda/BBDown/releases/download/1.6.3/BBDown_1.6.3_20240814_linux-x64.zip"
unzip /tmp/BBDown.zip -d /tmp/
chmod +x /tmp/BBDown
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
pip install requests

# 下载BBDown(B站下载器)
curl -L -o /tmp/BBDown.zip "https://github.com/nilaoda/BBDown/releases/download/1.6.3/BBDown_1.6.3_20240814_linux-x64.zip"
unzip /tmp/BBDown.zip -d /tmp/
chmod +x /tmp/BBDown
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Intent-Code Divergence

Medium
Confidence
98% confidence
Finding
L025 明确写道“不再使用固定的process_subtitles.py程序”,表示字幕处理已改由大模型负责。但 L146-L147 和 L214-L216 的分步执行与场景示例仍要求运行/调用 process_subtitles.py,文档内部对技能实际工作方式形成直接矛盾。

External Transmission

Medium
Category
Data Exfiltration
Content
pip install requests

# 2. 下载BBDown
curl -L -o /tmp/BBDown.zip "https://github.com/nilaoda/BBDown/releases/download/1.6.3/BBDown_1.6.3_20240814_linux-x64.zip"
unzip /tmp/BBDown.zip -d /tmp/
chmod +x /tmp/BBDown
Confidence
84% confidence
Finding
The document instructs users to download and execute a binary directly from an external release URL into /tmp without any integrity verification such as checksum or signature validation. If the release asset, transport path, or hosting account were compromised, users could run tampered code on their systems.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The instructions describe sending subtitle text, screenshots, and metadata to external services and creating or modifying Notion content without a clear disclosure of data transmission or workspace modification. This can cause users to upload sensitive video content, notes, or images to third parties unintentionally, especially because the skill is designed to automate the full workflow.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The documentation explicitly describes uploading local files to Notion and creating pages through Notion API/CLI, but it does not warn users that local content, screenshots, and derived notes will be transmitted to a third-party cloud service. This creates a real privacy and consent risk because users may assume the workflow is local-only or may not realize potentially sensitive material is being exported externally.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The one-click workflow is presented as a convenience feature while bundling several external and state-changing actions: downloading content, generating screenshots, uploading files, and creating remote Notion pages. Without a warning or confirmation boundary, users may trigger a chain of operations that affects remote accounts and discloses data unintentionally.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The README describes a workflow that uploads subtitles, screenshots, and derived notes to Notion, but it does not clearly warn users that video content may contain sensitive, copyrighted, or personal information that will be transmitted to a third-party service. In this skill’s context, the omission matters because the entire purpose of the skill is to extract and republish content externally, increasing the chance of unintended data disclosure.

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill exposes broad capabilities—network access, shell execution, and file read/write—without any explicit tool scoping or allowlist. In an agent setting, this increases the blast radius of prompt injection or misuse because the runtime is permitted to perform powerful actions beyond the minimal set clearly constrained in metadata.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill is designed to upload local screenshots and create Notion pages, which modifies user-owned remote content, yet the user-facing description does not prominently warn that external data transfer and content creation will occur. This weakens informed consent and can lead to unintended disclosure of local files or unauthorized writes to a user's workspace.

Intent-Code Divergence

Medium
Confidence
94% confidence
Finding
L052-L128 requires a full seven-section learning-note structure including course overview, knowledge framework, detailed study content, concept summaries, reflections, formulas/methods, and FAQ. But the example at L282-L300 shows a much simpler segment-by-segment note format, and the later example at L221-L242 also presents a different simplified chapter layout. This is active documentation inconsistency about what the skill is supposed to generate.

External Transmission

Medium
Category
Data Exfiltration
Content
pip install requests

# 下载BBDown(B站下载器)
curl -L -o /tmp/BBDown.zip "https://github.com/nilaoda/BBDown/releases/download/1.6.3/BBDown_1.6.3_20240814_linux-x64.zip"
unzip /tmp/BBDown.zip -d /tmp/
chmod +x /tmp/BBDown
Confidence
88% confidence
Finding
The skill instructs downloading and executing a binary from an external release URL via curl/unzip/chmod without any integrity verification such as checksums or signature validation. This creates a supply-chain risk: if the release is tampered with, replaced, or intercepted in a compromised environment, the agent may run untrusted code.

Intent-Code Divergence

Medium
Confidence
97% confidence
Finding
At L507-L513, Step 2 says the model must '逐字保留' all subtitle text and forbids summarization or omission. Earlier requirements at L024-L049 and L130-L150 require understanding the course, extracting knowledge points, building a knowledge framework, and adding learner reflections, which is materially different from verbatim preservation. These instructions describe conflicting intents for the core behavior of the skill.

Static analysis

No suspicious patterns detected.