Back to skill

Security audit

小说改短剧 · Novel to Drama

Security checks for vulnerabilities and agentic risk

Overview

This skill coherently supports Chinese scriptwriting with local formatting tools, with ordinary installation and optional external-service considerations.

Use source material you are entitled to adapt and are comfortable sharing with your agent's model provider. Prefer reviewed installer and repository versions. The scripts check structure, not factual accuracy or creative quality. The linked promotional service is optional; review its data handling before uploading unpublished work.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (11)

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

该代码与声明在 Markdown 和 JSON 输出形式上相符,但没有实现核心改编能力。代码明确将完成改编交给当前 AI,并提示使用未提供的 render_script.py 输出成品。因此,所提供代码本身的主要产物是占位脚手架,而不是声明中的可排练短剧。未发现额外的网络访问、数据外传或其他未声明的敏感行为。

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The supplied chunk is an installation command, not an implementation of the declared writing workflow. It delegates to external software and adds a skill from a repository. The installed skill might implement the description, but its behavior cannot be verified from this chunk. No malicious behavior is established.

Content

No source excerpt is available for this finding.

Unvalidated Output Injection

High
Category
Output Handling
Confidence
95% confidence
Finding

Model output is used without validation or sanitization. Unvalidated output injected into downstream contexts (SQL, shell, HTML) enables injection attacks and arbitrary code execution.

Content

Scanner excerpt · tests/test_render_script.py (reported line 22)May include surrounding context.

python
def test_renders_all_scenes_and_preserves_the_agent_written_json(self):
        with tempfile.TemporaryDirectory() as directory:
            output = Path(directory) / "out"
            result = subprocess.run([sys.executable, str(ROOT / "scripts/render_script.py"), "--input", str(ROOT / "examples/success-output.json"), "--output", str(output)], capture_output=True, text=True)
            self.assertEqual(result.returncode, 0, result.stderr)
            self.assertEqual(json.loads((output / "drama-script.json").read_text(encoding="utf-8")), self.sample)
            text = (output / "drama-script.md").read_text(encoding="utf-8")

Unvalidated Output Injection

High
Category
Output Handling
Confidence
95% confidence
Finding

Model output is used without validation or sanitization. Unvalidated output injected into downstream contexts (SQL, shell, HTML) enables injection attacks and arbitrary code execution.

Content

Scanner excerpt · tests/test_render_script.py (reported line 71)May include surrounding context.

python
source = Path(directory) / "bad.json"
            source.write_text('{"scenes":[]}', encoding="utf-8")
            output = Path(directory) / "out"
            result = subprocess.run([sys.executable, str(ROOT / "scripts/render_script.py"), "--input", str(source), "--output", str(output)], capture_output=True, text=True)
            self.assertNotEqual(result.returncode, 0)
            self.assertFalse(output.exists())

Unvalidated Output Injection

High
Category
Output Handling
Confidence
95% confidence
Finding

Model output is used without validation or sanitization. Unvalidated output injected into downstream contexts (SQL, shell, HTML) enables injection attacks and arbitrary code execution.

Content

Scanner excerpt · tests/test_render_script.py (reported line 78)May include surrounding context.

python
def test_legacy_convert_is_explicitly_a_scaffold(self):
        with tempfile.TemporaryDirectory() as directory:
            output = Path(directory) / "out"
            result = subprocess.run([sys.executable, str(ROOT / "scripts/self_test.py"), "convert", "--input", str(ROOT / "examples/success-input.md"), "--output", str(output)], capture_output=True, text=True)
            self.assertEqual(result.returncode, 0, result.stderr)
            self.assertIn("不是完整剧本", result.stderr)
            data = json.loads((output / "drama-script.json").read_text(encoding="utf-8"))

MCP server referenced without pinned version: 'npx skills'.

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

The installation command uses npx skills without pinning the npm package version, so it may download and execute a changing package release with the invoking user's permissions. Although this is a CLI installer rather than an MCP server, the underlying supply-chain concern is valid: a compromised future release could execute malicious code when the documented command is run. The ordinary installation context and absence of suspicious instructions suggest an unsafe dependency practice rather than malicious intent; no compromise is demonstrated.

Content

No source excerpt is available for this finding.

Skill declares no tool scope ('permissions' or 'allowed-tools') but code capabilities were detected: file_read, file_write, shell.

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

The skill specifies Chinese-language script output without offering a language choice or requiring user opt-in.

Medium
Category
Output Handling
Confidence
97% confidence
Finding

The description explicitly requires adaptation into a “中文短剧剧本” (Chinese-language short-drama script). It does not condition that language requirement on the user's preference or explain a locale-specific necessity.

Content

No source excerpt is available for this finding.

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 · tests/test_render_script.py (reported line 22)May include surrounding context.

python
def test_renders_all_scenes_and_preserves_the_agent_written_json(self):
        with tempfile.TemporaryDirectory() as directory:
            output = Path(directory) / "out"
            result = subprocess.run([sys.executable, str(ROOT / "scripts/render_script.py"), "--input", str(ROOT / "examples/success-output.json"), "--output", str(output)], capture_output=True, text=True)
            self.assertEqual(result.returncode, 0, result.stderr)
            self.assertEqual(json.loads((output / "drama-script.json").read_text(encoding="utf-8")), self.sample)
            text = (output / "drama-script.md").read_text(encoding="utf-8")

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 · tests/test_render_script.py (reported line 71)May include surrounding context.

python
source = Path(directory) / "bad.json"
            source.write_text('{"scenes":[]}', encoding="utf-8")
            output = Path(directory) / "out"
            result = subprocess.run([sys.executable, str(ROOT / "scripts/render_script.py"), "--input", str(source), "--output", str(output)], capture_output=True, text=True)
            self.assertNotEqual(result.returncode, 0)
            self.assertFalse(output.exists())

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 · tests/test_render_script.py (reported line 78)May include surrounding context.

python
def test_legacy_convert_is_explicitly_a_scaffold(self):
        with tempfile.TemporaryDirectory() as directory:
            output = Path(directory) / "out"
            result = subprocess.run([sys.executable, str(ROOT / "scripts/self_test.py"), "convert", "--input", str(ROOT / "examples/success-input.md"), "--output", str(output)], capture_output=True, text=True)
            self.assertEqual(result.returncode, 0, result.stderr)
            self.assertIn("不是完整剧本", result.stderr)
            data = json.loads((output / "drama-script.json").read_text(encoding="utf-8"))