Back to skill

Security audit

daily-fintech-brief

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its briefing purpose, but its crawler can follow untrusted links from source pages and bring that content into the agent and local storage.

Review before installing. Use it only in an environment where outbound requests to private/internal services are blocked, or harden the crawler with strict HTTPS host allowlists and redirect validation. Expect raw article JSON and permanent Markdown reports to be written under ~/.openclaw/workspace/skills/daily-fintech-brief, and treat fetched article text and cached reports as untrusted content.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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)

T01 · Skill Instruction Hijacking

Warning
Location
SKILL.md:42
Finding

Untrusted Web Content Is Passed Directly into the Agent Context

Content
View full analysis
]*>([\s\S]*?)', '', html_content) text = re.sub(r']*>([\s\S]*?)', '', text) text = re.sub(r'<[^>]+>', ' ', text) text = re.sub(r'\s+', ' ', text).strip() return text[:2500] # 每篇详情页限制前 2500 字,防止大模型爆 Token ``` The extracted content is returned to the Agent without a trust boundary: ```python final_payload.append({ "source": src["title"], "title": item["title"], "content": pure_text }) ``` The storage-enabled implementation follows the same pattern: ```python def extract_pure_text(html_content): text = re.sub(r']*>([\s\S]*?)', '', html_content) text = re.sub(r']*>([\s\S]*?)', '', text) text = re.sub(r'<[^>]+>', ' ', text) text = re.sub(r'\s+', ' ', text).strip() return text[:2500] ``` ```python final_payload.append({ "source": src["title"], "title": item["title"], "content": pure_text, "url": item["url"] }) ``` ```python result = { "status": "success", "date": today, "article_count": len(articles), "articles": articles } print(json.dumps(result, ensure_ascii=False)) ``` ### Technical Analysis Article titles and bodies are controlled by external publishers or by anyone capable of compromising a source page. Removing scripts, styles, and HTML tags ...[truncated 2175 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/fetch_and_store.py:96
Finding

Unrestricted Detail-Page URLs and Redirects Permit Server-Side Request Forgery

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (8)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The skill's high-level description emphasizes reviewing curated fintech/AI sources, but the instructions also direct automatic local persistence of fetched raw data and permanent storage of generated reports. That hidden or under-emphasized behavior changes the privacy and data-handling profile of the skill, creating a risk that users trigger network collection and durable filesystem writes without informed consent.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill automatically fetches remote content and stores both collected source material and generated reports locally, but it does not provide a clear user-facing warning at the point of use. This is dangerous because users may unknowingly initiate external requests and persistent storage, which can create privacy, compliance, and data-governance issues in enterprise environments.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The primary natural-language description of the skill is entirely in Chinese, which imposes a specific language expectation on operators or maintainers without any opt-in, alternative language, or stated region-specific justification. Under the policy, language constraints should either be optional or clearly documented as necessary.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill persists fetched content to local storage and deletes files on disk even though its stated purpose is only briefing/review generation. In an agent-skill context, undeclared filesystem side effects reduce transparency, expand the trust boundary, and can surprise operators or downstream components that expect read-only behavior. The impact is limited here because writes are scoped to a fixed skill-local directory and cleanup only targets date-named JSON files in that directory.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The natural-language comments and descriptions indicate the skill is explicitly designed around Chinese-language sources and keyword filtering, such as Chinese-only source titles and filter terms. Because the file does not document any user opt-in or language selection, this can constitute a locale/language policy issue if the skill is expected to be language-neutral.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The trigger words and overall skill framing are specified entirely in Chinese, and the document presents a fixed Chinese-language report format without indicating that users may choose another language. This can be a language/locale policy concern when no opt-in or alternative language behavior is documented.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The top-level documentation says the script performs data fetching, local storage, automatic cleanup, and returns JSON for the next step. In practice, main() may skip fetching entirely by returning an existing report or by serving yesterday's cached raw data, which contradicts the stated behavior of grabbing source data for this run.

Content

No source excerpt is available for this finding.