Back to skill

Security audit

App Publish

Security checks for vulnerabilities and agentic risk

Overview

This skill is meant to publish videos, but it can post to real accounts by default and can discard a Kuaishou draft without separate confirmation.

Install only if you are comfortable with a skill controlling logged-in creator accounts. Use `--no-publish` first, review the browser state manually, avoid running `publish-all` until each platform workflow is verified, and clear or isolate the Chrome profile if you do not want account sessions reused. Do not set credential-bearing proxy URLs unless logs are protected or the skill is fixed to redact them.

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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/kbs/publish_kuaishou.py:289
Finding

Automatic Kuaishou Draft Discarding Without User Confirmation

Content
View full analysis
None: """清除页面缓存的草稿提示(如果有)。""" try: result = page.evaluate(""" () => { const buttons = document.querySelectorAll('button'); for (const btn of buttons) { if (btn.innerText && btn.innerText.includes('放弃')) { btn.click(); return true; } } return false; } """) if result: logger.info("已清除草稿缓存") time.sleep(0.5) except Exception as e: logger.debug("清除草稿缓存时出错:%s", e) ``` The function is called automatically while trying candidate publishing URLs: ```python for url in (*PUBLISH_VIDEO_URL_CANDIDATES, HOME_URL): page.navigate(url) page.wait_for_load() time.sleep(2.0) # 清除草稿缓存 _clear_draft_cache(page) ``` ### Technical Analysis The Kuaishou publishing workflow automatically searches every button on the page and clicks the first button whose visible text contains the substring meaning “Discard.” It does not verify that: - The button belongs to an expected draft-conflict dialog. - The draft was created by the current Skill invocation. - The button has an exact expected label. - The user approved deletion of an existing draft. - The page is in the expected state before the destructive action occurs. The action runs for every candidate URL visited during publishing. Therefore, an existing user draft can be discarded before the requested upload starts. The primary Skill documentation does not clearly disclose that pre-existing drafts may be deleted. This is a destructive state-changing action performed under an authenticated account and exceeds th ...[truncated 1117 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/kbs/cdp.py:459
Finding

Broad Text-Based Element Matching Can Trigger Unintended Publishing Actions

