Back to skill

Security audit

选品分析

Security checks for vulnerabilities and agentic risk

Overview

This product-research skill is mostly aligned with its purpose, but it needs review because it loads an unbundled API client from outside the reviewed package and can send product/browser data to configurable services.

Review this skill before installing. Use it only with a trusted Browser Service and API base URL, run it in a limited environment, and verify which yufluent_api.py module will be imported because that code is not included in the reviewed package. Avoid giving it unrelated files as product-candidate input, since file paths passed to --product-candidates are read and submitted for cloud analysis.

Vulnerability Patterns
  • Tool Hijacking and SpoofingModifies or replaces tools so legitimate-looking calls execute attacker logic
  • 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)

T07 · Tool Hijacking and Spoofing

Warning
Location
scripts/bootstrap.py:52
Finding

Untrusted External Module Loading Outside the Skill Package Boundary

Content
View full analysis
Path: """ 将 cloud 客户端目录加入 sys.path。 - ClawHub zip:scripts/ 内已有 yufluent_api.py(package-skill 注入) - Monorepo:回退 skills/_shared/ """ scripts_dir = Path(script_file).resolve().parent skills_shared = scripts_dir.parent.parent / "_shared" for candidate in (scripts_dir, skills_shared, _SHARED_DIR): if candidate.is_dir() and (candidate / "yufluent_api.py").is_file(): path = str(candidate) if path not in sys.path: sys.path.insert(0, path) return candidate raise ImportError( "cloud client not found: expected scripts/yufluent_api.py (ClawHub) " "or skills/_shared/yufluent_api.py (monorepo)" ) ``` The selected path is subsequently trusted by `scripts/run.py`: ```python from bootstrap import ensure_cloud_client_path ensure_cloud_client_path(__file__) from cloud_cli import print_run_meta, print_skill_output, read_text_arg from discover import DiscoverError, discover_candidates, resolve_search_query from yufluent_api import YufluentApiError, run_skill ``` ### Technical Analysis The audited package does not include `yufluent_api.py`. The bootstrap logic therefore permits the runtime to resolve this executable Python module from a sibling `_shared` directory outside the audited Skill package. The selected directory is inserted at the beginning of `sys.path`. The subsequent `from yufluent_api import ...` statement executes the module's top-level code and trusts its `run_skill` implementation. This creates a package-boundary violation: the effective cloud client, including its authentication, network destination, TLS behavior, and request handli ...[truncated 2418 chars]
Remediation
View remediation
Vulnerability Patterns
  • 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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (13)

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

powershell
cd skills\yufluentcn-product-pick
pip install -r requirements.txt
copy .env.example .env
# 编辑 TOKENAPI_KEY = "tk-***"

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill defines broad natural-language activations such as '自动选品 / browser选品 / 帮我选品 + 品类名 / 选品分析 + 品类名' that can cause the agent to invoke browsing and remote harness actions from ordinary user phrasing without strong confirmation boundaries. In this context, activation leads to multi-step data collection and external API calls, so accidental or prompt-injected invocation is more risky than a purely local/read-only skill.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The standalone trigger list contains generic business phrases like '选品分析', '这个品类能不能做', '备货决策', and 'product research' with no activation constraints. Because this skill can initiate browser-driven discovery and cloud-side processing, these broad phrases increase the chance of unintended activation, especially when mentioned incidentally in normal conversation or embedded in adversarial content.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The natural-language documentation in the file is written exclusively in Chinese, including the module docstring and function descriptions, with no indication that language choice is optional. This can violate a language/locale policy when a skill implicitly forces a specific language for operators or users without opt-in or documented regional justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

Natural-language strings in the module docstring and exception messages are hard-coded in Chinese, which can impose a specific language on users or operators without opt-in. The file does not indicate that this is a region-specific or otherwise justified locale restriction.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

This code sends data to a Browser Service via HTTP, including user-provided search queries embedded in URLs and subsequent product/listing URLs. While the network behavior is integral to the feature, there is no user-facing log, print, comment, or docstring in this file disclosing that queries and browsing targets are transmitted to an external/local service.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% 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 · scripts/discover.py (reported line 94)May include surrounding context.

python
def _post_json(base_url: str, path: str, payload: dict[str, Any] | None = None) -> dict[str, Any]:
    url = f"{base_url}{path}"
    try:
        res = requests.post(url, json=payload or {}, timeout=DEFAULT_TIMEOUT)
        res.raise_for_status()
        data = res.json()
        if not isinstance(data, dict):

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This code sets --lang to zh by default, which imposes a specific language choice unless the user explicitly overrides it. The policy for natural-language behavior requires offering a language choice or opt-in rather than forcing a locale by default.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

The dependency is specified as requests>=2.31.0 without an upper bound or exact pin, which makes builds non-reproducible and allows different environments to install different releases. That increases supply-chain risk and can unintentionally pull in vulnerable or breaking versions over time.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
requests>=2.31.0

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
91% confidence
Finding

Because requests is not pinned, it is not possible to verify whether the installed version avoids the listed advisories. This creates uncertainty around exposure to known vulnerabilities and weakens assurance that deployments are using a safe release.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

This code file contains natural-language descriptions in Chinese only, beginning with the module docstring. The policy calls for flagging language or locale constraints when a skill forces a specific language without user opt-in, and there is no indication here of an alternative language option or opt-in behavior.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

The module trusts BROWSER_SERVICE_URL from the environment and uses it to build outbound HTTP requests without validation or restriction. In environments where attackers can influence environment variables, this can redirect browser automation traffic and extracted page data to an attacker-controlled endpoint, effectively creating an SSRF-like exfiltration path through the configured service dependency.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

This code file contains natural-language strings in Chinese in the top-level docstring and helper docstring, which indicates a fixed language choice in the skill materials. Under the stated policy, forcing a specific language without user opt-in can be a locale-policy violation, and no opt-in or justification is present in this file.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dynamic_code_execution

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
tests/test_product_pick_package.py:28