Back to skill

Security audit

seedance

Security checks for vulnerabilities and agentic risk

Overview

The skill is a legitimate video-generation wrapper, but it needs Review because it handles API credentials and local images while allowing under-scoped endpoint, TLS, and runtime setup behavior.

Install only if you trust the publisher and are comfortable with external API calls, quota use, plaintext local .env storage, OSS uploads of local images, and runtime dependency installation. Avoid sensitive images or prompts, keep ARK_ENDPOINT on the official HTTPS host unless you fully trust the proxy, do not use --insecure, and prefer reviewed pinned dependencies before running in a sensitive workspace.

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

T03 · Remote Payload Retrieval and Execution

Error
Location
scripts/seedance:42
Finding

Mutable Remote Bootstrap Script Is Downloaded and Executed Without Integrity Verification

Content
View full analysis
/dev/null 2>&1 && return 0 local gp="$VENV_DIR/get-pip.py" echo "[wrapper] ensurepip unavailable; fetching get-pip.py" >&2 if command -v curl >/dev/null 2>&1; then curl -fsSL https://bootstrap.pypa.io/get-pip.py -o "$gp" || return 1 elif command -v wget >/dev/null 2>&1; then wget -qO "$gp" https://bootstrap.pypa.io/get-pip.py || return 1 else "$VENV_PY" -c "import urllib.request; urllib.request.urlretrieve('https://bootstrap.pypa.io/get-pip.py', '$gp')" || return 1 fi "$VENV_PY" "$gp" >/dev/null 2>&1; local rc=$? rm -f "$gp" [ $rc -eq 0 ] } ``` ### Technical Analysis When `ensurepip` is unavailable, the wrapper downloads the current `get-pip.py` from a remote URL and immediately executes it. HTTPS protects the transfer in normal circumstances, but the script is not pinned to a reviewed version and is not checked against a cryptographic hash or signature. Consequently, the effective code executed by the Skill can change after the Skill package has been reviewed. Compromise of the remote distribution infrastructure, its certificate issuance path, DNS resolution, or a trusted network proxy could replace the bootstrap script with arbitrary Python code. This behavior exceeds the minimum requirement for video generation. A missing package installer should produce a clear prerequisite error rather than cause the Skill to retrieve and execute mutable code automatically. ### Attack Path 1. The Skill is run on a host where virtual-environment creation works but `ensurepip` is unavailable. 2. `bootstrap_pip` retrieves `https://bootstrap.pypa.io/get-pip.py`. 3. An attacker compromises the upstream resource or otherwise supplies a malicious response through a trusted interceptio ...[truncated 741 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Automatically Installed Dependency Is Unpinned and Has No Integrity Lock

Content
View full analysis
=1.3.2 ``` ```bash if [ "$need_install" -eq 1 ]; then if [ -f "$REQ_FILE" ]; then echo "[wrapper] installing dependencies from $REQ_FILE" >&2 if "$VENV_PY" -m pip install --disable-pip-version-check --no-input -r "$REQ_FILE" >&2; then cp "$REQ_FILE" "$STAMP" else echo "[wrapper] WARNING: dependency installation failed; continuing in case the script does not need them" >&2 fi ``` ### Technical Analysis The lower-bound-only constraint permits pip to install any future release of `alibabacloud_oss_v2`. No lock file, exact version, package hash, or transitive dependency hashes are supplied. The wrapper automatically performs this installation on first use or whenever `requirements.txt` changes. This means the executed dependency set is not the same immutable code set that was audited. A compromised future package release or transitive dependency can execute code during installation or import. The package is also installed on initial wrapper execution even for text-only video generation, although the implementation only imports the OSS SDK when local images are used. This introduces supply-chain exposure beyond the minimum privileges and components needed for text-to-video operation. ### Attack Path 1. An attacker compromises a permitted future release of the direct dependency or one of its unconstrained transitive dependencies. 2. A user runs the wrapper in a new environment or after its requirements stamp becomes stale. 3. Pip resolves the malicious release because it satisfies `>=1.3.2`. 4. Installation hooks or subsequently imported package code execute under the invoking account. 5. The malicious package can access the process environment ...[truncated 418 chars]
Remediation
View remediation
`. - Generate a reproducible lock file containing exact transitive versions. - Require hashes with `pip install --require-hashes`. - Install the OSS dependency only when a local file actually needs uploading. - Prefer a prebuilt, reviewed environment or signed package artifacts over runtime dependency resolution. - Configure pip to use an explicitly trusted package index and retain provenance information for installed artifacts. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
scripts/seedance.py:227
Finding

