Back to skill

Security audit

Jianying Editor Skill

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent JianYing automation tool, but its default voice-generation path quietly reads local JianYing identifiers and sends them with narration text to an external service.

Install only if you are comfortable giving an agent control over JianYing drafts, local media files, GUI export automation, cloud media downloads, and optional screen recording. Before using narration, prefer an explicitly selected backend you trust; the default intelligent TTS path sends narration plus JianYing device/installation identifiers to a ByteDance endpoint. Avoid the shortened PowerShell installer unless you inspect it first, and be careful with export paths because some helpers may overwrite existing files.

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

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/universal_tts.py:11
Finding

Automatic Collection and Transmission of Local JianYing Identifiers

Content
View full analysis
Tuple[str, str]: local_app_data = os.getenv("LOCALAPPDATA") if not local_app_data: return "1053764930506284", "2314914062247833" jy_user_data = os.path.join(local_app_data, r"JianyingPro\User Data") cfg = {"device_id": "1053764930506284", "iid": "2314914062247833"} ttnet_path = os.path.join(jy_user_data, r"TTNet\tt_net_config.config") if os.path.exists(ttnet_path): try: with open(ttnet_path, "r", encoding="utf-8", errors="ignore") as f: content = f.read() m = re.search(r"device_id&#\*(\d+)", content) if m: cfg["device_id"] = m.group(1) except Exception: pass log_dir = os.path.join(jy_user_data, "Log") if os.path.exists(log_dir): logs = sorted( [os.path.join(log_dir, x) for x in os.listdir(log_dir) if x.endswith(".log")], key=os.path.getmtime, reverse=True, ) for p in logs[:5]: try: with open(p, "r", encoding="utf-8", errors="ignore") as f: chunk = f.read(1_000_000) m = re.search(r"iid=(\d+)", chunk) if m: cfg["iid"] = m.group(1) break except Exception: continue return cfg["device_id"], cfg["iid"] ``` ```python async def _run_sami_tts(text: str, speaker: str, output_file: str, dev_id: str, iid: str): ws_url = f"wss://sami.bytedance.com/internal/api/v2/ws?device_id={dev_id}&iid={iid}" headers = { "User-Agent": f"JianyingPro/5.9.0.11632 (Windows 10.0.19045; ap ...[truncated 4424 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/universal_tts.py:53
Finding

Hard-Coded Reusable Service Credential in TTS Client

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/cloud_manager.py:111
Finding

Cloud Downloader SSRF Protection Can Be Bypassed Through DNS Resolution and Redirects

Content
View full analysis
bool: try: parsed = urlparse(url) if parsed.scheme.lower() not in ALLOWED_SCHEMES: return False host = (parsed.hostname or "").strip().lower() if not host: return False if host in {"localhost", "127.0.0.1", "::1"}: return False try: ip = ipaddress.ip_address(host) if ip.is_private or ip.is_loopback or ip.is_link_local: return False except ValueError: pass return True except Exception: return False ``` The validated URL is later requested with default redirect behavior: ```python if not url: logger.warning("No valid download URL found for ID %s.", eid) return None if not self._is_safe_download_url(url): logger.warning("Unsafe download URL blocked for ID %s: %s", eid, url) return None ext = self._infer_extension(asset, url=url) local_filename = f"{eid}_{safe_name}{ext}" local_path = os.path.join(CACHE_DIR, local_filename) legacy_mp4_path = os.path.join(CACHE_DIR, f"{eid}_{safe_name}.mp4") logger.info("Downloading Cloud Asset: %s", asset["name"]) try: res = requests.get(url, stream=True, timeout=60) ``` ### Technical Analysis The URL validator correctly rejects explicit loopback and private IP literals. However, it does not resolve hostnames before approving them. A hostname therefore passes validation even if DNS resolves it to a private, loopback, link-local, or cloud-metadata address. In addition, `requests.get()` follows redirects by default. Only the original URL is validated, so a public URL can redirect to an internal destination after validation. The code do ...[truncated 2299 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • 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
Findings (145)

Tp4

High
Category
MCP Tool Poisoning
Confidence
89% confidence
Finding

Undeclared network access to a TTS service and local access to JianYing config/log files significantly broadens the operational surface compared with the stated wrapper description. This is dangerous because it combines external data transfer with local application inspection, creating both privacy and unexpected-permission risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Undeclared network access to a TTS service and local access to JianYing config/log files significantly broadens the operational surface compared with the stated wrapper description. This is dangerous because it combines external data transfer with local application inspection, creating both privacy and unexpected-permission risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Undeclared network access to a TTS service and local access to JianYing config/log files significantly broadens the operational surface compared with the stated wrapper description. This is dangerous because it combines external data transfer with local application inspection, creating both privacy and unexpected-permission risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Undeclared network access to a TTS service and local access to JianYing config/log files significantly broadens the operational surface compared with the stated wrapper description. This is dangerous because it combines external data transfer with local application inspection, creating both privacy and unexpected-permission risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

Undeclared network access to a TTS service and local access to JianYing config/log files significantly broadens the operational surface compared with the stated wrapper description. This is dangerous because it combines external data transfer with local application inspection, creating both privacy and unexpected-permission risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Undeclared network access to a TTS service and local access to JianYing config/log files significantly broadens the operational surface compared with the stated wrapper description. This is dangerous because it combines external data transfer with local application inspection, creating both privacy and unexpected-permission risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
89% confidence
Finding

Undeclared network access to a TTS service and local access to JianYing config/log files significantly broadens the operational surface compared with the stated wrapper description. This is dangerous because it combines external data transfer with local application inspection, creating both privacy and unexpected-permission risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Undeclared network access to a TTS service and local access to JianYing config/log files significantly broadens the operational surface compared with the stated wrapper description. This is dangerous because it combines external data transfer with local application inspection, creating both privacy and unexpected-permission risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
89% confidence
Finding

Undeclared network access to a TTS service and local access to JianYing config/log files significantly broadens the operational surface compared with the stated wrapper description. This is dangerous because it combines external data transfer with local application inspection, creating both privacy and unexpected-permission risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Undeclared network access to a TTS service and local access to JianYing config/log files significantly broadens the operational surface compared with the stated wrapper description. This is dangerous because it combines external data transfer with local application inspection, creating both privacy and unexpected-permission risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Undeclared network access to a TTS service and local access to JianYing config/log files significantly broadens the operational surface compared with the stated wrapper description. This is dangerous because it combines external data transfer with local application inspection, creating both privacy and unexpected-permission risks.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- **简单演示使用默认音乐**。实际项目,应优先检索并推荐 `data/cloud_music_library.csv` 中的相关曲目,或根据视频主题(如“科技”、“温暖”)进行关键词过滤。

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- 录屏与智能变焦:`rules/recording.md` -> `tools/recording/recorder.py`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- [examples/web_to_video_intro_demo.py](examples/web_to_video_intro_demo.py) - Web-to-Video intro demo (HTML animation -> timeline clip).

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
96% confidence
Finding

The initialization logic explicitly probes agent-specific directories such as .agent, .trae, and .claude to locate the skill root. Accessing agent config/workspace directories is sensitive because those locations may contain other skills, secrets, session artifacts, or configuration data unrelated to this skill's function, and normalizing such access expands the attack surface for unintended data exposure.

Content

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

md
os.path.join(current_dir, "skills", "jianying-editor"),
    os.path.abspath(".agent/skills/jianying-editor"),
    os.path.abspath(".trae/skills/jianying-editor"),
    os.path.abspath(".claude/skills/jianying-editor"),
    os.path.dirname(current_dir) # 如果在 examples/ 目录下
] if p and os.path.exists(os.path.join(p, "scripts", "jy_wrapper.py"))), None)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script unconditionally removes any existing file at the caller-provided output path before moving the exported video into place. If output_path is mistaken, attacker-influenced, or points to an important user file, this causes irreversible data loss and makes the automation destructive beyond what a user may expect from an export helper.

Content

No source excerpt is available for this finding.

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tools/recording/recorder.py (reported line 213)May include surrounding context.

python
cmd.append(self.output_path)
        
        # 必须设置 PYTHONIOENCODING,否则子进程在 Windows Pipe 中打印 Emoji 会报 GBK 编码错误
        env = os.environ.copy()
        env["PYTHONIOENCODING"] = "utf-8"
        
        self.log_file = os.path.join(self.output_dir, "ffmpeg_log.txt")

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tools/recording/recorder.py (reported line 347)May include surrounding context.

python
cmd.append(self.output_path)
        
        # 必须设置 PYTHONIOENCODING,否则子进程在 Windows Pipe 中打印 Emoji 会报 GBK 编码错误
        env = os.environ.copy()
        env["PYTHONIOENCODING"] = "utf-8"
        
        self.log_file = os.path.join(self.output_dir, "ffmpeg_log.txt")

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The example trigger phrase is extremely broad ('帮我随便剪一个视频看看效果'), making accidental invocation plausible in normal conversation with an AI assistant. In a skill that can import files, generate content, record screens, and automate exports, vague triggers increase the chance of unintended automation actions being performed without sufficiently explicit user consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README promotes starting screen recording automatically ('帮我启动录屏,录完自动导入剪映') without any visible privacy or consent warning. Because screen recording can capture sensitive information, credentials, messages, or unrelated applications, omitting an explicit warning and confirmation step creates a meaningful privacy and data-exposure risk.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill exposes capabilities that imply environment access, file I/O, shell execution, and network use, but it does not declare any explicit tool scope or permission boundaries. In an agent setting, this weakens least-privilege controls and makes it easier for downstream instructions or helper scripts to invoke sensitive operations without transparent review.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The CSV embeds a large number of direct remote media URLs to cloud-hosted audio assets, effectively turning a local wrapper’s data file into a hardcoded catalog of externally retrievable resources. This increases the risk of unauthorized redistribution, unintended data exposure, and supply-chain trust issues if downstream code automatically fetches or trusts these URLs without validation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This CSV includes natural-language guidance and many asset titles primarily in Chinese, which effectively imposes a language/locale on downstream users. The file does not indicate that the skill is China-specific or provide any user opt-in or alternative locale handling.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This CSV contains natural-language names in multiple languages, with Chinese dominating many entries while some entries are in English or French. For a shared asset catalog, this effectively imposes inconsistent locale behavior without any documented user opt-in or stated region-specific justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This CSV enumerates user-facing filter identifiers predominantly in Chinese, with no accompanying indication that users can choose another language or that the dataset is intentionally region-specific. Under the stated policy, hard-coding a locale-specific naming scheme without opt-in or justification is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.