Back to skill

Security audit

Today Task

Security checks for vulnerabilities and agentic risk

Overview

The skill’s task-push purpose is mostly disclosed, but its token handling, HTTPS enforcement, automatic update checks, and local record controls need review before installation.

Review this skill before installing. Use only an HTTPS endpoint you trust, avoid putting authorization codes in chat, set credentials through OpenClaw config, and assume task content plus service responses may be written locally even if record-saving settings suggest otherwise. Consider disabling update checks if you do not want post-push ClawHub inspection commands.

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
scripts/config.py:166
Finding
Sensitive authorization codes and task content can be transmitted over plaintext HTTP## Vulnerability Details **File Location**: `scripts/config.py:166-170`, `scripts/hiboards_client.py:51-75` **Vulnerability Type**: Insufficient transport security validation **Risk Level**: High ### Vulnerable Code ```python # scripts/config.py:166-170 # 验证URL格式 hiboards_url = self.config.get('hiboard_url', '') if not hiboards_url.startswith('http'): logger.warning(f"推送URL格式可能不正确: {hiboards_url}") ``` ```python # scripts/hiboards_client.py:51-75 url = self.base_url # 生成追踪ID trace_id = f"task-push-{datetime.now().strftime('%Y%m%d%H%M%S')}" headers = {**self.default_headers, "x-trace-id": trace_id} try: logger.info(f"发送数据到负一屏: {url}") logger.debug(f"请求头: {headers}") # 包装数据,在外层添加data wrapped_data = {"data": push_data} # 记录数据摘要(不记录完整内容) data_summary = self._get_data_summary(push_data) logger.debug(f"请求数据摘要: {data_summary}") # 发送请求 # 使用json参数,requests会自动处理编码 response = requests.post( url, json=wrapped_data, headers=headers, verify=True, timeout=self.timeout ) ``` ### Technical Analysis The URL validation accepts any value beginning with `http`, including an unencrypted `http://` endpoint. It only emits a warning for other malformed schemes and does not fail closed. The HTTP client then sends the complete wrapped payload to that URL. The payload includes the authorization code, task content, task name, result, identifiers, and completion timestamp. Although `verify=True` is passed to `requests.post`, certificate verification only applies to TLS connections and provides no protection when the selected scheme is plain HTTP. The endpoint is loaded from writable OpenClaw configuration. Consequently, a configuration error or an attacker capable of modifying that configuration can redirect sensitive data through an unencrypted connection. No hostname allowlist or HTTPS-only policy prevents this. ...[truncated 974 chars]
Remediation
## Remediation Suggestions 1. Parse the endpoint with `urllib.parse.urlparse` and require the exact `https` scheme. 2. Reject invalid or insecure URLs with an exception rather than merely logging a warning. 3. Consider allowing only documented, trusted service hostnames. If custom endpoints are required, require explicit user approval before sending credentials to a new hostname. 4. Reject URLs containing embedded credentials, unexpected ports, fragments, or ambiguous host representations. 5. Preserve TLS certificate verification and do not provide an option to disable it in production. 6. Add tests proving that `http://`, malformed schemes, user-information components, and unauthorized hosts are rejected. 7. Rotate any authorization code that may previously have been transmitted over HTTP.

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/task_pusher.py:339
Finding
Configured record-retention and storage controls are not enforced## Vulnerability Details **File Location**: `scripts/task_pusher.py:226-229`, `scripts/task_pusher.py:339-350`, `config.json:7-9` **Vulnerability Type**: Uncontrolled local retention of response data **Risk Level**: Medium ### Vulnerable Code ```python # scripts/task_pusher.py:226-229 # 保存推送记录 self._save_push_record(response, record_id) return response ``` ```python # scripts/task_pusher.py:339-350 def _save_push_record(self, response: Dict[str, Any], record_id: str): """保存推送记录""" try: records_dir = os.path.join(os.path.dirname(__file__), '..', 'push_records') os.makedirs(records_dir, exist_ok=True) record_file = os.path.join(records_dir, f"{record_id}.json") with open(record_file, 'w', encoding='utf-8') as f: json.dump(response, f, ensure_ascii=False, indent=2) logger.info(f"[INFO] 推送记录已保存: {record_file}") except Exception as e: logger.warning(f"保存推送记录失败: {str(e)}") ``` ```json // config.json:7-9 "save_records": true, "records_dir": "push_records", "max_records": 100, ``` ### Technical Analysis The configuration exposes `save_records`, `records_dir`, and `max_records` as privacy and retention controls, but the persistence implementation does not use any of them. Every successful push calls `_save_push_record()` unconditionally. The method always uses a fixed `push_records` directory and never checks the configured maximum number of records. Files and directories are also created with process-default permissions rather than explicitly restrictive permissions. The stored object includes task metadata and the complete service response. Although the outgoing authorization code is not intentionally copied into the success record, a service may return sensitive or verbose response fields that are then persisted without filtering. Records can accumulate indefinitely, contrary to the documented maximum. ### Attack Path ...[truncated 1001 chars]
Remediation
## Remediation Suggestions 1. Call `_save_push_record()` only when `self.config.save_records` is true. 2. Resolve storage through `self.config.records_dir` rather than a hardcoded directory. 3. Enforce `self.config.max_records` after every successful write, deleting the oldest excess records safely. 4. Validate configured record paths and restrict them to an approved application data directory. 5. Create directories and files with permissions limited to the current user, such as mode `0700` for directories and `0600` for files on supported systems. 6. Store only the minimum fields required for auditing. Filter arbitrary server response fields and redact credentials or token-like values recursively. 7. Use collision-resistant record names because the current identifier only has one-second precision. 8. Add automated tests confirming that disabled storage produces no file and that retention limits are enforced.