Arbitrary API Endpoint Can Receive the Ark Bearer Credential, Including over Plaintext HTTP

Content
View full analysis
dict: url = f"{self.endpoint}{path}" data = None headers = { "Authorization": f"Bearer {self.api_key}", "Accept": "application/json", } if body is not None: data = json.dumps(body).encode("utf-8") headers["Content-Type"] = "application/json" req = urllib.request.Request(url, data=data, headers=headers, method=method) last_err: Exception | None = None for attempt in range(self.http_retries + 1): try: with urllib.request.urlopen( req, timeout=HTTP_TIMEOUT, context=self._ssl_ctx, ) as resp: raw = resp.read().decode("utf-8") status = resp.status break ``` The endpoint is also directly configurable: ```python p.add_argument("--endpoint", default=None, help="Override ARK_ENDPOINT.") ``` ### Technical Analysis The client attaches `ARK_API_KEY` as a bearer token to every request made to the configured endpoint. Neither the CLI value nor `ARK_ENDPOINT` is checked for an HTTPS scheme or an approved host. A value such as `http://attacker.example/api/v3` therefore receives the token in plaintext, while an attacker-controlled HTTPS host receives it directly in the `Authorization` header. Configurable proxy endpoints can be legitimate, but automatically forwarding the same production credential to an unrestricted destination violates credential-origin binding and least privilege. The Skill instructions do not require arbitrary endpoint access for its default Volcengine funct ...[truncated 1124 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/seedance.py:244
Finding

Optional TLS Verification Bypass Exposes API Credentials and Generated Content to Interception

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/seedance:96
Finding

Wrapper Script Selector Allows Path Traversal to Execute Python Files Outside the Scripts Directory

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:94
Finding

Skill Invocation Template Risks Shell Injection Through User-Controlled Prompt and Path Values

Content
View full analysis
/scripts/seedance --env-file /.env \ -t "" [-i ./local.png | --image-url ] [-f ./first.png -l ./last.png] \ [--duration 5] [--ratio 16:9] [--resolution 720p] [-m ] [--save out.mp4] /scripts/seedance --api-type openai-video --env-file /.env -t "" ... /scripts/seedance --api-type openai --env-file /.env -t "" ... ``` ### Technical Analysis The Skill directs an Agent with the `Bash` tool to interpolate a user-supplied prompt and other options into a shell command. Double quotes do not safely neutralize all shell syntax: embedded `"`, command substitutions such as `$(...)`, backticks, and certain expansions can alter command interpretation if values are inserted without robust shell escaping. The Python CLI itself uses `argparse` and does not invoke a shell, but the Skill's recommended Agent invocation creates a shell boundary before Python receives the arguments. Whether exploitation succeeds depends on how the hosting Agent serializes placeholders; an implementation that directly substitutes natural-language values into this template is vulnerable. ### Attack Path 1. A user supplies a video prompt containing shell metacharacters, for example a quote followed by an additional command. 2. The Agent follows the documented Bash template and inserts the prompt verbatim into `-t ""`. 3. The embedded syntax terminates or modifies the intended quoted argument. 4. Bash evaluates the injected command before starting, or alongside, the Seedance wrapper. 5. The injected command executes with the Agent's Bash permissions. ### Impact Assessment Successful exploitation can execute arbitrary shell commands av ...[truncated 370 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • 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
Findings (34)

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 · CLAUDE.md (reported line 27)May include surrounding context.

