Back to skill

Security audit

Agent Swarm - 多智能体集群编排

Security checks for vulnerabilities and agentic risk

Overview

The skill is a disclosed multi-agent orchestration setup, but it grants broad automation authority and persists/reinjects agent memory without enough boundaries or safeguards.

Install only if you are comfortable giving this skill broad control over agent configuration, workspace files, command execution, browser automation, scheduled jobs, and persistent memory. Before use, restrict agent IDs and base paths, disable cron/browser/exec unless needed, avoid storing secrets or sensitive user content in experience logs, and review or clear stored memories before they are injected into new tasks.

Vulnerability Patterns
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (3)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/agent_manager.py:67
Finding

Path Traversal Enables Filesystem Access Outside the Agent Workspace

Content
View full analysis
Path: return Path(base_path) / agent_id ``` The resulting unchecked path is used by agent-management operations: ```python def add_agent(agent_id: str, template: str = "default", base_path: str = DEFAULT_AGENTS_PATH, **kwargs) -> dict: agent_path = get_agent_path(agent_id, base_path) if agent_path.exists(): return {"error": f"Agent {agent_id} already exists"} tmpl = AGENT_TEMPLATES.get( template, AGENT_TEMPLATES["default"] ).copy() tmpl.update(kwargs) agent_path.mkdir(parents=True, exist_ok=True) (agent_path / "memory").mkdir(exist_ok=True) soul_content = tmpl.get( "soul", AGENT_TEMPLATES["default"]["soul"] ) soul_content = soul_content.format( name=tmpl.get("name", agent_id) ) (agent_path / "SOUL.md").write_text(soul_content) (agent_path / "AGENTS.md").write_text(agents_content) (agent_path / "memory" / "experience.md").write_text( experience_content ) ``` ```python def remove_agent(agent_id: str, base_path: str = DEFAULT_AGENTS_PATH, backup: bool = True) -> dict: agent_path = get_agent_path(agent_id, base_path) if not agent_path.exists(): return {"error": f"Agent {agent_id} does not exist"} if backup: import shutil backup_path = Path(base_path) / ( f".backup_{agent_id}_" f"{datetime.now().strftime('%Y%m%d_%H%M%S')}" ) shutil.move(str(agent_path), str(backup_path)) else: import shutil shutil.rmtree(agent_path) ``` ### Technical Analysis `agent_id` is accepted from the command line and concatenated with t ...[truncated 2319 chars]
Remediation
View remediation
str: if not AGENT_ID_PATTERN.fullmatch(agent_id): raise ValueError("Invalid agent identifier") return agent_id ``` 2. Resolve the base and target paths and enforce strict containment: ```python def get_agent_path(agent_id: str, base_path: str = DEFAULT_AGENTS_PATH) -> Path: validate_agent_id(agent_id) base = Path(base_path).resolve(strict=True) target = (base / agent_id).resolve(strict=False) if target.parent != base: raise ValueError("Agent path escapes the configured workspace") return target ``` 3. Reject absolute paths, path separators, `.` and `..` components, null bytes, and symlink-based escapes. 4. For destructive operations, resolve and revalidate the path immediately before deletion. Explicitly reject deletion of the base directory or any ancestor. 5. Require interactive confirmation or a separate authorization flag for permanent deletion. Prefer moving agents into a dedicated backup directory whose path is not derived from `agent_id`. 6. Run the management script with a dedicated, minimally privileged operating-system account restricted to the agent workspace. 7. Add tests covering absolute paths, traversal sequences, nested separators, symlinks, base-directory deletion, and malformed Unicode path components. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/experience_logger.py:25
Finding

Experience Logger Allows Writes Outside the Configured Memory Directory

