Back to skill

Security audit

Data Sentinel Pro

Security checks for vulnerabilities and agentic risk

Overview

This webpage-monitoring skill mostly matches its purpose, but it needs Review because it can fetch arbitrary URLs from the host environment and optionally repeat that through cron without enough destination controls.

Install only if you trust the publisher and will monitor URLs you are authorized to access. Avoid internal, localhost, metadata, authenticated, or sensitive URLs; use Telegram or email alerts only if you are comfortable sending monitored URLs and change details to those providers; and review any cron entries so repeated checks are intentional and removable.

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

T09 · Insecure Skill Coding Practices

Error
Location
monitor.py:19
Finding

Unrestricted URL Fetching Enables Server-Side Request Forgery in the Primary Entry Point

Content
View full analysis

Vulnerability Details

File Location: monitor.py:19-31 and monitor.py:137-144
Vulnerability Type: Server-Side Request Forgery (SSRF)
Risk Level: High

Vulnerable code:

python
def fetch_url_content(url):
    """Fetch webpage content."""
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    }
    try:
        # SSL verification is enabled
        response = requests.get(url, headers=headers, timeout=30, verify=True)
        response.raise_for_status()
        return response.text
    except requests.exceptions.SSLError as e:
        return f"ERROR: SSL verification failed - {str(e)}"
    except Exception as e:
        return f"ERROR: {str(e)}"

def main():
    """Main function."""
    if len(sys.argv) < 2:
        print("Usage: monitor.py <url> [rule]")
        sys.exit(1)

    url = sys.argv[1]
    rule = sys.argv[2] if len(sys.argv) > 2 else "content"

    content = fetch_url_content(url)

Technical Analysis

The primary entry point accepts a caller-controlled URL and passes it directly to requests.get. It does not validate the URL scheme, destination hostname, resolved IP address, port, or redirect chain.

Consequently, a caller able to invoke the Skill can cause the trusted OpenClaw host to send HTTP requests to destinations that may not be accessible from the caller's own network position. Potential targets include loopback services, RFC1918 private networks, link-local services, and cloud metadata endpoints. The verify=True setting validates TLS certificates for HTTPS connections but does not prevent SSRF.

Redirects are followed by requests by default. Therefore, validating only the initial URL in a future partial fix would remain insufficient: an apparently public endpoint could redirect the request to an internal address.

The returned page is primarily hashed or parsed rather than printed ...[truncated 1813 chars]

Remediation
View remediation

Remediation Suggestions

  1. Parse URLs with urllib.parse.urlsplit and permit only explicitly supported http and https schemes.
  2. Reject URLs containing embedded credentials, malformed hostnames, unsupported ports, or ambiguous address representations.
  3. Resolve the hostname before connecting and reject every address classified as loopback, private, link-local, reserved, multicast, unspecified, or otherwise non-global.
  4. Disable automatic redirects with allow_redirects=False, or validate and resolve every redirect destination before following it.
  5. Prefer a per-user allowlist of domains that the user has explicitly approved for monitoring.
  6. Apply outbound firewall or proxy controls that block access to loopback, private networks, and cloud metadata addresses.
  7. Protect against DNS rebinding by ensuring that the validated address is the address used for the connection, or route requests through a hardened egress proxy.
  8. Add response-size limits and streaming limits to reduce resource-exhaustion risk.
  9. Record rejected destinations and notification failures without exposing sensitive internal connection details.
  10. Add automated tests covering IPv4, IPv6, encoded IP addresses, redirects, DNS rebinding scenarios, localhost aliases, and metadata endpoints.

T09 · Insecure Skill Coding Practices

Error
Location
scripts/monitor.py:19
Finding

Unrestricted URL Fetching Enables Server-Side Request Forgery in the Cron-Invoked Script

Content
View full analysis

Vulnerability Details

File Location: scripts/monitor.py:19-31 and scripts/monitor.py:137-144
Vulnerability Type: Server-Side Request Forgery (SSRF)
Risk Level: High

Vulnerable code:

python
def fetch_url_content(url):
    """Fetch webpage content."""
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    }
    try:
        # SSL verification is enabled
        response = requests.get(url, headers=headers, timeout=30, verify=True)
        response.raise_for_status()
        return response.text
    except requests.exceptions.SSLError as e:
        return f"ERROR: SSL verification failed - {str(e)}"
    except Exception as e:
        return f"ERROR: {str(e)}"

