Back to skill

Security audit

Yufluent Clawhub Publish Yufluentcn Chat Assist

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its advertised customer-support purpose, but it needs review because customer/order text and the API token can be sent to a user-configured endpoint, including plain HTTP.

Review this before installing in a production support workflow. Use only a trusted HTTPS TOKENAPI_BASE_URL, avoid placing unnecessary personal or order data in prompts, verify how Yufluent handles retention and privacy, and prefer installing dependencies in an isolated environment with pinned package versions.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/yufluent_api.py:19
Finding

Configurable Plaintext API Endpoint Can Expose Credentials and Customer Data

Content
View full analysis
str: base = (base_url or "").strip().rstrip("/") if not base: base = "http://localhost:8080/v1" if base.endswith("/v1"): return base return f"{base}/v1" ``` ```python def _auth_headers(api_key: str) -> dict[str, str]: return { "Authorization": f"Bearer {api_key}", "Accept": "application/json", } def _json_headers(api_key: str) -> dict[str, str]: return {**_auth_headers(api_key), "Content-Type": "application/json"} ``` ```python def _post_json( url: str, *, api_key: str, body: dict[str, Any] | None = None, timeout: float, ) -> requests.Response: kwargs: dict[str, Any] = { "headers": _json_headers(api_key) if body is not None else _auth_headers(api_key), "timeout": timeout, } if body is not None: kwargs["json"] = body return requests.post(url, **kwargs) ``` ```python root = base_url or os.getenv("TOKENAPI_BASE_URL", "") url = skill_run_url(root, skill_id) try: resp = _post_json(url, api_key=key, body=payload, timeout=timeout) except requests.RequestException as exc: raise YufluentApiError(f"Request failed: {exc}") from exc ``` ### Technical Analysis The client accepts `TOKENAPI_BASE_URL` without validating its scheme or destination. Although the default plaintext endpoint is loopback, the same URL normalization logic permits arbitrary remote HTTP endpoints. Every request includes `TOKENAPI_KEY` as a bearer credential. The JSON body may contain buyer messages, order numbers, tracking information, product details, and seller policy context. Consequently, setting ...[truncated 2146 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Non-Reproducible Lower-Bound-Only Dependency Constraint

Content
View full analysis
=2.31.0 ``` The same lower-bound-only package specification is also declared in the OpenClaw metadata in `SKILL.md`. ### Technical Analysis The dependency constraint accepts version 2.31.0 and every later version of `requests`. Installation is therefore not reproducible: different users or installation dates can receive dependency versions that were not included in this audit. The dependency name is legitimate, and the audit found no typosquatting, dependency confusion, or suspicious package repository. The risk is limited to future compromised, incompatible, or unexpectedly changed releases being selected automatically. Because Python packages can execute installation-time code and subsequently participate in all HTTP requests made by the Skill, an unreviewed dependency release would operate with the same process permissions and could access the API credential and request payload. ### Attack Path 1. A future release accepted by `requests>=2.31.0`, or one of its resolved transitive dependencies, becomes compromised or introduces a security-relevant regression. 2. A user runs `pip install -r requirements.txt`. 3. The package resolver selects the new release because no exact version, upper bound, lock file, or package hash is enforced. 4. The unreviewed package is installed into the Skill environment. 5. When the Skill executes, the dependency runs with the invoking user's process permissions and handles requests containing the API credential and customer data. This is a supply-chain hardening weakness rather than evidence that the currently named dependency is malicious. ### Impact Assessment The maximum impact depends on the behavior of a compromised or vulnerable future dependency. Code executed during installation or runtime could potentially: - Read files acces ...[truncated 387 chars]
Remediation
View remediation
Vulnerability Patterns
  • 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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (12)

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

Critical
Category
Data Flow
Confidence
95% confidence
Finding

The code allows the request destination to be derived from TOKENAPI_BASE_URL via os.getenv and then sends the Bearer API key and payload to that URL with requests.post. If an attacker can influence the environment or configuration, they can redirect traffic to an arbitrary host, causing credential exfiltration and unintended data disclosure; this is especially risky because the default helper also permits plain HTTP URLs.

Content

Scanner excerpt · scripts/yufluent_api.py (reported line 150)May include surrounding context.

python
}
    if body is not None:
        kwargs["json"] = body
    return requests.post(url, **kwargs)


def _raise_for_status(resp: requests.Response) -> None:

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 31)May include surrounding context.

md
## 快速开始(3 步,60 秒)

1. **注册获取 API 密钥** → https://claw.changzhiai.com/login (新用户即送体验积分,无需绑卡)
2. **设置环境变量**:export TOKENAPI_KEY=*** 或写入 .env 文件
3. **运行**:参照下方 Examples 示例执行 python scripts/run.py ...

> 还没注册?前往 https://claw.changzhiai.com/login 免费获取密钥。

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README explicitly states that buyer messages and order context are processed via cloud services, but it provides no privacy notice, data handling explanation, consent guidance, or warning about transmitting potentially sensitive customer and order data off-device. In an e-commerce support context, this can lead to unintentional disclosure of personal or transactional information and creates compliance and trust risks.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
80% confidence
Finding

The README description is presented entirely in Chinese while documenting a skill that processes multilingual buyer messages, and there is no indication that users may choose their preferred documentation/output language. This can violate language or locale policy when a specific language is imposed without opt-in or a documented regional constraint.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The trigger list includes phrases like “客服怎么回”, “写个英文回复”, and “订单到哪了”, which are common conversational expressions that could match many unrelated situations. Although the skill is ecommerce-focused overall, this trigger section does not add negative examples or explicit limits on when these phrases should or should not invoke the skill.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The script sends buyer messages, product details, and order context to a remote API via run_skill without any visible notice, consent flow, or data-minimization guard in this file. Because these fields can contain personal, order, or logistics information, silent transmission creates a real privacy and compliance risk if users do not understand that their customer data is being processed off-box by a cloud service.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The file's natural-language descriptions and multiple user-facing error/help strings are written only in Chinese, and the agent-turn prompt is explicitly constructed in Chinese. There is no indication that the user can choose language or that the locale restriction is documented as a justified region-specific requirement.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The generated user_message begins with a Chinese instruction and formats slot lines in Chinese, which enforces a specific language in agent interaction. Under the policy, forcing a locale without user opt-in is a natural-language policy concern unless the tool is clearly documented as region-specific.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This code posts JSON bodies and an Authorization bearer token to remote endpoints via requests.post, which can transmit user-supplied payloads and credentials over the network. Although the module has brief internal comments, there is no user-facing disclosure such as a prompt, print/log message, or explanatory warning in this file about sending data to a remote service.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
93% confidence
Finding

The dependency is specified as requests>=2.31.0, which allows any future version to be installed and prevents reproducible builds. This increases supply-chain risk because a vulnerable or breaking release could be pulled in without review, and it also makes it hard to verify whether known advisories affect the installed version.

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

Because requests is not pinned to a specific version, it is impossible to determine from this manifest whether deployment will install a release affected by known CVEs or a fixed release. The danger here is uncertainty in dependency security posture: environments may resolve to different versions, including vulnerable ones, undermining vulnerability management and reproducibility.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The natural-language strings in the module docstring and function docstrings are written only in Chinese, which imposes a specific language/locale choice on users and maintainers without offering an alternative or opt-in. The provided policy says to flag language/locale constraints unless they are optional or clearly justified as region-specific.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.