Content
View full analysis
Path: return Path(base_path) / agent_id / "memory" / "experience.md" def get_experience_json( agent_id: str, base_path: str = DEFAULT_AGENTS_PATH ) -> Path: return Path(base_path) / agent_id / "memory" / "experience.json" ``` The unchecked paths are subsequently created and written: ```python def log_experience(agent_id: str, experience: str, task: str = None, category: str = "general", base_path: str = DEFAULT_AGENTS_PATH) -> dict: exp_file = get_experience_file(agent_id, base_path) exp_json = get_experience_json(agent_id, base_path) exp_file.parent.mkdir(parents=True, exist_ok=True) experiences = [] if exp_json.exists(): try: experiences = json.loads(exp_json.read_text()) except: experiences = [] new_exp = { "id": f"exp_{now.strftime('%Y%m%d%H%M%S')}", "content": experience, "task": task, "category": category, "created": now.isoformat(), "used_count": 0 } experiences.append(new_exp) exp_json.write_text( json.dumps(experiences, indent=2, ensure_ascii=False) ) if exp_file.exists(): content = exp_file.read_text() if "## 经验记录" in content: parts = content.split("## 经验记录") rest = parts[1].replace( "*(暂无记录)*\n", "" ).replace("*(暂无记录)*", "") content = ( parts[0] + "## 经验记录\n\n" + new_line + rest.lstrip('\n') ) exp_file.write_text(content) else: exp_file.write_text(content) ``` ### Technical Analysis ...[truncated 1956 chars]
Remediation
View remediation
Path: validate_agent_id(agent_id) base = Path(base_path).resolve(strict=True) agent = (base / agent_id).resolve(strict=True) memory = (agent / "memory").resolve(strict=False) target = (memory / filename).resolve(strict=False) if agent.parent != base: raise ValueError("Invalid agent directory") if target.parent != memory: raise ValueError("Invalid memory path") return target ``` 4. Reject symlinked agent or memory directories unless the resolved location remains inside the trusted root. 5. Use atomic writes with restrictive permissions. Write to a safely created temporary file in the same directory, flush it, and atomically replace the destination. 6. Do not silently replace malformed existing JSON. Report the error and preserve the original file for recovery. 7. Run the logger under an account whose write access is limited to the designated memory directory. ]]>

T02 · Agent Memory Poisoning

Error
Location
scripts/experience_logger.py:142
Finding

Untrusted Experience Text Is Persisted and Re-Injected into Future Agent Prompts

