Back to skill

Security audit

Morning Brief

Security checks for vulnerabilities and agentic risk

Overview

This skill is a simple RSS headline fetcher with some rough instructions and link-handling caveats, but no evidence of hidden persistence, credential access, destructive behavior, or exfiltration.

Install only if you are comfortable with the skill making outbound requests to public news and release feeds and rendering clickable article links. Expect Chinese-language output unless you edit the skill, and treat links as external content rather than trusted OpenClaw content.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/fetch_clean_headlines.py:4
Finding
Unrestricted URL Fetching Enables Server-Side Request Forgery## Vulnerability Details **File Location**: `scripts/fetch_clean_headlines.py`, lines 4–14 **Vulnerability Type**: Server-Side Request Forgery through an unrestricted outbound request **Risk Level**: Medium ```python def fetch_clean_headlines(source_name: str, url: str, limit: int = 3, keywords: list = None, negative_keywords: list = None) -> str: try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept': 'application/rss+xml, application/xml, text/xml, */*' } with httpx.Client(timeout=15.0, headers=headers, follow_redirects=True) as client: response = client.get(url) ``` ### Technical Analysis The `fetch_clean_headlines` function accepts a URL and passes it directly to `httpx.Client.get()` without validating its scheme, hostname, resolved IP address, or destination port. The HTTP client is also configured with `follow_redirects=True`, allowing an initially external URL to redirect the request to an internal destination. If an untrusted user or Agent-controlled workflow can provide the `url` argument, the function can be used as a server-side request forgery primitive. Potential destinations include loopback interfaces, private network ranges, link-local services, and cloud instance metadata endpoints. Because the response is subsequently parsed as a feed, XML- or RSS-compatible internal responses may be exposed through generated headline output. The current executable entry point uses hardcoded public feed URLs. Exploitation therefore requires another caller to invoke this reusable function with attacker-controlled input. This usage is plausible because `SKILL.md` describes feed URL input, although the documented interactive prompt is not implemented in the reviewed script. ### Attack Path 1. An attacker supplies a URL to a workflow that passes it ...[truncated 1106 chars]
Remediation
## Remediation Suggestions - Accept only `https` URLs and reject URLs containing credentials, unexpected ports, fragments, or ambiguous hostname syntax. - Maintain an explicit allowlist of approved feed hostnames rather than permitting arbitrary destinations. - Resolve the hostname before connecting and reject loopback, private, link-local, multicast, unspecified, and reserved IPv4 and IPv6 addresses. - Disable automatic redirects unless they are required. If redirects are enabled, validate every redirect target using the same scheme, hostname, and resolved-address restrictions. - Account for DNS rebinding by ensuring that the address validated is the address used for the connection, or enforce outbound restrictions at the network layer. - Apply egress firewall rules that prevent the process from reaching internal networks and cloud metadata addresses. - Add tests covering direct internal URLs, IPv6 loopback addresses, alternative IP representations, DNS rebinding scenarios, and public URLs that redirect to private destinations. - If only the hardcoded feeds are intended, remove the public URL parameter and map approved source identifiers to fixed URLs internally.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (7)

Natural-Language Policy Violations

High
Confidence
98% confidence
Finding
Mandating translation of all headlines into Chinese and directing the model to 'write a brief that you would like to see' overrides user preference and encourages unrequested transformation and editorialization of third-party content. This can mislead users, alter meaning, and reduce fidelity to source material, especially for safety-sensitive or politically sensitive news summaries.

Vague Triggers

Medium
Confidence
91% confidence
Finding
The trigger description is broad enough to activate on common conversational requests such as general questions about current events or daily updates, which can cause over-invocation of the skill and unintended tool use. While not directly a code-execution flaw, broad routing expands the attack surface by making it easier for unrelated prompts to invoke external content-fetching behavior.

Intent-Code Divergence

Medium
Confidence
93% confidence
Finding
The skill instructs the agent to preserve and emit original Markdown links exactly as provided, which can bypass normal link-safety handling and create a channel for rendering attacker-controlled URLs directly to users. In this context, the mismatch between claimed script output and required output format also suggests the model may be asked to transform raw feed content into clickable links without validation, increasing phishing and deceptive-link risk.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
Natural-language outputs in the script, including errors and status text, are fixed to a specific language. Under the policy, forcing a language without user opt-in or a documented locale-specific justification is a language/locale policy violation.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
This parsing failure message is presented only in Chinese and the file contains similar fixed-language strings elsewhere. The skill does not provide a language option or explain that it is intended for a Chinese-only context.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
The script prints status information in a single forced language during execution. Because no language choice is offered and no regional justification is documented, this conflicts with the language/locale policy.

Missing User Warnings

Low
Confidence
90% confidence
Finding
This code performs outbound network requests to third-party RSS sources and intentionally disguises the client as a web browser via a custom User-Agent. There is no docstring, comment explaining the user-impact in safety terms, or user-facing disclosure that external requests will be sent to remote services.

Static analysis

No suspicious patterns detected.