Back to skill

Security audit

Auto video clipping and publishing | by Vizard.ai

Security checks for vulnerabilities and agentic risk

Overview

This Vizard API skill is mostly purpose-aligned, but its publishing example can immediately post to a connected social account without clear user confirmation.

Review carefully before installing. This skill is reasonable for Vizard-based video workflows, but do not let an agent publish through it unless it first shows the exact clip, destination platform/account, caption, and schedule and gets explicit approval.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:96
Finding

Unsafe Immediate Publication to an Unverified Social Account

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 96–110
Vulnerability Type: Blind selection of a social account and immediate publication without confirmation
Risk Level: Medium

Vulnerable Code

python
# First get connected account IDs
accounts = requests.get(
    "https://elb-api.vizard.ai/hvizard-server-front/open-api/v1/project/social-accounts",
    headers={"VIZARDAI_API_KEY": "YOUR_API_KEY"}
).json()["accounts"]

# Then publish
requests.post(
    "https://elb-api.vizard.ai/hvizard-server-front/open-api/v1/project/publish-video",
    headers={**headers},
    json={
        "finalVideoId": clips[0]["videoId"],
        "socialAccountId": accounts[0]["id"],
        "post": ""   # empty = AI auto-generates caption + hashtags
    }
)

Technical Analysis

The publication example automatically selects clips[0] and accounts[0] without validating which clip or social account the user intended to use. It does not inspect the account's platform, username, ownership, or connection status before submitting the publication request.

The request also omits publishTime, which the API reference indicates results in immediate publication. Supplying an empty post delegates caption and hashtag generation to the remote service, so the public text is not presented to the user for review. There is no explicit confirmation step immediately before this externally visible action.

The API key and transmission of a selected video URL to the declared Vizard HTTPS endpoint are necessary for the Skill's stated functionality. No unrelated credential exfiltration was identified. However, publication authority is exercised more broadly than necessary because the example does not constrain the action to a user-selected destination and reviewed content.

Attack Path

  1. A user has multiple social accounts connected to the Vizard account.
  2. The Agent follows the documented workflow and retrieves the connected accounts.
  3. The example blindly ...[truncated 1392 chars]
Remediation
View remediation

Remediation Suggestions

  1. Require the user to explicitly select the destination account by verified platform and username rather than using accounts[0].
  2. Display available accounts and reject accounts whose status is expired, locked, inactive, or not connected.
  3. Require explicit selection and preview of the clip instead of automatically using clips[0].
  4. Generate or accept the caption separately, show the complete caption and hashtags to the user, and require approval before publication.
  5. Present a final confirmation containing the destination platform, username, clip title or ID, caption, and publication time.
  6. Separate content generation from publication so that processing a video cannot implicitly authorize a public post.
  7. Prefer a draft or scheduled-publication workflow where supported. If immediate publication is required, obtain confirmation immediately before the publish-video request.
  8. Check HTTP status codes and API response fields before reporting success, and avoid retrying publication requests without verifying whether the first request succeeded.
  9. Document that the API key grants access to connected social accounts and should be stored securely, redacted from logs, and scoped or rotated where the service supports those controls.

A safer workflow should identify the target account explicitly:

python
active_accounts = [
    account for account in accounts
    if account.get("status") == "active"
]

# Present platform, username, and ID to the user.
# Continue only after the user explicitly selects an account and approves
# the exact clip, caption, and publication timing.
selected_account_id = user_confirmed_account_id
selected_video_id = user_confirmed_video_id
approved_caption = user_confirmed_caption

payload = {
    "finalVideoId": selected_video_id,
    "socialAccountId": selected_account_id,
    "post": approved_caption
}

# Send only after final user confirmation.
response = requests.post(
    "https://elb-api.vizard.ai
...[truncated 145 chars]
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (11)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill’s activation text is broad enough to trigger on generic video-editing or social media content tasks, not just narrowly scoped Vizard API requests. Over-broad routing can cause the agent to invoke a capability that uploads user media or prepares publishing actions when the user did not explicitly ask to use this third-party service, increasing the chance of unintended external data transfer.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · SKILL.md (reported line 33)May include surrounding context.

md
"VIZARDAI_API_KEY": "YOUR_API_KEY"
}

resp = requests.post(
    "https://elb-api.vizard.ai/hvizard-server-front/open-api/v1/project/create",
    headers=headers,
    json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · SKILL.md (reported line 48)May include surrounding context.

md
"VIZARDAI_API_KEY": "YOUR_API_KEY"
}

resp = requests.post(
    "https://elb-api.vizard.ai/hvizard-server-front/open-api/v1/project/create",
    headers=headers,
    json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · SKILL.md (reported line 111)May include surrounding context.

md
"VIZARDAI_API_KEY": "YOUR_API_KEY"
}

resp = requests.post(
    "https://elb-api.vizard.ai/hvizard-server-front/open-api/v1/project/create",
    headers=headers,
    json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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 · SKILL.md (reported line 33)May include surrounding context.

md
"VIZARDAI_API_KEY": "YOUR_API_KEY"
}

resp = requests.post(
    "https://elb-api.vizard.ai/hvizard-server-front/open-api/v1/project/create",
    headers=headers,
    json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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 · SKILL.md (reported line 48)May include surrounding context.

md
"VIZARDAI_API_KEY": "YOUR_API_KEY"
}

resp = requests.post(
    "https://elb-api.vizard.ai/hvizard-server-front/open-api/v1/project/create",
    headers=headers,
    json={

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill includes publishing to connected social accounts but does not require an explicit warning or confirmation before posting externally. In an agent setting, this creates a real risk of unauthorized or surprising actions on third-party platforms, potentially causing reputation damage, accidental disclosure, or unwanted public publication.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

This duplicate finding again highlights the publish-video call, which can perform irreversible posting to external social accounts. In the context of an agent skill, the danger is elevated because a broad invocation path plus absent confirmation can translate directly into unauthorized public actions.

Content

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

md
).json()["accounts"]

# Then publish
requests.post(
    "https://elb-api.vizard.ai/hvizard-server-front/open-api/v1/project/publish-video",
    headers={**headers},
    json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

This duplicate finding again highlights the publish-video call, which can perform irreversible posting to external social accounts. In the context of an agent skill, the danger is elevated because a broad invocation path plus absent confirmation can translate directly into unauthorized public actions.

Content

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

md
).json()["accounts"]

# Then publish
requests.post(
    "https://elb-api.vizard.ai/hvizard-server-front/open-api/v1/project/publish-video",
    headers={**headers},
    json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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 · SKILL.md (reported line 111)May include surrounding context.

Step 3 (Optional): Generate AI Social Caption

python
resp = requests.post(
    "https://elb-api.vizard.ai/hvizard-server-front/open-api/v1/project/ai-social",
    headers=headers,
    json={

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill documents an API that can immediately publish or schedule posts to connected social media accounts, but it provides no explicit warning that invoking this endpoint can cause externally visible account actions. In an agent setting, this is dangerous because a model or user may treat publishing as a routine content operation rather than a sensitive side effect, leading to unauthorized, accidental, or premature public posting.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.