Back to skill

Security audit

Wechat Article Video

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly coherent for making Chinese WeChat videos, but it should be reviewed because it tells agents to run an unpinned external npx tool during the workflow.

Install only if you are comfortable with a workflow that runs local media tools and sends narration text to Edge TTS. Before use, pin or locally install HyperFrames and run it with `npx --no-install` or a lockfile-backed local binary, keep project files in a dedicated workspace, and avoid exposing unrelated credentials or private files to the agent environment.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (1)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:172
Finding

Unpinned Package Retrieval and Execution Through npx

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, line 172
Vulnerability Type: Unpinned third-party package execution
Risk Level: Medium

Vulnerable Code Snippet

markdown
HyperFrames: keep media as direct children of the composition root, start the voiceover at `timeline.audio_start_sec`, register one paused seekable timeline, use deterministic assets, and run `npx hyperframes check`.

Technical Analysis

The documented command invokes hyperframes through npx without an exact version, lockfile, integrity constraint, or --no-install option. If the package is not already installed locally, npx may resolve it from the configured npm registry and execute the retrieved package binary.

As a result, the reviewed repository does not fully determine which code the command will execute. The effective payload may change after the skill has been audited due to a compromised package release, account takeover, registry compromise, dependency confusion involving registry configuration, or an incompatible future release.

This is a supply-chain weakness rather than evidence that the current hyperframes package is malicious.

Attack Path

  1. A user or agent selects the HyperFrames workflow.
  2. The agent follows the instruction in SKILL.md and runs npx hyperframes check.
  3. No trusted local installation is available, so npx resolves the package using the configured npm registry.
  4. An attacker-controlled or compromised package version is downloaded.
  5. Its package binary, and potentially applicable installation lifecycle behavior, executes under the account running the agent.
  6. The malicious code can act with that process account's filesystem, network, and subprocess permissions.

Impact Assessment

Successful exploitation could provide arbitrary code execution with the privileges of the user or agent process. Depending on the runtime environment, the executed package could:

  • Read project files and other data accessible t ...[truncated 402 chars]
Remediation
View remediation

Remediation Suggestions

  1. Add an audited package.json and lockfile to define the required HyperFrames package and its complete dependency graph.
  2. Pin HyperFrames to an exact reviewed version rather than a floating tag or version range.
  3. Install dependencies reproducibly with npm ci from the committed lockfile.
  4. Use npm ci --ignore-scripts where package compatibility permits. If lifecycle scripts are required, audit and explicitly allow them.
  5. Invoke only the preinstalled local binary, for example:
bash
npx --no-install hyperframes check
  1. Consider calling the lockfile-installed executable directly:
bash
./node_modules/.bin/hyperframes check
  1. Enforce package integrity through the lockfile and use a trusted registry configuration.
  2. Run renderer tooling in a sandbox with restricted filesystem access, minimal environment variables, no unnecessary credentials, and limited outbound network access.
  3. Establish a dependency-update review process so package and lockfile changes receive security review before use.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (15)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · .gitignore (reported line 12)May include surrounding context.

text
*.jpg
*.jpeg
*.png
.env
.env.*
production/
release/

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The code chunk’s primary purpose is materially different from the declared skill description. It only samples frames from an existing video and assembles a review/contact sheet image. While this could be a minor QA helper within a larger video workflow, the supplied code itself does not implement the declared core capabilities of article-to-video generation, TTS, subtitle sync, rendering, or publish-ready packaging. Therefore the description does not accurately represent what this code chunk actually does.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill instructs the agent to read and write files and execute shell commands, but it does not declare any explicit tool scope or permission boundaries. In an agent environment, that creates an authorization ambiguity where the skill may operate with broader filesystem or command-execution access than reviewers or users expect.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The instruction "Default to Chinese" imposes a language preference on output behavior. The file does not clearly present this as an opt-in user choice or justify the constraint as a China-only or Chinese-only skill policy, so it can violate language/locale choice expectations.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

Using npx hyperframes without pinning a version allows resolution of whatever package version is current at execution time. That creates a supply-chain risk: a compromised or breaking upstream release could execute unexpected code in the agent's environment with the skill's available privileges.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The instruction 'Use spoken Chinese' is a natural-language locale constraint that applies to all outputs from this skill. The file does not offer an opt-in, alternative language option, or a documented justification that this skill is intentionally region-specific, so it conflicts with the language/locale policy criteria.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The instruction to fit long Chinese names dynamically implies a specific language/locale requirement in the skill guidance. The file does not offer a user language choice or explain that the skill is intended only for a Chinese-language or region-specific context, which can violate the language/locale policy.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The default voice is hard-coded to "zh-CN-XiaoxiaoNeural", which imposes a specific language/locale choice on users unless they override it manually. The file does not indicate that this locale restriction is optional by design or justified as a region-specific tool.

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 · scripts/make_contact_sheet.py (reported line 30)May include surrounding context.

python
def probe_duration(video: Path) -> float:
    result = subprocess.run(
        [
            "ffprobe",
            "-v",

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 · scripts/make_contact_sheet.py (reported line 68)May include surrounding context.

python
def extract_frame(video: Path, timestamp: float, destination: Path) -> None:
    subprocess.run(
        [
            "ffmpeg",
            "-y",

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 · scripts/qa_video.py (reported line 17)May include surrounding context.

python
def probe(video: Path) -> dict:
    result = subprocess.run(
        [
            "ffprobe",
            "-v",

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 · scripts/qa_video.py (reported line 47)May include surrounding context.

python
def extract_first_frame(video: Path, destination: Path) -> dict:
    destination.parent.mkdir(parents=True, exist_ok=True)
    subprocess.run(
        [
            "ffmpeg",
            "-y",

Scope Creep

Low
Category
Excessive Agency
Confidence
70% confidence
Finding

Skill's behavior or capabilities extend beyond its stated purpose. Scope creep allows an agent to perform actions unrelated to its documented functionality, increasing the attack surface.

Content

Scanner excerpt · LICENSE (reported line 12)May include surrounding context.

text
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The short description forces a specific language/locale presentation without indicating that users can choose another language. This can violate language policy expectations when a skill is not clearly documented as region-specific or opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The example sets voice.provider to edge-tts and name to zh-CN-XiaoxiaoNeural, which implies a fixed Chinese-language voice configuration. Because the document does not state that language is user-selectable or that this schema is only for a Chinese-specific workflow, it can be read as forcing a specific locale by default.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.