live integration tests (real API calls — costs quota; skips unless ARK_API_KEY set)

(the one-off runs below drive the venv interpreter created by the first scripts/seedance run)

.venv/bin/python -c "import sys; sys.path.insert(0,'scripts'); import seedance, unittest; seedance.load_dotenv('.env'); unittest.TextTestRunner(verbosity=2).run(unittest.TestLoader().loadTestsFromName('test_seedance.LiveTests'))" # openai-video (mini) .venv/bin/python -c "import sys; sys.path.insert(0,'scripts'); import seedance, unittest; seedance.load_dotenv('.env'); unittest.TextTestRunner(verbosity=2).run(unittest.TestLoader().loadTestsFromName('test_seedance.OpenaiLiveTests.test_text_to_video'))" # openai (full)

text

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 · CLAUDE.md (reported line 28)May include surrounding context.

live integration tests (real API calls — costs quota; skips unless ARK_API_KEY set)

(the one-off runs below drive the venv interpreter created by the first scripts/seedance run)

.venv/bin/python -c "import sys; sys.path.insert(0,'scripts'); import seedance, unittest; seedance.load_dotenv('.env'); unittest.TextTestRunner(verbosity=2).run(unittest.TestLoader().loadTestsFromName('test_seedance.LiveTests'))" # openai-video (mini) .venv/bin/python -c "import sys; sys.path.insert(0,'scripts'); import seedance, unittest; seedance.load_dotenv('.env'); unittest.TextTestRunner(verbosity=2).run(unittest.TestLoader().loadTestsFromName('test_seedance.OpenaiLiveTests.test_text_to_video'))" # openai (full)

text

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
the folder containing this `SKILL.md`). The script is synchronous: it creates a

Lp1

High
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The wrapper performs network access during environment bootstrapping and dependency installation by downloading get-pip.py and installing packages from requirements.txt. This creates an undeclared network capability and a supply-chain risk surface: running the skill can reach external hosts and execute downloaded package code, which is dangerous if users expect a local-only skill or if dependencies are compromised.

Content

No source excerpt is available for this finding.

Lp1

High
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The script reads multiple secrets and configuration values from environment variables and an optional .env file, but the metadata indicates that environment access is not declared. In an agent-skill context, undeclared secret access expands the skill's effective privileges and can expose API keys or enable outbound actions the caller did not explicitly authorize.

Content

No source excerpt is available for this finding.

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 · SKILL.md (reported line 94)May include surrounding context.

md
--poll-interval      seconds between status polls         (default 10)
    --timeout            max seconds to wait for completion   (default 1800)
    --endpoint           override ARK_ENDPOINT                (default from env)
    --env-file           path to .env file                    (default .env)

Local images are uploaded to Alibaba OSS (signed URL, 10-minute validity) and the
signed URL is used as the actual image input. Online `*-url` options are used

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 · SKILL.md (reported line 98)May include surrounding context.

md
--poll-interval      seconds between status polls         (default 10)
    --timeout            max seconds to wait for completion   (default 1800)
    --endpoint           override ARK_ENDPOINT                (default from env)
    --env-file           path to .env file                    (default .env)

Local images are uploaded to Alibaba OSS (signed URL, 10-minute validity) and the
signed URL is used as the actual image input. Online `*-url` options are used

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 · SKILL.md (reported line 99)May include surrounding context.

md
--poll-interval      seconds between status polls         (default 10)
    --timeout            max seconds to wait for completion   (default 1800)
    --endpoint           override ARK_ENDPOINT                (default from env)
    --env-file           path to .env file                    (default .env)

Local images are uploaded to Alibaba OSS (signed URL, 10-minute validity) and the
signed URL is used as the actual image input. Online `*-url` options are used

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

