Back to skill

Security audit

VectCut: The first "To-Agent" video editing platform. Build automated video workflows with our stable cloud APIs in Coze, Dify, or OpenClaw.

Security checks for vulnerabilities and agentic risk

Overview

This VectCut video-editing skill is mostly coherent, but it mishandles the user's API key by asking agents to print, paste, or embed it in generated prompts.

Review before installing. Use this skill only if you are comfortable granting it VectCut account access for draft creation, uploads, rendering, and media processing. Do not paste API keys into chat, do not print them with echo or printenv, and do not use the Feishu workflow generator until it uses protected secret references instead of embedding the raw key.

Vulnerability Patterns
  • 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
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
rules/feishu-bitetable-creator.md:110
Finding

Live VectCut API Key Embedded in Generated Feishu Workflow Prompts

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/vectcut_login.py:14
Finding

VectCut API Key Exposed Through Chat, Command-Line Arguments, and Standard Output

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
references/bgms.json:3
Finding

Unpinned Mutable Media Assets Loaded from an Unrelated Third-Party Domain

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (211)

Tainted flow: 'token' from os.environ.get (line 32, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/add_bgm.py (reported line 82)May include surrounding context.

python
def _query_draft_duration_seconds(token, draft_id):
    resp = requests.post(
        f"{BASE_URL}{QUERY_SCRIPT_PATH}",
        headers=_auth_headers(token),
        json={"draft_id": draft_id, "force_update": True},

Tainted flow: 'token' from os.environ.get (line 32, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/add_bgm.py (reported line 110)May include surrounding context.

python
def _get_media_duration_seconds(token, url):
    resp = requests.post(
        f"{BASE_URL}{GET_DURATION_PATH}",
        headers=_auth_headers(token),
        json={"url": url},

Tainted flow: 'token' from os.environ.get (line 32, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/add_bgm.py (reported line 128)May include surrounding context.

python
def _add_audio_once(token, payload):
    resp = requests.post(
        f"{BASE_URL}{ADD_AUDIO_PATH}",
        headers=_auth_headers(token),
        json=payload,

Tainted flow: 'token' from os.environ.get (line 34, credential/environment) → requests.get (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/add_effect.py (reported line 63)May include surrounding context.

python
def get_scene_effect_types(token):
    resp = requests.get(
        f"{BASE_URL}{SCENE_TYPES_PATH}",
        headers=_auth_headers(token),
        timeout=60,

Tainted flow: 'token' from os.environ.get (line 34, credential/environment) → requests.get (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/add_effect.py (reported line 75)May include surrounding context.

python
def get_character_effect_types(token):
    resp = requests.get(
        f"{BASE_URL}{CHARACTER_TYPES_PATH}",
        headers=_auth_headers(token),
        timeout=60,

Tainted flow: 'token' from os.environ.get (line 34, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/add_effect.py (reported line 186)May include surrounding context.

python
def add_effect(token, payload):
    resp = requests.post(
        f"{BASE_URL}{ADD_EFFECT_PATH}",
        headers=_auth_headers(token),
        json=payload,

Tainted flow: 'token' from os.environ.get (line 34, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/add_effect_audio.py (reported line 103)May include surrounding context.

python
def _get_media_duration_seconds(token, url):
    resp = requests.post(
        f"{BASE_URL}{GET_DURATION_PATH}",
        headers=_auth_headers(token),
        json={"url": url},

Tainted flow: 'token' from os.environ.get (line 34, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/add_effect_audio.py (reported line 119)May include surrounding context.

python
def _add_audio_once(token, payload):
    resp = requests.post(
        f"{BASE_URL}{ADD_AUDIO_PATH}",
        headers=_auth_headers(token),
        json=payload,

Tainted flow: 'token' from os.environ.get (line 23, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/add_preset.py (reported line 61)May include surrounding context.

python
def add_preset(token: str, payload: dict) -> dict:
    resp = requests.post(
        f"{BASE_URL}{ADD_PRESET_PATH}",
        headers=_auth_headers(token),
        json=payload,

Tainted flow: 'token' from os.environ.get (line 37, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/add_title.py (reported line 102)May include surrounding context.

python
def add_title(token, payload):
    resp = requests.post(
        f"{BASE_URL}{ADD_TEXT_PATH}",
        headers=_auth_headers(token),
        json=payload,

Tainted flow: 'auth_headers' from os.getenv (line 23, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/cloud_render.py (reported line 31)May include surrounding context.

python
# Step 1: Submit render task
    print(f"[1/2] Submitting render task for draft: {draft_id} ({resolution}, {framerate}fps)...")
    payload = {"draft_id": draft_id, "resolution": resolution, "framerate": framerate}
    resp = requests.post(
        f"{BASE_URL}/cut_jianying/generate_video",
        headers=auth_headers,
        json=payload,

Tainted flow: 'auth_headers' from os.getenv (line 23, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/cloud_render.py (reported line 55)May include surrounding context.

python
if elapsed > TIMEOUT:
            raise RuntimeError(f"Render timed out after {TIMEOUT}s. task_id: {task_id}")

        resp = requests.post(
            f"{BASE_URL}/cut_jianying/task_status",
            headers=auth_headers,
            json={"task_id": task_id},

Tainted flow: 'token' from os.environ.get (line 47, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/describe_video.py (reported line 285)May include surrounding context.

python
def submit_asr_basic_task(token, url):
    payload = {"url": url, "effect_mode": "basic"}
    resp = requests.post(
        f"{BASE_URL}{ASR_SUBMIT_PATH}",
        headers=_auth_headers(token),
        json=payload,

Tainted flow: 'token' from os.environ.get (line 47, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/describe_video.py (reported line 301)May include surrounding context.

python
def get_duration(token, url):
    resp = requests.post(
        f"{BASE_URL}{GET_DURATION_PATH}",
        headers=_auth_headers(token),
        json={"url": url},

Tainted flow: 'token' from os.environ.get (line 47, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/describe_video.py (reported line 338)May include surrounding context.

python
def submit_split_video_task(token, video_url, start_s, end_s):
    resp = requests.post(
        f"{BASE_URL}{SPLIT_SUBMIT_PATH}",
        headers=_auth_headers(token),
        json={"video_url": video_url, "start": start_s, "end": end_s},

Tainted flow: 'token' from os.environ.get (line 47, credential/environment) → requests.get (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/describe_video.py (reported line 354)May include surrounding context.

python
def query_split_video_task_status(token, task_id):
    resp = requests.get(
        f"{BASE_URL}{SPLIT_STATUS_PATH}",
        headers=_auth_headers(token),
        params={"task_id": task_id},

Tainted flow: 'headers' from os.environ.get (line 399, credential/environment) → requests.get (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/describe_video.py (reported line 400)May include surrounding context.

python
def query_asr_task_status(token, task_id):
    headers = _auth_headers(token)
    get_resp = requests.get(
        f"{BASE_URL}{ASR_STATUS_PATH}",
        headers=headers,
        params={"task_id": task_id},

Tainted flow: 'headers' from os.environ.get (line 399, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/describe_video.py (reported line 410)May include surrounding context.

python
if get_resp.status_code == 200 and "status" in get_body:
        return get_body

    post_resp = requests.post(
        f"{BASE_URL}{ASR_STATUS_PATH}",
        headers=headers,
        json={"task_id": task_id},

Tainted flow: 'token' from os.environ.get (line 47, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/describe_video.py (reported line 438)May include surrounding context.

python
def submit_extract_audio_task(token, video_url):
    resp = requests.post(
        f"{BASE_URL}{EXTRACT_SUBMIT_PATH}",
        headers=_auth_headers(token),
        json={"video_url": video_url},

Tainted flow: 'token' from os.environ.get (line 47, credential/environment) → requests.get (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/describe_video.py (reported line 454)May include surrounding context.

python
def query_extract_audio_task_status(token, task_id):
    resp = requests.get(
        f"{BASE_URL}{EXTRACT_STATUS_PATH}",
        headers=_auth_headers(token),
        params={"task_id": task_id},

Tainted flow: 'token' from os.environ.get (line 47, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/describe_video.py (reported line 715)May include surrounding context.

python
payload = {"video_url": video_url, "stream": True}
    if isinstance(prompt, str) and prompt.strip():
        payload["prompt"] = prompt.strip()
    resp = requests.post(
        f"{BASE_URL}{VIDEO_DETAIL_PATH}",
        headers=_auth_headers(token),
        json=payload,

Tainted flow: 'token' from os.environ.get (line 26, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/extract_audio_async.py (reported line 59)May include surrounding context.

python
def submit_task(token, video_url):
    resp = requests.post(
        f"{BASE_URL}{SUBMIT_PATH}",
        headers=_auth_headers(token),
        json={"video_url": video_url},

Tainted flow: 'token' from os.environ.get (line 26, credential/environment) → requests.get (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/extract_audio_async.py (reported line 75)May include surrounding context.

python
def query_task_status(token, task_id):
    resp = requests.get(
        f"{BASE_URL}{STATUS_PATH}",
        headers=_auth_headers(token),
        params={"task_id": task_id},

Tainted flow: 'token' from os.environ.get (line 64, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/generate_ai_image_async.py (reported line 181)May include surrounding context.

python
def submit_task(token, payload):
    resp = requests.post(
        f"{BASE_URL}{SUBMIT_PATH}",
        headers=_auth_headers(token),
        json=payload,

Tainted flow: 'token' from os.environ.get (line 64, credential/environment) → requests.get (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/generate_ai_image_async.py (reported line 196)May include surrounding context.

python
def query_task_status(token, task_id):
    resp = requests.get(
        f"{BASE_URL}{STATUS_PATH}",
        headers=_auth_headers(token),
        params={"task_id": task_id},

Static analysis

Detected: suspicious.dynamic_code_execution

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
scripts/apply_subtitle_template.py:208

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
scripts/scrapt_video.py:120