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

Content
View full analysis

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
View 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

Content
View full analysis

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
View 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

Content
View full analysis

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
View 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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

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.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

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

python
# 发送请求
            # 使用json参数,requests会自动处理编码
            response = requests.post(
                url, 
                json=wrapped_data, 
                headers=headers,

Missing User Warnings

Medium
Category
Not specified by scanner
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.

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

python
}
        
        try:
            response = requests.post(url, json=push_data, headers=headers, verify=True, timeout=self.timeout)
            response.raise_for_status()
            
            result = response.json()

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
81% confidence
Finding

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

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.