python
--poll-interval      seconds between status polls         (default 10)
    --timeout            max seconds to wait for completion   (default 1800)
    --endpoint           override ARK_ENDPOINT                (default from env)
    --env-file           path to .env file                    (default .env)

Local images are uploaded to Alibaba OSS (signed URL, 10-minute validity) and the
signed URL is used as the actual image input. Online `*-url` options are used

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

python
--poll-interval      seconds between status polls         (default 10)
    --timeout            max seconds to wait for completion   (default 1800)
    --endpoint           override ARK_ENDPOINT                (default from env)
    --env-file           path to .env file                    (default .env)

Local images are uploaded to Alibaba OSS (signed URL, 10-minute validity) and the
signed URL is used as the actual image input. Online `*-url` options are used

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

python
--poll-interval      seconds between status polls         (default 10)
    --timeout            max seconds to wait for completion   (default 1800)
    --endpoint           override ARK_ENDPOINT                (default from env)
    --env-file           path to .env file                    (default .env)

Local images are uploaded to Alibaba OSS (signed URL, 10-minute validity) and the
signed URL is used as the actual image input. Online `*-url` options are used

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

python
--poll-interval      seconds between status polls         (default 10)
    --timeout            max seconds to wait for completion   (default 1800)
    --endpoint           override ARK_ENDPOINT                (default from env)
    --env-file           path to .env file                    (default .env)

Local images are uploaded to Alibaba OSS (signed URL, 10-minute validity) and the
signed URL is used as the actual image input. Online `*-url` options are used

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

python
--poll-interval      seconds between status polls         (default 10)
    --timeout            max seconds to wait for completion   (default 1800)
    --endpoint           override ARK_ENDPOINT                (default from env)
    --env-file           path to .env file                    (default .env)

Local images are uploaded to Alibaba OSS (signed URL, 10-minute validity) and the
signed URL is used as the actual image input. Online `*-url` options are used

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

python
DEFAULT_MODEL_OPENAI_VIDEO = "doubao-seedance-2.0-mini"  # openai-video endpoint
DEFAULT_MODEL_OPENAI = "doubao-seedance-2.0"  # openai (chat-mirror) endpoint, full model
DEFAULT_ENDPOINT = "https://ark.cn-beijing.volces.com/api/v3"
DEFAULT_ENV_FILE = ".env"
DEFAULT_DURATION = 5
DEFAULT_RATIO = "16:9"
DEFAULT_RESOLUTION = "720p"

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

python
DEFAULT_MODEL_OPENAI_VIDEO = "doubao-seedance-2.0-mini"  # openai-video endpoint
DEFAULT_MODEL_OPENAI = "doubao-seedance-2.0"  # openai (chat-mirror) endpoint, full model
DEFAULT_ENDPOINT = "https://ark.cn-beijing.volces.com/api/v3"
DEFAULT_ENV_FILE = ".env"
DEFAULT_DURATION = 5
DEFAULT_RATIO = "16:9"
DEFAULT_RESOLUTION = "720p"

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

python
DEFAULT_MODEL_OPENAI_VIDEO = "doubao-seedance-2.0-mini"  # openai-video endpoint
DEFAULT_MODEL_OPENAI = "doubao-seedance-2.0"  # openai (chat-mirror) endpoint, full model
DEFAULT_ENDPOINT = "https://ark.cn-beijing.volces.com/api/v3"
DEFAULT_ENV_FILE = ".env"
DEFAULT_DURATION = 5
DEFAULT_RATIO = "16:9"
DEFAULT_RESOLUTION = "720p"

Credential Access

High
Category
Privilege Escalation
Confidence
73% confidence
Finding

The load_dotenv function reads arbitrary key-value pairs from a filesystem path into process environment variables, which is real secret-ingestion behavior. In an agent environment, automatic loading of local secret material can unintentionally widen the secrets available to the skill, especially when combined with outbound network calls and optional endpoint override.

Content

Scanner excerpt · scripts/seedance.py (reported line 145)May include surrounding context.