def main():
    """Main function."""
    if len(sys.argv) < 2:
        print("Usage: monitor.py <url> [rule]")
        sys.exit(1)

    url = sys.argv[1]
    rule = sys.argv[2] if len(sys.argv) > 2 else "content"

    content = fetch_url_content(url)

Technical Analysis

This duplicate monitoring script is explicitly referenced by crontab-example.txt. Like the primary entry point, it accepts an unrestricted command-line URL and sends a request without validating the protocol, hostname, resolved IP address, destination port, or redirects.

This permits SSRF against services reachable from the host. HTTPS certificate verification does not restrict where requests may be sent, and requests follows redirects by default. Because cron can invoke this script repeatedly, a malicious or unsafe monitoring target may cause persistent recurring requests until the user removes the corresponding cron entry.

The script does not automatically install the cron task, so the documented scheduler is not itself a concealed persistence mechanism. Scheduled execution is legitimate for continuous monitoring. The security concern is that scheduling amplifies the unrestric ...[truncated 1406 chars]

Remediation
View remediation

Remediation Suggestions

  1. Apply the same centralized URL-validation implementation to both script copies; preferably remove the duplicate and retain one canonical entry point.
  2. Allow only http and https, reject embedded credentials and unexpected ports, and normalize the hostname before use.
  3. Resolve the destination and block loopback, private, link-local, reserved, multicast, unspecified, and non-global IPv4 and IPv6 addresses.
  4. Disable redirects or revalidate every redirect destination and resolved address.
  5. Use an explicit domain allowlist for scheduled monitors wherever feasible.
  6. Enforce network-level egress restrictions so the process cannot reach internal or metadata networks.
  7. Validate all cron targets before installation and again during every execution, because DNS and redirect behavior can change after configuration.
  8. Document how users can list and remove the cron entries, and recommend a dedicated low-privilege operating-system account.
  9. Add request rate limits, response-size limits, and failure backoff for scheduled jobs.
  10. Add regression tests ensuring that both direct and redirected internal destinations are rejected.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (22)

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This markdown file is written entirely in Chinese, including the title, checklist items, and upload instructions, with no indication that language selection is optional or that the locale is intentionally constrained. Under the policy rule, a skill artifact that effectively mandates a specific language without opt-in is a natural-language locale violation.

Content

No source excerpt is available for this finding.

Unsafe Defaults

Medium
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool defaults are unsafe or overly permissive (e.g. disabled TLS verification, no authentication, world-writable permissions). Unsafe defaults widen the attack surface.

Content

Scanner excerpt · RELEASE-CHECKLIST.md (reported line 5)May include surrounding context.

md
## ✅ 代码安全

- [x] 移除 `verify=False` 不安全 TLS 设置
- [x] 使用 `verify=True` 启用 SSL 验证
- [x] 无硬编码凭据
- [x] 配置文件使用占位符 `<YOUR_XXX>`

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill describes capabilities that read and write local files and access remote URLs, but it does not declare any tool scope or permission boundary. This can cause the host agent to grant broader-than-expected access, reducing transparency and increasing the risk of unintended file access, persistent local storage, or network exfiltration when the skill is invoked.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The natural-language description, invocation guidance, and user examples are written as Chinese-only instructions, such as 'Use when' examples expressed entirely in Chinese. There is no opt-in, alternative language guidance, or justification that this skill is intentionally limited to Chinese-speaking users or a China-specific deployment context.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The workflow stores monitored page contents and history locally and sends change data through Telegram/email, but the user-facing description does not clearly warn about that data retention and external transmission. Users may supply sensitive URLs or page content without understanding it will be persisted and shared with third-party notification providers, creating privacy and data leakage risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The upload guide instructs users to publish and install a monitoring/web-scraper skill but does not disclose the privacy, consent, and data-collection implications of continuous webpage monitoring. In a marketplace/distribution context, this omission can mislead reviewers and users about the operational behavior of the skill, increasing the risk of improper surveillance, unauthorized scraping, or policy violations.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
85% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · crontab-example.txt (reported line 4)May include surrounding context.

text
# ═══════════════════════════════════════════════════════════════
# Data Sentinel Pro - 数据监控 Cron 配置
# 说明:将下方配置添加到现有 crontab 中
# 编辑方式:crontab -e
# ═══════════════════════════════════════════════════════════════

# 监控示例 1:商品价格监控(每 30 分钟检查一次)

Session Persistence

Medium
Category
Rogue Agent
Confidence
85% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · crontab-example.txt (reported line 21)May include surrounding context.

text
# ═══════════════════════════════════════════════════════════════
# Data Sentinel Pro - 数据监控 Cron 配置
# 说明:将下方配置添加到现有 crontab 中
# 编辑方式:crontab -e
# ═══════════════════════════════════════════════════════════════