T08 · Insecure Dependencies

Note
Location
requirements.txt:4
Finding
Third-party dependency is installed without an exact version or integrity verification## Vulnerability Details **File Location**: `requirements.txt:4`, `README.md:90` **Vulnerability Type**: Unpinned dependency and non-reproducible installation **Risk Level**: Low ### Vulnerable Code ```text # requirements.txt:4 requests>=2.25.1 ``` ```bash # README.md:90 pip install requests ``` ### Technical Analysis The dependency declaration permits any future version of `requests` at or above 2.25.1. The documented direct installation command is even less constrained. Neither approach uses an audited lockfile, exact version, package hash, or trusted-index enforcement. This is not evidence that the current `requests` package is malicious. The weakness is that dependency resolution is not reproducible and can select a different package release depending on installation time and package-index configuration. Because the dependency executes in the same Python process as the Skill, a compromised package release or malicious package source would run with access to the Skill's authorization code, task data, network connectivity, and user-level filesystem permissions. ### Attack Path 1. The user installs dependencies using the supplied requirement or direct `pip install requests` instruction. 2. Package resolution selects an unreviewed future version or downloads from a compromised or attacker-controlled configured package index. 3. Package installation or import executes attacker-controlled package code under the user's account. 4. That code accesses process data, local files available to the user, or the authorization code loaded from OpenClaw configuration. 5. The compromised dependency can disclose data or alter push requests within the privileges of the invoking user. ### Impact Assessment Successful supply-chain compromise would execute code with the privileges of the user running the installation or Skill. This could expose the authorization code, task content, accessible user files, and network resour ...[truncated 216 chars]
Remediation
## Remediation Suggestions 1. Pin `requests` to an exact reviewed version. 2. Generate a lockfile containing cryptographic hashes for every transitive dependency. 3. Install with hash verification, for example `pip install --require-hashes -r requirements.txt`. 4. Use a trusted package index or an internally controlled package mirror. 5. Run dependency vulnerability and provenance checks as part of release automation. 6. Update the README so its installation command uses the locked requirements rather than installing an unconstrained package directly. 7. Perform dependency updates through reviewed pull requests with automated tests and security scanning.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (49)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
Version file editing and release-log maintenance are unrelated to the user-facing purpose of a task-result pusher. Bundling these maintenance functions into the same skill obscures risk and may permit unintended local state changes when users believe they are only transmitting task output.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
Version file editing and release-log maintenance are unrelated to the user-facing purpose of a task-result pusher. Bundling these maintenance functions into the same skill obscures risk and may permit unintended local state changes when users believe they are only transmitting task output.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
Version file editing and release-log maintenance are unrelated to the user-facing purpose of a task-result pusher. Bundling these maintenance functions into the same skill obscures risk and may permit unintended local state changes when users believe they are only transmitting task output.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
Version file editing and release-log maintenance are unrelated to the user-facing purpose of a task-result pusher. Bundling these maintenance functions into the same skill obscures risk and may permit unintended local state changes when users believe they are only transmitting task output.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
Version file editing and release-log maintenance are unrelated to the user-facing purpose of a task-result pusher. Bundling these maintenance functions into the same skill obscures risk and may permit unintended local state changes when users believe they are only transmitting task output.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
Version file editing and release-log maintenance are unrelated to the user-facing purpose of a task-result pusher. Bundling these maintenance functions into the same skill obscures risk and may permit unintended local state changes when users believe they are only transmitting task output.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
Version file editing and release-log maintenance are unrelated to the user-facing purpose of a task-result pusher. Bundling these maintenance functions into the same skill obscures risk and may permit unintended local state changes when users believe they are only transmitting task output.

Ssd 3

