Back to skill

Security audit

Dawn Proactive Agent v1.5

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent ETF trading automation package, but it needs Review because it can execute market orders without the advertised guardrails or a clear approval barrier.

Install only if you understand that this skill can affect a trading account when run with --execute. Use paper trading or dry-run first, verify the external OpenClaw skills it calls, review network destinations, and avoid relying on the advertised guardrails until order submission is protected by enforced checks and explicit user approval.

Vulnerability Patterns
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • 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
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (5)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/dawn_audit.py:52
Finding

Path Traversal Enables Arbitrary JSON File Read and Write

Content
View full analysis
/`. The forced `.json` suffix limits the target to paths ending in `.json`, but does not prevent access to sensitive JSON files elsewhere in the writable or readable filesystem. The write operation can overwrite an existing JSON file or create a new one wherever the process has write permission. The `--show` operation can print the contents of a traversed JSON file to standard output. ### Attack Path 1. An attacker obtains control over a value passed as `decision_id` to `record_decision`, or can invoke the script with a crafted `--show` argument. 2. The attacker supplies a traversal value such as `../../../some-directory/target`. 3. The program appends `.json`, producing a path similar to: `data/audit/20260916/../../../some-directory/target.json`. 4. Path resolution escapes the intended date-specific audit directory. 5. For `record_decision`, the target file is overwritt ...[truncated 636 chars]
Remediation
View remediation
str: if not SAFE_ID.fullmatch(value): raise ValueError("Invalid decision identifier") return value ``` 2. Reject absolute paths, path separators, `.` components, and `..` components. 3. Resolve the final path and verify that it remains beneath the expected directory: ```python base = _safe_path(today).resolve() target = (base / f"{validate_decision_id(decision_id)}.json").resolve() if base not in target.parents: raise ValueError("Path escapes audit directory") ``` 4. Apply the same validation to both `record_decision` and `--show`. 5. Use atomic file creation or replacement where state integrity matters. 6. Add tests for `../`, absolute paths, mixed separators, encoded separators, oversized identifiers, and valid identifiers. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
scripts/dawn_etf_rotator.py:211
Finding

Automated Trading Orders Bypass the Advertised Guardrails