Content
View full analysis
bool: """先标记可点击元素,再取中心坐标点击(更接近真实用户)。""" sub = json.dumps(substring) box = self.evaluate( f""" (() => {{ const sub = {sub}; const all = document.querySelectorAll('button, a, span, div'); for (const el of all) {{ const t = (el.textContent || '').trim(); if (!t || !t.includes(sub)) continue; const r = el.getBoundingClientRect(); if (r.width < 2 || r.height < 2) continue; el.scrollIntoView({{block: 'center'}}); return {{x: r.left + r.width / 2, y: r.top + r.height / 2}}; }} return null; }})() """ ) if not box: return False x = float(box["x"]) + random.uniform(-2, 2) y = float(box["y"]) + random.uniform(-2, 2) self.mouse_move(x, y) time.sleep(0.05) self.mouse_click(x, y) return True ``` Kuaishou uses the helper for publication: ```python clicked = page.click_by_inner_text_then_center("发布") or page.click_by_inner_text_then_center( "发表" ) ``` Bilibili uses progressively broader labels: ```python clicked = ( page.click_by_inner_text_then_center("立即投稿") or page.click_by_inner_text_then_center("提交投稿") or page.click_by_inner_text_then_center("投稿") ) ``` Douyin falls back from immediate publication to scheduled publication: ```python clicked = page.click_by_inner_text_then_center("发布") or page.click ...[truncated 2484 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/chrome_launcher.py:134
Finding

Proxy Credentials May Be Exposed in Application Logs

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (36)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The documentation advertises a one-click publish-all flow that sequentially posts to multiple live platforms, but it does not prominently warn that this performs real submission by default. In an automation skill for content publishing, unclear live-action semantics can cause accidental cross-platform publication, creating operational, reputational, and compliance harm even without code execution or data exfiltration.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The report includes concrete commands that will publish content to live creator accounts, but it does not place a prominent, upfront warning immediately before those commands about the real-world effect. In the context of a browser-automation skill that reuses logged-in Chrome sessions, this increases the risk of accidental posting to production accounts by a user who assumes the commands are only tests.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The document provides a ready-to-run command for actual content publication and only notes that publishing was 'not tested,' but it does not clearly warn that running the full command can trigger an irreversible public post. In the context of an automation skill for a creator platform, this omission increases the risk of accidental real-world actions such as unintended publication, reputational harm, or posting with the wrong account/content.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The launcher includes stealth and anti-detection Chrome flags such as disabling AutomationControlled and infobars, which are unrelated to simple browser lifecycle management and are commonly used to evade bot detection. In an agent skill, this increases abuse potential for deceptive automation against third-party sites and weakens transparency about automated behavior.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The code launches Chrome with a persistent profile directory under the user's home directory by default, which can retain cookies, tokens, browsing state, and downloaded site data across runs without an explicit user-facing notice. In an automation skill, persistent state increases the chance of unintended credential reuse, privacy leakage, and cross-task data exposure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
78% confidence
Finding

The launcher automatically reads proxy-related environment variables and forwards Chrome traffic through that proxy without an explicit consent or disclosure path. In an agent environment, this can silently reroute browsing traffic, session cookies, and sensitive requests through infrastructure the user may not expect or control.

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/chrome_launcher.py (reported line 143)May include surrounding context.

python
logger.info("使用代理: %s", proxy)

    logger.info("启动 Chrome: port=%d, headless=%s, profile=%s", port, headless, user_data_dir)
    process = subprocess.Popen(
        args,
        stdout=subprocess.DEVNULL,
        stderr=subprocess.DEVNULL,

Internal Network Request

Medium
Category
Server-Side Request Forgery
Confidence
70% confidence
Finding

Code issues a request to a loopback, link-local, or private-range host. This can reach internal services not meant to be exposed and is a common SSRF pivot.

Content

Scanner excerpt · scripts/chrome_launcher.py (reported line 172)May include surrounding context.

python
try:
        import requests

        resp = requests.get(f"http://127.0.0.1:{port}/json/version", timeout=2)
        if resp.status_code == 200:
            ws_url = resp.json().get("webSocketDebuggerUrl")
            if ws_url:

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/chrome_launcher.py (reported line 264)May include surrounding context.

python
def _find_pids_by_port(port: int) -> list[int]:
    try:
        if sys.platform == "win32":
            result = subprocess.run(
                ["netstat", "-ano", "-p", "TCP"],
                capture_output=True,
                text=True,

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/chrome_launcher.py (reported line 279)May include surrounding context.

python
with contextlib.suppress(ValueError, IndexError):
                        pids.append(int(parts[-1]))
            return list(set(pids))
        result = subprocess.run(
            ["lsof", "-ti", f":{port}"],
            capture_output=True,
            text=True,

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/chrome_launcher.py (reported line 299)May include surrounding context.

python
def _kill_pid(pid: int) -> None:
    try:
        if sys.platform == "win32":
            subprocess.run(
                ["taskkill", "/PID", str(pid), "/F"],
                capture_output=True,
                timeout=5,

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The module docstring and subsequent CLI help strings are entirely in Chinese, which imposes a specific language on users. There is no indication that the tool is region-specific only, nor any opt-in or alternative locale support, so this is a natural-language policy concern under the language/locale rule.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The stealth script deliberately overrides navigator.languages to prefer Chinese locales regardless of the real user environment. This is a browser fingerprint spoofing technique that can misrepresent user identity or geography, reduce transparency, and potentially help evade platform anti-bot or anti-abuse detection during automated publishing workflows. In this skill context, the surrounding code explicitly implements broader stealth measures (webdriver, WebGL, Chrome runtime, UA override), which makes the hard-coded language override more concerning than a normal localization default.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The function will automatically click a publish button when do_publish is left at its default value of True, with no built-in confirmation gate, dry-run default, or explicit user acknowledgment at the point of submission. In an automation skill that uploads content to a real creator platform, this can cause unintended public posting if the caller invokes the skill with unreviewed metadata or by mistake.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The function will click the final "发布/发表" button whenever do_publish=True, with no in-function confirmation, preview checkpoint, or last-mile user acknowledgment at the moment of execution. In an automation skill that operates on a logged-in creator account, this can cause unintended public posting if the caller misconfigures the flag, invokes the function in the wrong context, or provides unreviewed content.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The file’s natural-language documentation and UI text assumptions are entirely Chinese, and several selector comments indicate the automation relies on matching Chinese interface text such as "上传成功" and "作品描述". For a general-purpose skill, this reflects a locale/language constraint without any opt-in, fallback, or documented justification that the skill is region-specific only.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The module docstring is entirely in Chinese and describes the skill's purpose only in that language. Under the policy rule, forcing a specific language without user opt-in or a documented region-specific justification is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The file’s natural-language description and subsequent UI interactions assume a Chinese-language interface, beginning with the Chinese-only docstring on L02. The script later relies on fixed Chinese labels such as “封面设置” and “确定”, which indicates a locale-specific behavior without any visible opt-in or justification for restricting operation to that language.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The natural-language instructions, headings, field names, and examples throughout the file are all in Chinese, and the document does not indicate that the skill is intentionally limited to Chinese-speaking users or a China-specific deployment context. Under the language/locale policy, forcing a specific language without user opt-in or documented justification is a policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

A language or locale policy issue applies when a skill forces a specific language without user opt-in. This file presents all instructions, labels, and examples only in Chinese, with no indication that the user can choose another language or that the skill is intentionally limited to a Chinese-language audience.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The document consistently uses Chinese for headings, instructions, examples, and warnings, which effectively forces a specific language experience. Under the policy, language constraints should either offer user choice or be clearly documented as a justified region- or locale-specific requirement.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

This TOML manifest file contains a natural-language description that is limited to Chinese, which may function as a broad locale restriction without any opt-in or justification. Under the policy rules, language/locale constraints should either offer user choice or be clearly documented as region-specific and justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The description text is written entirely in Chinese and references specific Chinese platforms, but the manifest does not state that the skill is region-specific or offer alternative language support. This is a natural-language policy concern because it implicitly enforces a language/locale context without user choice or documented justification.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
86% confidence
Finding

The manifest specifies requests>=2.28.0 without an upper bound or exact pin, so builds may resolve to different versions across environments and it is not possible to verify from this file alone whether a vulnerable release could be installed. In an automation skill that likely performs authenticated network interactions, dependency ambiguity increases supply-chain and patch-management risk, especially given known advisories affecting requests behavior around credential handling and verification.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: websockets has 4 known advisory(ies) (CVE-2018-1000518 (websockets is vulnerable to denial of service by memory exhaustion); CVE-2021-33880 (Observable Timing Discrepancy in aaugustin websockets library); CVE-2018-1000518 (aaugustin websockets version 4 contains a CWE-409: Improper Handling of Highly C) +1 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
84% confidence
Finding

The manifest declares websockets>=12.0 without a fixed resolved version, so the actual installed package cannot be verified from the manifest and may vary by environment. For a browser-automation publishing skill that may maintain long-lived websocket connections, unresolved dependency versions can expose the application to known denial-of-service or protocol-handling issues if an affected release is selected.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.