High
Confidence
98% confidence
Finding
The skill instructs the system to detect authorization codes in chat and either reproduce them in configuration commands or save them into config automatically. This is dangerous because it promotes collection and propagation of secrets from conversational input, which may expose tokens in chat history, logs, generated commands, or local files and can lead to credential compromise.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The file introduces update-checking and external CLI execution behavior that does not match the declared purpose of a task-result push skill. This kind of capability mismatch is dangerous because it expands the trust boundary and can hide unexpected network/process activity inside a skill users would not expect to perform such actions.

Natural-Language Policy Violations

Medium
Confidence
89% confidence
Finding
This README presents the skill's instructions and warnings exclusively in Chinese, which effectively forces a specific language for users. The policy allows locale constraints only when users are given a choice or when the restriction is clearly documented and justified, neither of which appears here.

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill declares no explicit tool or permission scope despite instructing use of shell commands, local file reads/writes, and network access. In a skill system, missing scope declarations reduce transparency and can let a broadly-triggered skill access sensitive capabilities without clear operator consent or policy enforcement.

Vague Triggers

Medium
Confidence
97% confidence
Finding
The trigger includes an open-ended condition covering essentially any task completion that might need pushing. Because the skill also involves network transmission and secret/config handling, an overly broad activation surface raises the chance of accidental invocation on unrelated tasks and unintended disclosure of task content to a remote endpoint.

Vague Triggers

Medium
Confidence
97% confidence
Finding
The repeated catch-all trigger language reinforces ambiguous activation boundaries for a skill that can send user-generated content and metadata over the network. In this context, broad matching is more dangerous because it can turn routine task-completion conversations into implicit exfiltration events.

Intent-Code Divergence

Medium
Confidence
93% confidence
Finding
The documentation conflicts on whether auth codes from chat are merely detected and surfaced as commands or automatically written into configuration. Ambiguity around secret-handling is dangerous because users cannot reliably predict whether a sensitive token shared in conversation will be stored, echoed, or persisted, increasing exposure risk.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The document describes an embedded update-checking subsystem that is outside the skill's declared purpose of pushing task results. Expanding a skill's behavior to include self-update or version-check logic introduces extra network and trust surface, which can enable unexpected outbound communication, metadata leakage, or future supply-chain risk if the update path is later implemented insecurely.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
Automatic network-based update checks are not clearly necessary for a task-result pusher and create a recurring outbound connection behavior that users may not expect. Even if currently described as checking only ClawHub, this adds privacy, tracking, and supply-chain exposure, especially because the document notes simulated data now and future API integration later.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The configuration sets the default_result string to Chinese ("任务已完成"), which imposes a specific language by default. For a general-purpose skill configuration, this is a natural-language locale policy issue unless the skill explicitly offers language selection or documents a justified region-specific constraint.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
This Python file contains natural-language descriptions and user-facing output entirely in Chinese, including the module docstring and later returned messages. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is explicitly documented and justified, which is not present here.

Natural-Language Policy Violations

Medium
Confidence
98% confidence
Finding
This file’s natural-language descriptions are written entirely in Chinese, beginning with the module description on L003, with no indication that the language is configurable or limited to a region-specific use case. Per the policy, forcing a specific language without user opt-in is a natural-language policy violation.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
This code file contains natural-language strings entirely in Chinese in the module docstring and usage output, which imposes a specific language on users. The policy allows locale constraints only when they are justified or when users are given a language/locale choice, neither of which is present here.

External Transmission

Medium
Category
Data Exfiltration
Content
# 发送请求
            # 使用json参数,requests会自动处理编码
            response = requests.post(
                url, 
                json=wrapped_data, 
                headers=headers,
Confidence
80% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
This code path sends `push_data` to a remote URL with `requests.post`, but unlike the main client it has no logging, print, or other visible disclosure that user data is being transmitted. Because this is a code file and the operation sends potentially user-provided content over the network, it meets the missing-warning criterion.

External Transmission

Medium
Category
Data Exfiltration
Content
}
        
        try:
            response = requests.post(url, json=push_data, headers=headers, verify=True, timeout=self.timeout)
            response.raise_for_status()
            
            result = response.json()
Confidence
80% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Intent-Code Divergence

Medium
Confidence
81% confidence
Finding
L434 的注释声明测试代码不会真正发送请求,但该文件在 L408 创建了真实客户端,并且此前展示的数据结构和客户端实现都面向真实 HTTP 推送;若开发者直接补充或恢复调用,当前说明会误导读者对副作用的判断。该注释不是单纯不完整,而是主动弱化了此测试块与真实网络交互之间的关系。

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The module's docstrings and user-facing log/output strings are written entirely in Chinese, including runtime messages such as task start/end and test output. This imposes a specific language on users without opt-in or justification, which matches the natural-language locale policy violation category.

Static analysis

No suspicious patterns detected.