Content
View full analysis
MAX_EXPERIENCES: experiences = experiences[-MAX_EXPERIENCES:] exp_json.write_text( json.dumps(experiences, indent=2, ensure_ascii=False) ) ``` The stored content is later emitted verbatim for insertion into a new prompt: ```python def inject_experiences(agent_id: str, limit: int = 5, base_path: str = DEFAULT_AGENTS_PATH) -> str: experiences = show_experiences( agent_id, limit=limit, base_path=base_path ) if not experiences: return "" lines = ["## Historical experience for reference\n"] for exp in experiences: task_info = ( f" (source: {exp['task']})" if exp.get("task") else "" ) lines.append(f"- {exp['content']}{task_info}") return "\n".join(lines) ``` The documented orchestration workflow then places this output into a spawned task prompt: ```python result = subprocess.run( [ "python3", "scripts/experience_logger.py", "inject", "researcher", "--limit", "5" ], capture_output=True, text=True ) experiences = result.stdout sessions_spawn({ task: f"""Search for the requested material... {experiences} """, agentId: "researcher" }) ``` ### Technical Analysis The logger treats arbitrary experience content as persistent agent knowledge and later returns it as ordi ...[truncated 2582 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (34)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

A second material mismatch exists because the document claims agent creation/orchestration as the core function, while the implemented examples prominently support experience logging, memory summarization, and prompt-context injection from files under /workspace/agents. Hidden persistence and retrieval capabilities increase the risk of data retention, prompt contamination, and unauthorized reuse of prior content across tasks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

A second material mismatch exists because the document claims agent creation/orchestration as the core function, while the implemented examples prominently support experience logging, memory summarization, and prompt-context injection from files under /workspace/agents. Hidden persistence and retrieval capabilities increase the risk of data retention, prompt contamination, and unauthorized reuse of prior content across tasks.

Content

No source excerpt is available for this finding.

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · SKILL.md (reported line 3)May include surrounding context.

md
---
name: agent-swarm
description: 创建和编排多智能体集群完成复杂任务。当用户需要将复杂任务拆解给多个专业智能体并行或串行执行时使用此技能。适用场景:(1) 复杂项目需要多角色协作(规划、调研、编码、写作、设计、分析、审核)(2) 需要并行执行多个独立子任务以提高效率 (3) 需要专业分工以优化成本和质量。关键词:多智能体、Agent集群、任务编排、并行执行、智能体团队。
---

# Agent Swarm - 多智能体集群编排

## 概述

此技能使你成为**智能体团队的指挥官**,�

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · references/chj-private-config-template.json (reported line 25)May include surrounding context.

json
subagents": {
          "allowAgents": [
            "pm", "researcher", "coder", "writer", "designer",
            "analyst", "reviewer", "assistant", "automator"
          ]
        }
      },
      {
        "id": "pm",
        "workspace": "/workspace/agents/pm",
        "model": { "primary": "chj-private/azure-gpt-5" },
        "identity": { "name": "产品经理", "emoji": "📋" },
        "tools": {
          "allow": ["read", "write", "edit", "web_search", "web_fetch", "memory_search", "memory_get"],
          "deny": ["exec", "process", "gateway", "browser", "message", "cron"]
        }
      },
      {
        "id": "researcher",
        "workspace": "/workspace/agents/researcher",
        "model": { "primary": "chj-private/azure-gpt-5-mini" },
        "identity": { "name": "研究员", "emoji": "🔍" },
        "tools": {
          "allow": ["web_search", "web_fetch", "read", "write", "memory_search", "memory_get"],
          "deny": ["exec", "process", "gateway", "browser

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · references/setup-guide.md (reported line 12)May include surrounding context.

多智能体系统配置指南

本指南帮助你配置和部署完整的多智能体团队。

一、架构概览

text
主智能体 (main) - 🎯 AWS Claude Opus 4.6 - 任务编排中心
    │ sessions_spawn
    ├── 📋 pm        (Azure GPT-5)       → 规划者
    ├── 🔍 researcher (Azure GPT-5-Mini) → 信息猎手(快速)
    ├── 👨‍💻 coder     (Azure GPT-5-Codex) → 代码工匠(编程专用)
    ├── ✍️ writer    (Azure GPT-5)       → 文字工匠
    ├── 🎨 designer  (Qwen3-VL-Plus)     → 视觉创作者
    ├── 📊 analyst   (Azure GPT-5-Codex) → 数据侦探
    ├── 🔎 reviewer  (Azure O3)          → 质量守门人(推理)
    ├── 💬 assistant (Azure GPT-5-Mini)  → 沟通桥梁(快速)
    └── 🤖 automator (Azure GPT-5-Codex) → 效率大师(编程)

二、快速配置步骤

步骤 1:创建智能体工作目录

bash
#

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · scripts/agent_manager.py (reported line 52)May include surrounding context.

python
�做什么
- ✅ 专注于什么
"""
    },
    "researcher": {
        "name": "研究员",
        "emoji": "🔍",
        "model": "glm-4",
        "tools_allow": ["web_search", "web_fetch", "read", "write", "memory_search", "memory_get"],
        "tools_deny": ["exec", "process", "gateway", "browser", "message", "cron"]
    },
    "coder": {
        "name": "程序员",
        "emoji": "👨‍💻",
        "model": "claude-opus-4",
        "tools_allow": ["read", "write", "edit", "exec", "process"],
        "tools_deny": ["web_search", "browser", "message", "gateway", "cron"]
    },
    "writer": {
        "name": "写作者",
        "emoji": "✍️",
        "model": "gemini-2.5-pro",
        "tools_allow": ["read", "write", "edit", "memory_search", "memory_get"],
        "tools_deny": ["exec", "process", "browser", "gateway", "message", "cron"]
    }
}


def get_agent_path(agent_id: str, base_path: str = DEFAULT_AGENTS_PATH) -> Path:
    return Path(base_path) / agent_id

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · scripts/init_agents.py (reported line 57)May include surrounding context.

python
�做什么
- ✅ 专注于什么
"""
    },
    "researcher": {
        "name": "研究员",
        "emoji": "🔍",
        "model": "glm-4",
        "tools_allow": ["web_search", "web_fetch", "read", "write", "memory_search", "memory_get"],
        "tools_deny": ["exec", "process", "gateway", "browser", "message", "cron"]
    },
    "coder": {
        "name": "程序员",
        "emoji": "👨‍💻",
        "model": "claude-opus-4",
        "tools_allow": ["read", "write", "edit", "exec", "process"],
        "tools_deny": ["web_search", "browser", "message", "gateway", "cron"]
    },
    "writer": {
        "name": "写作者",
        "emoji": "✍️",
        "model": "gemini-2.5-pro",
        "tools_allow": ["read", "write", "edit", "memory_search", "memory_get"],
        "tools_deny": ["exec", "process", "browser", "gateway", "message", "cron"]
    }
}


def get_agent_path(agent_id: str, base_path: str = DEFAULT_AGENTS_PATH) -> Path:
    return Path(base_path) / agent_id

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The tool constructs filesystem paths by directly joining user-controlled agent_id and base_path with no validation, confinement, or canonical path checks. Because add, remove, and update operate on the resulting path, an attacker or mistaken operator can target arbitrary directories via path traversal or absolute/parent-path manipulation, leading to unintended creation, move, or deletion outside the intended agents workspace.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The remove command performs destructive filesystem operations (shutil.move to backup or shutil.rmtree) immediately with no execution-time confirmation or dry-run safeguard. In a tool that accepts user-supplied identifiers and paths, this materially increases the chance of accidental destructive actions, and in combination with weak path validation can magnify damage beyond the intended agent scope.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
83% confidence
Finding

The skill document describes capabilities involving file read/write, execution, browser automation, cron, and inter-agent messaging, but it does not declare an explicit tool scope such as permissions or allowed-tools. That omission weakens policy enforcement and makes it easier for an orchestrator or reviewer to underestimate the skill's effective authority, especially given the broad operational examples in the document.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill instructs users to set cron-based automation but does not warn that scheduled jobs continue running after the current interaction and may make repeated system or network changes. In a powerful agent environment, this can lead to unintended persistence, repeated external actions, or unnoticed cost and security impact.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The experience logging design explicitly stores task-derived content in persistent files and later reinserts those memories into future prompts. Without strict filtering, this can retain secrets, personal data, proprietary material, or prior-task instructions and then leak or propagate them into unrelated future sessions, making the skill context significantly more dangerous than ordinary note-taking.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This manifest uses Chinese names for all agent identities, such as "主智能体", "产品经理", and "自动化", with no indication that the user can choose another language or that the skill is intentionally limited to a Chinese-only context. That creates a natural-language locale policy issue because the configuration appears to force a specific language without opt-in or justification.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The automator subagent is granted exec, process, cron, and browser capabilities simultaneously, which creates a broadly privileged automation agent capable of unattended code execution and web interaction. In a multi-agent orchestration skill, that combination materially increases the attack surface for prompt injection, persistence, or unintended autonomous actions beyond simple task coordination.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% 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 · references/setup-guide.md (reported line 30)May include surrounding context.

python3 /workspace/openclaw/skills/agent-swarm/scripts/init_agents.py --base-path /workspace/agents

或手动创建

mkdir -p /workspace/agents/{pm,researcher,coder,writer,designer,analyst,reviewer,assistant,automator}

text

### 步骤 2:更新 openclaw.json 配置

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% 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 · references/setup-guide.md (reported line 30)May include surrounding context.

python3 /workspace/openclaw/skills/agent-swarm/scripts/init_agents.py --base-path /workspace/agents

或手动创建

mkdir -p /workspace/agents/{pm,researcher,coder,writer,designer,analyst,reviewer,assistant,automator}

text

### 步骤 2:更新 openclaw.json 配置

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The guide explicitly grants the automator agent browser and cron capabilities in addition to exec/process/write, creating a highly privileged autonomous agent. For a skill whose stated purpose is orchestration and task decomposition, these capabilities materially expand the attack surface by enabling unattended web interaction and scheduled execution that could be abused for persistence, data exfiltration, or unwanted system actions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The permission matrix and surrounding guidance normalize assignment of powerful capabilities such as write, exec, process, browser, and cron to multiple agents without any prominent warning about host impact, destructive actions, persistence, or data leakage. In a copy-paste setup guide, omission of these warnings is dangerous because users may enable broad privileges without understanding that agents can modify files, run commands, spawn processes, or automate recurring tasks.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The guide instructs users to place API keys directly into configuration examples but does not warn that these credentials are sensitive, should not be committed to source control, and should be protected with secret-management practices. This omission increases the likelihood of credential leakage through copied configs, logs, backups, shared workspaces, or version control.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The file is written as a mandatory template in Chinese and states that the agent 'must output' the specified statistics, which effectively imposes a specific language/locale. There is no indication that users may choose another language or that the Chinese-only requirement is justified by a region-specific purpose.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This code creates directories and writes multiple files (SOUL.md, AGENTS.md, and memory/experience.md) but provides no confirmation prompt and no user-facing disclosure that existing filesystem state will be modified under the chosen base path. Although the function docstring says it adds a new agent, there is no explicit warning in the CLI output or surrounding comments about the file-creation side effects.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The code constructs file paths directly from user-controlled base_path and agent_id and then reads/writes files under those paths without validation or confinement. An attacker can use path traversal or an alternate base path to overwrite arbitrary files accessible to the process or read sensitive JSON/Markdown data, which is especially risky in a shared agent workspace.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The tool persistently stores arbitrary experience and task content to disk, but provides no user-facing notice, consent, retention policy, or sensitivity guidance. This can lead to unintentional storage of secrets, personal data, or proprietary task content that remains available to later reads and injections.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

Free-form logging creates persistent memory of arbitrary task and user content, which can later be exposed through show, summary, or inject flows. In an agent orchestration skill, this broad retention increases the chance of leaking secrets, internal instructions, or sensitive project data across tasks and agents.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

inject_experiences emits previously stored free-form content verbatim for inclusion in future prompts. Because that content may originate from users or prior task output, it can carry prompt-injection instructions that manipulate downstream agents, causing unsafe actions, data exfiltration, or policy bypass in an agent-swarm context where spawned agents may trust injected memory.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.