python
def load_dotenv(path: str = DEFAULT_ENV_FILE, override: bool = False) -> bool:
    """Load KEY=VALUE pairs from a .env file into os.environ.

    This is a small, dependency-free reader (no python-dotenv required).

Credential Access

High
Category
Privilege Escalation
Confidence
78% confidence
Finding

The main function automatically loads a .env file by default before execution, which can silently import local credentials into the skill's runtime. In a skill context this is more dangerous because the same process then makes network requests and can be redirected via configurable endpoints, increasing the blast radius of any unintentionally loaded secrets.

Content

Scanner excerpt · scripts/seedance.py (reported line 1063)May include surrounding context.

python
def main(argv: list[str] | None = None) -> int:
    args = build_arg_parser().parse_args(argv)

    # Load .env first so ARK_API_KEY / ARK_ENDPOINT are available; the real
    # environment always takes precedence over the file.
    if args.env_file:
        load_dotenv(args.env_file)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The documented activation trigger includes the generic phrase "generate a video," which is broad enough to match many normal user requests unrelated to this specific provider or workflow. In agent runtimes, overly broad triggers can cause unintended skill invocation, leading to surprise network/API use, quota consumption, and unintended handling of local files or URLs in contexts where the user did not explicitly choose this skill.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The trigger phrase includes the very broad natural-language request “生成视频”, which is likely to overlap with ordinary user intent and can cause the skill to activate in situations the user did not specifically intend. In an agent setting, overbroad activation increases the chance of unintended execution of a networked, quota-consuming capability and may lead to accidental data submission or surprise external API calls.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README states that local images may be uploaded to Alibaba Cloud OSS and that prompts/images are sent to remote video-generation services, but it does not present a prominent privacy and data-egress warning at the point of use. In a skill that handles user-supplied local files, this omission is risky because users may unknowingly expose sensitive images, metadata, or proprietary content to third-party infrastructure.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger phrase "generate a video" is very broad and can cause this skill to activate for many generic requests unrelated to this specific backend or workflow. Over-broad activation increases the chance the agent invokes a quota-consuming, networked action unexpectedly, possibly prompting for secrets or handling local files when a narrower skill would have been more appropriate.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The "When to use" guidance instructs activation on generic requests to "generate a video," which is insufficiently scoped for a powerful skill that provisions environments, uses API credentials, uploads local images, and incurs cost. In agent systems, broad routing logic is a security and safety issue because it can cause unnecessary execution of external actions and secret-dependent workflows.

Content

No source excerpt is available for this finding.

Cloud Storage Exfiltration

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

The skill uploads user-supplied local images to Alibaba OSS and generates signed URLs, which is a real data exfiltration path to third-party cloud storage. In this skill's context that behavior is functional, but it still transfers local files off-host and may leak sensitive images or filenames to an external bucket under credentials controlled outside the immediate runtime.

Content

Scanner excerpt · scripts/seedance.py (reported line 918)May include surrounding context.

python
client = self._oss()
        try:
            with open(local_path, "rb") as fh:
                client.put_object(
                    oss.PutObjectRequest(
                        bucket=self.bucket,
                        key=key,

Unbounded Resource Access

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill allows unbounded resource consumption (API calls, storage, compute). Without rate limits or quotas, a compromised or misbehaving agent can cause denial-of-service or cost overruns.

Content

Scanner excerpt · scripts/test_seedance.py (reported line 518)May include surrounding context.

python
self.assertIn("failed", str(ctx.exception))

    def test_timeout_raises(self):
        client = make_client(timeout=0)  # deadline already in the past

        def fake_http(method, path, body=None):
            if method == "POST":

Static analysis

Detected: suspicious.exposed_secret_literal, suspicious.insecure_tls_verification

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/test_seedance.py:327

HTTPS certificate verification is disabled.

Warn
Code
suspicious.insecure_tls_verification
Location
scripts/seedance.py:253