# 监控示例 1:商品价格监控(每 30 分钟检查一次)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill sends notification content derived from monitored URLs to Telegram without an explicit consent or disclosure step at the transmission point. This can leak sensitive URLs, page-change details, or other monitored data to a third-party service, which is especially risky if users monitor internal, authenticated, or private resources.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

The hardcoded use of the Telegram API establishes an external transmission path to a third-party service. In the context of a monitoring skill, this increases risk because monitored resources and detected changes may involve confidential business, personal, or internal system information.

Content

Scanner excerpt · monitor.py (reported line 121)May include surrounding context.

python
"""发送通知(TG/邮件)"""
    # Telegram 通知
    if config.get('telegram_token'):
        tg_url = f"https://api.telegram.org/bot{config['telegram_token']}/sendMessage"
        data = {
            'chat_id': config.get('telegram_chat_id'),
            'text': message,

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

This code performs an outbound HTTP request to Telegram containing the generated monitoring message. Because the message includes the monitored URL and change details, it can exfiltrate potentially sensitive operational or private data to an external service.

Content

Scanner excerpt · monitor.py (reported line 128)May include surrounding context.

python
'parse_mode': 'HTML'
        }
        try:
            requests.post(tg_url, json=data, timeout=10)
        except:
            pass

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill reads a broader local configuration file from the user's home directory to obtain notification credentials, which extends its access beyond simple webpage monitoring into local secret handling. Even if intended for notifications, this creates an unnecessary trust boundary crossing because a webpage-monitoring skill can access and use locally stored credentials without explicit user awareness or scoped secret injection.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The package description is written only in Chinese and presents the skill in that locale without any indication that users can choose another language or that the skill is intended solely for a Chinese-speaking or region-specific audience. This creates a natural-language locale policy concern because it implicitly constrains interaction to a specific language without documented opt-in or justification.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script transmits monitoring results, including the monitored URL and change details, to Telegram without any user-facing disclosure in this file. Even if intended as a feature, external transmission of potentially sensitive browsing targets or page-derived data can leak private information to a third-party service.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
91% confidence
Finding

Hardwiring Telegram as an outbound destination indicates third-party data transmission as part of the skill behavior. In the context of a monitoring tool, this is more sensitive than normal because alerts may reveal what the user is tracking and when changes occur, which can itself be private operational information.

Content

Scanner excerpt · scripts/monitor.py (reported line 121)May include surrounding context.

python
"""发送通知(TG/邮件)"""
    # Telegram 通知
    if config.get('telegram_token'):
        tg_url = f"https://api.telegram.org/bot{config['telegram_token']}/sendMessage"
        data = {
            'chat_id': config.get('telegram_chat_id'),
            'text': message,

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

This POST request sends monitoring alert content to Telegram, an external service outside the local trust boundary. Because the message includes the target URL and detected changes, it can disclose sensitive user interests, internal URLs, or monitored content metadata if used on private resources.

Content

Scanner excerpt · scripts/monitor.py (reported line 128)May include surrounding context.

python
'parse_mode': 'HTML'
        }
        try:
            requests.post(tg_url, json=data, timeout=10)
        except:
            pass

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The code silently reads notification credentials from the user's local config file without warning or in-band consent. Accessing sensitive tokens from a shared/global config is risky because it expands the skill's privilege surface and may surprise users who only expect local webpage monitoring.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script reads the user's broader local OpenClaw configuration to obtain notification credentials, which extends access beyond simple webpage fetching and change detection. While this is likely intended to support alerts, it creates a sensitive-data access path and increases blast radius if the skill is modified, compromised, or used in an unexpected context.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The subscription-management invocation phrases are provided only in Chinese, which implies a language-specific interaction pattern. Without an opt-in or documented locale constraint, this can violate language/locale policy expectations for broadly usable skills.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
98% confidence
Finding

The file's comments and usage instructions are written entirely in Chinese, which imposes a specific language on users. There is no indication that the skill is region-specific or that users can choose another language, which makes this a natural-language locale policy issue.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

The script silently reads a local configuration file that may contain sensitive notification credentials, without informing the user at runtime or constraining access to just the necessary values. This is a transparency and least-privilege issue because the skill's declared purpose does not clearly imply reading broader local application config data.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

User-facing messages, usage text, and comments are written exclusively in Chinese, including command help and status output. This creates a language/locale constraint without any opt-in or alternative language path, which matches the policy category for forced language behavior.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.