Back to skill

Security audit

Agentic Engineering

Security checks for vulnerabilities and agentic risk

Overview

The skill has a coherent agent-engineering purpose, but it includes under-scoped persistent MCP services, arbitrary endpoint probing, and optional external report sending that users should review carefully before installing.

Install only after reviewing the MCP server behavior. Use an isolated environment, avoid registering internal or sensitive endpoints, do not bind AutoGen Studio to public interfaces, rotate any real credentials copied from these docs, remove the hardcoded Feishu recipient before sending reports, and pin/review dependencies before enabling the gateway-managed server.

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
mcp-server/server.py:257
Finding

Unrestricted Endpoint Registration Enables Server-Side Request Forgery

Content
View full analysis
dict: """Register a new external colony.""" TYPE_MAP = { "hive": "🏠 Another hive", "flower_field": "🌼 Data source", "manuka_grove": "🌿 Professional knowledge", "river": "🌊 Streaming information", } if colony_type not in TYPE_MAP: return {"error": f"Invalid type {colony_type}, choices: {list(TYPE_MAP.keys())}"} db = get_db() now = datetime.now(timezone.utc).isoformat() try: meta = json.loads(metadata) except json.JSONDecodeError: meta = {} db.execute( "INSERT OR REPLACE INTO colonies " "(name, type, endpoint, status, last_poll, metadata) " "VALUES (?, ?, ?, 'registered', ?, ?)", (name, colony_type, endpoint, now, json.dumps(meta, ensure_ascii=False)) ) db.commit() db.close() return { "registered": name, "type": colony_type, "endpoint": endpoint, } @mcp.tool() def colony_poll(name: str) -> dict: """Probe an external colony endpoint.""" db = get_db() row = db.execute( "SELECT * FROM colonies WHERE name = ?", (name,) ).fetchone() if not row: db.close() return {"error": f"Colony {name} is not registered"} now = datetime.now(timezone.utc).isoformat() status = "unknown" if row["endpoint"]: try: import httpx resp = httpx.get(row["endpoint"], timeout=5.0) status = "alive" if resp.status_code < 500 else "degraded" except Exception as e: status = f"unreachable: {type(e).__name__}" else: status = "no_endpoint" db.execute( "UPDATE colonies SET sta ...[truncated 2663 chars]
Remediation
View remediation

T02 · Agent Memory Poisoning

Error
Location
mcp-server/server.py:153
Finding

Attacker-Controlled Text Is Persisted and Reintroduced as Trusted Agent Memory

Content
View full analysis
dict: """Update branch state.""" db = get_db() row = db.execute( "SELECT * FROM branches WHERE name = ?", (branch,) ).fetchone() if not row: db.close() return {"error": f"Branch {branch} does not exist"} now = datetime.now(timezone.utc).isoformat() updates = {"updated_at": now} if status: updates["status"] = status if effectiveness is not None: updates["effectiveness"] = max(0.0, min(1.0, effectiveness)) if description: updates["description"] = description log_detail = {**updates} if reasoning: log_detail["reasoning"] = reasoning db.execute( "INSERT INTO evolution_log " "(action, target, detail, created_at) VALUES (?, ?, ?, ?)", ( "update", branch, json.dumps(log_detail, ensure_ascii=False), now, ) ) db.commit() db.close() @mcp.tool() def skill_evolve( branch: str, new_capability: str, detail: str = "", reasoning: str = "" ) -> dict: """Trigger branch evolution.""" db = get_db() now = datetime.now(timezone.utc).isoformat() log_detail = { "new_capability": new_capability, "detail": detail, } if reasoning: log_detail["reasoning"] = reasoning db.execute( "INSERT INTO evolution_log " "(action, target, detail, created_at) VALUES (?, ?, ?, ?)", ( "evolve", branch, json.dumps(log_detail, ensure_ascii=False), now, ) ) db.execute( "UPDATE bra ...[truncated 3196 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
ai-daily-report/brewer/feishu_push.py:12
Finding

Daily Reports Can Be Sent to a Hardcoded External Recipient Through an Unreviewed Workspace Script

Content
View full analysis
4000: content_md = ( content_md[:3900] + "\n\n_...content truncated_" ) result = subprocess.run( [ sys.executable, str(SEND_CARD_SCRIPT), receive_id, title, content_md, template, ], capture_output=True, text=True, timeout=30, ) return ( result.returncode == 0, result.stdout.strip(), result.stderr.strip(), ) ``` ```python def push_daily_report(): """Push the daily AI market report to Feishu.""" today = date.today().isoformat() ranking_path = OUTPUT_DIR / f"ranking_{today}.json" if not ranking_path.exists(): print(f"Ranking data does not exist: {ranking_path}") return False with open(ranking_path) as f: rankings = json.load(f) garden_path = OUTPUT_DIR / f"garden_{today}.json" garden_data = None if garden_path.exists(): with open(garden_path) as f: garden_data = json.load(f) forage_path = OUTPUT_DIR / f"forage_{today}.json" forage_data = {} if forage_path.exists(): with open(forage_path) as f: forage_data = json.load(f) title, content ...[truncated 2531 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
composing/SKILL.md:51
Finding

AutoGen Studio Instructions Expose an Authenticated Service on All Network Interfaces

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
mcp-server/SKILL.md:14
Finding

Persistent MCP Server Installation Uses an Unpinned Third-Party Dependency

Content
View full analysis
/.venv/bin/python", "args": ["/server.py"] } } } } ``` The instructions then direct the user to restart the gateway: ```bash openclaw gateway restart ``` ### Technical Analysis The installation command retrieves `fastmcp` and its transitive dependencies without a pinned version, lockfile, or package hashes. The installed dependency is then used by a server registered with the OpenClaw gateway and started in subsequent gateway sessions. This does not prove that `fastmcp` is malicious. The vulnerability is that the effective dependency set can change after review, producing non-reproducible installations and allowing an unexpectedly compromised or incompatible future release to execute persistently. Because `server.py` imports `FastMCP` at startup, package initialization code executes with the account permissions used by the OpenClaw gateway. ### Attack Path 1. A user follows the documented installation process. 2. `pip install fastmcp` resolves the latest package and transitive dependency versions available at that time. 3. A compromised, malicious, or unexpectedly changed dependency version is selected. 4. The user registers the MCP server and restarts the gateway. 5. Python imports the installed dependency when `server.py` starts. 6. Dependency code executes with the gateway user's local filesystem and network permissions. 7. The dependency continues to execute whenever the ...[truncated 592 chars]
Remediation
View remediation
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • 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 (85)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Registering external endpoints, probing them over HTTP, storing persistent state in SQLite, and managing alerts/status dashboards creates a monitoring system, not merely an architecture-selection skill. Hidden endpoint interaction and durable operational state substantially increase risk of unintended scanning, data retention, and unauthorized monitoring activity.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Registering external endpoints, probing them over HTTP, storing persistent state in SQLite, and managing alerts/status dashboards creates a monitoring system, not merely an architecture-selection skill. Hidden endpoint interaction and durable operational state substantially increase risk of unintended scanning, data retention, and unauthorized monitoring activity.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Registering external endpoints, probing them over HTTP, storing persistent state in SQLite, and managing alerts/status dashboards creates a monitoring system, not merely an architecture-selection skill. Hidden endpoint interaction and durable operational state substantially increase risk of unintended scanning, data retention, and unauthorized monitoring activity.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Registering external endpoints, probing them over HTTP, storing persistent state in SQLite, and managing alerts/status dashboards creates a monitoring system, not merely an architecture-selection skill. Hidden endpoint interaction and durable operational state substantially increase risk of unintended scanning, data retention, and unauthorized monitoring activity.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Registering external endpoints, probing them over HTTP, storing persistent state in SQLite, and managing alerts/status dashboards creates a monitoring system, not merely an architecture-selection skill. Hidden endpoint interaction and durable operational state substantially increase risk of unintended scanning, data retention, and unauthorized monitoring activity.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Registering external endpoints, probing them over HTTP, storing persistent state in SQLite, and managing alerts/status dashboards creates a monitoring system, not merely an architecture-selection skill. Hidden endpoint interaction and durable operational state substantially increase risk of unintended scanning, data retention, and unauthorized monitoring activity.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Registering external endpoints, probing them over HTTP, storing persistent state in SQLite, and managing alerts/status dashboards creates a monitoring system, not merely an architecture-selection skill. Hidden endpoint interaction and durable operational state substantially increase risk of unintended scanning, data retention, and unauthorized monitoring activity.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Registering external endpoints, probing them over HTTP, storing persistent state in SQLite, and managing alerts/status dashboards creates a monitoring system, not merely an architecture-selection skill. Hidden endpoint interaction and durable operational state substantially increase risk of unintended scanning, data retention, and unauthorized monitoring activity.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Registering external endpoints, probing them over HTTP, storing persistent state in SQLite, and managing alerts/status dashboards creates a monitoring system, not merely an architecture-selection skill. Hidden endpoint interaction and durable operational state substantially increase risk of unintended scanning, data retention, and unauthorized monitoring activity.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Registering external endpoints, probing them over HTTP, storing persistent state in SQLite, and managing alerts/status dashboards creates a monitoring system, not merely an architecture-selection skill. Hidden endpoint interaction and durable operational state substantially increase risk of unintended scanning, data retention, and unauthorized monitoring activity.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Registering external endpoints, probing them over HTTP, storing persistent state in SQLite, and managing alerts/status dashboards creates a monitoring system, not merely an architecture-selection skill. Hidden endpoint interaction and durable operational state substantially increase risk of unintended scanning, data retention, and unauthorized monitoring activity.

Content

No source excerpt is available for this finding.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · ai-daily-report/brewer/taste.py (reported line 292)May include surrounding context.

python
}
    
    save_evolution_rule(rule)
    return rule


# 初始化:把品蜜规则持久化

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest describes a framework for choosing between coordination paradigms and executing branches such as coding/composing/supervising/quant trading. This file's docstring and code instead implement a concrete four-step daily market report pipeline that scans vendors, gathers news/pricing data, brews rankings, writes report artifacts, and optionally pushes a report, which is materially different from the declared skill purpose.

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The trigger condition is extremely broad, covering essentially any task needing deep reasoning plus multimedia output. Overbroad activation increases the chance the skill is invoked in contexts the user did not intend, which is more dangerous here because the skill also contains networked multi-agent and local service interaction guidance.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The skill documentation exposes live-looking credentials, including API keys and an AutoGen Studio JWT, directly in the file. Even if partially redacted, publishing secrets in a skill is unnecessary for the composing purpose and can enable unauthorized access, billing abuse, data theft, or control of the referenced agent infrastructure.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The code calls _sync_branches() in multiple tools, but no callable function is actually defined; instead, the supposed implementation is stranded after a return inside evolution_history and is unreachable. This causes runtime failures/denial of service for core operations like skill_list, skill_query, and status_summary, and the misleading docstring may conceal the defect during review.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill advertises no explicit tool scope, yet the surrounding capability profile indicates access to environment, filesystem writes, network, and shell-like behavior. In a skill that discusses MCPs, subagents, external colonies, and persistent state, missing permission declarations reduces transparency and can cause the skill to run with broader authority than users expect.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger conditions are broad enough to match many normal requests involving system design, architecture choices, or generic task branches. Overbroad invocation is dangerous because it can cause this high-capability skill to activate unexpectedly, increasing the chance that hidden file, network, or subprocess behaviors run in contexts where they are unnecessary.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The description and the rest of the skill are written entirely in Chinese, with no indication that language selection is optional or user-driven. Under the policy, language constraints should either be optional or explicitly justified as region-specific.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The manifest describes a framework for choosing coordination paradigms and executing branches such as coding, composing, supervising, and quant trading. This file, however, is not framework logic or branching/orchestration code; it is a concrete HTML/CSS/JS visualization for an 'AI 市场日报' with hardcoded vendors, rankings, scoring formulas, and UI rendering behavior.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The inline UI text says the system performs 'mmx search 多信号扫描', 'Playwright 爬取', '飞书卡片推送', and '历史趋势存档'. In reality, the script only defines static arrays and populates DOM elements; there is no search integration, crawling, push, or storage logic anywhere in the file.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This Python file uses natural-language instructions that define the engine and report-generation behavior entirely in Chinese, including the stated purpose of generating a daily report. For a general-purpose skill, this effectively imposes a specific language/locale without offering the user a choice or documenting a justified region-specific constraint.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

L361 在日报中声明“性价比 = 能力分 / 加权价格”,但实际 calculate_cost_effectiveness 在 L174-L193 使用的是 capability² × log10(1000 / weighted_price)。这不是简单的省略细节,而是向使用者呈现了与真实排名依据不同的公式,构成文档与实现的主动矛盾。

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill depends on and executes an external workspace script for message delivery, a capability not implied by the manifest and outside the file's own trust boundary. This creates a hidden execution and exfiltration path, since the external script could send data elsewhere or change behavior independently of this code.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The hard-coded Feishu open_id targets a specific external recipient without user choice or disclosure. In a reusable skill, embedding a fixed recipient enables silent forwarding of potentially sensitive output to an unintended party and makes misuse difficult to detect.

Content

No source excerpt is available for this finding.