Content
View full analysis
0: htsc_buy(r["code"], info["exchange"], r["target_weight"]) elif r["action"] == "\u51cf\u4ed3": cur_w = current_holdings.get(r["code"], {}).get("weight", 0) if cur_w - r["target_weight"] > 5: h = current_holdings.get(r["code"], {}) cq = h.get("avail_qty", 0) or h.get("qty", 0) cp = h.get("cur_price", 0) if cq > 0 and cp > 0: cv = cq * cp tv = total_assets * r["target_weight"] / 100 sq = int((cv - tv) / cp / 100 ...[truncated 3195 chars]
Remediation
View remediation

T02 · Agent Memory Poisoning

Warning
Location
scripts/dawn_memory_sync.py:75
Finding

Untrusted Persistent Memory Is Injected into Future Agent Context

Content
View full analysis
200: snippet = snippet[:200] + '...' src = m.get('source', '?') context_parts.append(f" {i}. [{src}|{m['confidence']:.2f}] {snippet}") total += len(all_results) ``` The context is persisted in the workspace: ```python def save_warmup_cache(context: str): """保存预热上下文到临时文件""" cache_path = os.path.join(WS, 'memory', '.warmup_cache.md') if context: header = f"\n" with open(cache_path, 'w', encoding='utf-8') as f: f.write(header + context + '\n') return True ``` A second prompt-oriented path also copies persisted lessons directly: ```python def load_lessons_for_prompt() -> str: """生成可注入到prompt的教训摘要""" reflections = load_learnings(10) if not reflections: return "" lines = ["\n## 【自进化引擎】历史反思摘要"] ... for r in failures: for lesson in r.get("lessons", []): key = lesson[:30] if key not in seen: ...[truncated 2593 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
scripts/dawn_etf_rotator.py:34
Finding

Mutable Undeclared External Skills Are Imported and Executed Without Integrity Verification

Content
View full analysis
List[Dict]: """调用妙想搜索获取新闻""" try: sys.path.insert(0, os.path.dirname(MX_SEARCH)) from mx_search import MXSearch mx = MXSearch() result = mx.search(query) items = result.get("data", {}).get("data", {}).get("llmSearchResponse", {}).get("data", []) return items[:max_items] ``` The external trading component is executed without version or integrity validation: ```python def htsc_call(*args: str) -> dict: cmd = ["python", HTSC_SKILL] + list(args) try: r = subprocess.run(cmd, capture_output=True, text=True, timeout=15) if r.returncode != 0: return {"ok": False, "error": {"message": f"CLI exit {r.returncode}: {r.stderr[:200]}"}} if not r.stdout or not r.stdout.strip(): return {"ok": False, "error": {"message": "empty response from CLI"}} return json.loads(r.stdout) ``` Similar external execution occurs in other components: ```python HTSC_SCRIPT = os.path.join( os.path.expanduser("~"), ".openclaw", "skills", "query-indicator", "query_indicator.py" ) ``` ```python result = subprocess.run( ["py", "-X", "utf8", HTSC_SCRIPT, "queryIndicator", "--quer ...[truncated 2225 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/dawn_monitor.py:49
Finding

Runtime Network Access Exceeds the Skill's Declared Host Scope

Content
View full analysis
Remediation
View remediation
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
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (46)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Labeling workflow steps like REFLECT or EXECUTE without implementing the substantive controls behind them can create a false sense of assurance. In a system with workspace write and exec permissions, that kind of safety theater is risky because users may assume governance features exist when they do not.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

Labeling workflow steps like REFLECT or EXECUTE without implementing the substantive controls behind them can create a false sense of assurance. In a system with workspace write and exec permissions, that kind of safety theater is risky because users may assume governance features exist when they do not.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Labeling workflow steps like REFLECT or EXECUTE without implementing the substantive controls behind them can create a false sense of assurance. In a system with workspace write and exec permissions, that kind of safety theater is risky because users may assume governance features exist when they do not.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Labeling workflow steps like REFLECT or EXECUTE without implementing the substantive controls behind them can create a false sense of assurance. In a system with workspace write and exec permissions, that kind of safety theater is risky because users may assume governance features exist when they do not.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Labeling workflow steps like REFLECT or EXECUTE without implementing the substantive controls behind them can create a false sense of assurance. In a system with workspace write and exec permissions, that kind of safety theater is risky because users may assume governance features exist when they do not.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Labeling workflow steps like REFLECT or EXECUTE without implementing the substantive controls behind them can create a false sense of assurance. In a system with workspace write and exec permissions, that kind of safety theater is risky because users may assume governance features exist when they do not.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

Labeling workflow steps like REFLECT or EXECUTE without implementing the substantive controls behind them can create a false sense of assurance. In a system with workspace write and exec permissions, that kind of safety theater is risky because users may assume governance features exist when they do not.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Labeling workflow steps like REFLECT or EXECUTE without implementing the substantive controls behind them can create a false sense of assurance. In a system with workspace write and exec permissions, that kind of safety theater is risky because users may assume governance features exist when they do not.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

Labeling workflow steps like REFLECT or EXECUTE without implementing the substantive controls behind them can create a false sense of assurance. In a system with workspace write and exec permissions, that kind of safety theater is risky because users may assume governance features exist when they do not.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file documents fully autonomous ETF trading actions such as buy/sell decisions and successful order placement, but provides no warning, consent boundary, or requirement for human approval before asset-affecting actions. In the context of an agent skill for autonomous trading, this normalizes live execution and increases the risk that users deploy or trust the system without understanding financial loss, compliance, or unauthorized-trading consequences.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

When run with --execute, the script automatically submits market buy and sell orders based on derived scores and news parsing, with no explicit interactive confirmation, approval workflow, or final review step. In a trading skill, this materially increases the risk of unintended asset movements from logic errors, manipulated inputs, or accidental invocation, especially because the orders are market orders.

Content

No source excerpt is available for this finding.

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · scripts/dawn_monitor.py (reported line 79)May include surrounding context.

python
return {"error": "query-indicator不可用"}
    
    try:
        env = os.environ.copy()
        env["PYTHONIOENCODING"] = "utf-8"
        result = subprocess.run(
            ["py", "-X", "utf8", HTSC_QUERY, "queryIndicator",

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
93% confidence
Finding

The documentation advertises autonomous trading behavior and read/write workspace access without a strong warning about financial impact and local data modification. In context, this is more dangerous than a typical automation skill because it combines potential monetary loss with persistent filesystem side effects.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

Showing a manual trade command without a conspicuous warning can cause a user to run a command that may place real trades or trigger irreversible brokerage-side actions. In financial tooling, omission of a live-trading caution is a meaningful safety defect because the cost of misunderstanding is immediate monetary loss.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
79% confidence
Finding

Operational log entries and asset names are presented in Chinese, and the file gives no indication that users can opt into another language or locale. Per the policy, forcing a specific language without user choice is a natural-language policy violation unless clearly justified.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The trace states that results were pushed to Feishu without warning that trading activity, execution details, or potentially sensitive operational data may be transmitted to an external service. In a finance-related agent, silent external delivery can expose positions, timing, account-related telemetry, or strategy details to third parties or misconfigured recipients.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

The markdown notes that 1,237 deleted archive files were committed, indicating destructive or irreversible changes to repository contents. The skill description does not include any caution about deletion, archival cleanup, or the need to review such changes before they are committed.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code file contains natural-language user-facing text exclusively in Chinese in the module docstring, comments describing behavior, and CLI help text. Under the policy rule, forcing a specific language without offering a user choice or documenting a justified locale restriction is a reportable language/locale policy violation.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The module explicitly states it records complete audit traces from input data through reasoning and output, and the implementation stores that content in plain JSON. This creates a natural-language leakage surface for sensitive model deliberation, proprietary strategy logic, and user or market data, especially risky in a self-reflective trading system where reasoning may contain highly sensitive internal state.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The audit function persists full decision reasoning plus input and output payloads to disk in JSON files, which can capture sensitive prompts, model chain-of-thought, trading signals, credentials, account data, or other confidential context. In an autonomous trading agent, these logs materially increase data-retention and disclosure risk if the host is compromised, backups are exposed, or operators access logs beyond need-to-know.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/dawn_collector.py (reported line 48)May include surrounding context.

python
return {"error": "query-indicator不可用"}
    
    try:
        result = subprocess.run(
            ["py", "-X", "utf8", HTSC_SCRIPT, "queryIndicator",
             "--query", f"{code}{name}今天MACD、KDJ、RSI、换手率、成交量、振幅、主力资金流向、市盈率"],
            capture_output=True, text=True, encoding="utf-8", timeout=30,

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The top-level documentation states '--dry-run # 只看新闻不评分' and presents the script as a daily loop around news/scoring, but the actual program's normal path persists portfolio/recommendation data to disk and, with '--execute', submits live buy/sell orders through the HTSC trading skill. This is an intent-level contradiction because the documentation materially understates side effects and execution behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The top-level natural-language description is written entirely in Chinese and presents the skill behavior as mandatory, with no indication that users may choose another language or locale. Under the policy rule, forcing a specific language without opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This code writes warmup context to memory/.warmup_cache.md and deletes that file when no context exists, which are file-modifying operations. Although the function has an internal docstring, there is no user-facing disclosure at the point of action beyond a post-action status message, and the header description does not warn that a local cache file will be created or removed.

Content

No source excerpt is available for this finding.