Back to skill

Security audit

Multi Agent Orchestrator

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a coherent local multi-agent workflow tool, but its dashboard and broad activation scope create review-worthy risks around local state changes and sensitive pipeline data.

Install only if you are comfortable with a local workflow tool that writes state, reports, snapshots, and dashboard tokens to disk. Avoid storing secrets or personal data in node outputs, do not expose the dashboard beyond localhost, be careful with dashboard files generated from untrusted pipeline output, and require explicit confirmation before using templates that move, rename, delete, publish, or approve data.

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/web_dashboard.py:202
Finding

Stored Script Injection in the Local Web Dashboard

Content
View full analysis

Vulnerability Details

File Location: scripts/web_dashboard.py, lines 202 and 243–258
Vulnerability Type: Stored script injection in generated HTML
Risk Level: Medium

Vulnerable Code:

python
const node = {json.dumps({nid: n.get('output_data', {}) for nid, n in nodes.items()}, ensure_ascii=False)}[d.name];

The injected JavaScript runs in the same page as the approval functions:

javascript
function approvePipeline() {
  fetch('/api/approve', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-Local-Token': localStorage.getItem('token') || ''
    },
    body: JSON.stringify({ action: 'approve' })
  }).then(r => r.json()).then(d => alert(d.message || JSON.stringify(d)));
}

function rejectPipeline() {
  fetch('/api/approve', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-Local-Token': localStorage.getItem('token') || ''
    },
    body: JSON.stringify({ action: 'reject' })
  }).then(r => r.json()).then(d => alert(d.message || JSON.stringify(d)));
}

Technical Analysis

The dashboard serializes pipeline node output_data with json.dumps() and inserts the result directly into an executable HTML <script> element. JSON string encoding does not make data safe for an HTML script context because it does not necessarily neutralize the HTML parser’s </script> closing sequence.

Consequently, an output value containing a payload such as:

html
</script><script>/* attacker-controlled JavaScript */</script>

can terminate the intended script block and introduce a new executable script element. This is a stored injection because the payload is first persisted in pipeline state and executes later when the dashboard detail page renders that state.

Pipeline output can include content collected by automated nodes from websites or other external sources. Such content crosses from an untrusted data context into the trusted localhost dashboard origin wi ...[truncated 1822 chars]

Remediation
View remediation

Remediation Suggestions

  1. Do not interpolate serialized pipeline data directly into executable JavaScript source.
  2. Prefer serving pipeline details through a JSON endpoint and fetching them from the page. Parse the response as data and render values with safe DOM APIs such as textContent.
  3. If JSON must be embedded in HTML, place it in a non-executable element such as:
html
<script id="pipeline-data" type="application/json">...</script>

Before embedding, escape HTML-significant characters, especially <, as Unicode escapes such as \u003c. Also escape >, &, U+2028, and U+2029 where appropriate. 4. Apply context-specific HTML escaping to pipeline_name, node identifiers, approval-node labels, and every other value inserted into HTML markup. 5. Add a restrictive Content Security Policy that disallows inline and untrusted scripts. Use nonces or hashes for required local scripts. 6. Add regression tests using payloads containing </script>, HTML elements, quotes, ampersands, and Unicode line separators. Verify that they remain inert text in the generated page. 7. Avoid storing the approval token in localStorage. Prefer an HttpOnly, SameSite cookie or another mechanism unavailable to injected JavaScript, while retaining server-side authorization checks.

Vulnerability Patterns
  • 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
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (100)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

描述将该技能定义为完整的多Agent流水线编排平台,而给出的代码片段仅实现了其中一个很小的辅助组件:DAG/JSON 配置验证。它没有任何实际编排运行逻辑、任务执行、状态管理、恢复机制、审批交互、报告生成、可视化输出、服务端暴露或模板管理功能。虽然代码中提到 approval、condition、switch、for-each、while-loop、pipeline、evaluate 等节点类型,并可校验这些节点字段,但这仍属于静态输入校验,不等同于声明中的运行时编排能力。因此描述与实际行为存在明显且实质性的能力夸大,属于不准确表述。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

该描述宣称的是一个范围很广的编排系统能力集合,而提供的代码块只是其中“错误恢复/降级/影响分析”这一子模块。代码的主要行为是:加载状态文件、检查节点重试次数、将节点重置为pending、在重试耗尽后执行skip/default/abort降级策略、以及BFS分析下游受影响节点。虽然这与声明中的“错误重断点续传、统一错误恢复命令”方向部分相关,但远不足以支撑所述的大多数核心能力。不存在明显越权或未声明的敏感资源访问;问题在于描述显著夸大了代码实际实现范围,因此应判定为描述与行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

声明描述的是一个范围很大的编排平台/产品能力集合,而给出的代码块仅覆盖其中‘动态控制流处理’这一子能力,核心是控制节点求值与状态修改。它确实与‘多Agent流水线编排’总体方向一致,也部分涉及DAG调度、状态共享、子流水线、循环/重试等内容;但代码没有体现大量被明确宣称的重要功能,如审批节点、报告与甘特图、历史对比、Web控制台、MCP Server、模板库、版本提醒、新手向导等。按“描述是否准确代表该代码实际行为”标准,这属于明显过度声明:描述像是整个系统总览,而代码只是其中一个控制流模块。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述的是一个大型编排引擎/平台能力集合,而提供的代码片段只是其中非常小的一项辅助功能:硬件检测与参数推荐。它没有体现所宣称的大部分核心能力,尤其缺少编排器本身、DAG执行、状态共享、审批、可视化、控制台和服务暴露等关键功能。因此代码的实际主要用途与声明的整体用途存在明显且实质性的不一致。虽然“硬件自适应参数”这一子能力与代码相符,但不足以支撑整个声明。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

整体上,代码与声明的大方向高度一致:它确实是一个多Agent/DAG编排引擎,并实现了大部分声明中的核心能力,如状态共享、恢复、报告、甘特图、审批、历史比较、硬件检测、更新提醒、模板、错误恢复、Web控制台、MCP、成本桥接和init向导。因此不存在“主用途完全不同”的问题。 但按给定标准,仍应判定为不匹配,原因有二:第一,声明中对模板库的描述与代码存在明确事实差异——声明说“10类预置模板”,代码自身文案写的是“4类预置模板”,这是可验证的能力范围不一致。第二,代码还提供了数项声明未覆盖的重要功能,不只是实现细节,而是独立的用户可见能力:动态控制流节点、子流水线、执行回放/快照管理等。这些属于实质性扩展能力,而非单纯支撑实现。因此应标记为 description 与实际行为存在不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述的是一个大型编排系统的核心能力集合,而这段代码只覆盖其中非常狭窄的一部分:对子流水线定义文件做注册、查询和校验。代码没有执行任何流水线,也没有调度、多Agent协作控制、审批、可视化、Web/MCP接口等能力。虽然“子流水线注册表”可以被视为编排基础设施的一小部分,但与声明的主功能相比范围严重不符,属于明显的描述与实际行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

该代码的实际用途非常窄:它是一个“执行可视化生成器”,负责从现有状态 JSON 中读取数据并产出 Markdown 报告与 HTML 甘特图,还会汇总 token/费用信息。它不负责流水线编排、任务调度、状态管理、审批、模板、服务暴露或控制台等平台级能力。声明中虽然包含“执行报告生成、HTML甘特图可视化、成本实测化桥接”等内容,与代码部分吻合,但整体声明描述的是完整编排系统,而本代码块只是其中一个报告/可视化配套脚本。按“描述是否准确代表该代码块实际行为”标准,存在明显夸大与主用途不一致,因此应判定为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

声明描述的是一个大型多Agent编排系统的总体能力集合,而该代码块实际只是其中很窄的一部分:快照存储、查看、恢复、diff 和保留策略。虽然代码涉及执行恢复、下游节点重置以及快照对比,和声明中的“断点续传/历史对比”存在有限相关性,但并没有实现编排器核心能力(如 DAG 调度、审批节点、Web 控制台、模板库、MCP Server 等)。因此这是明显的描述与行为不匹配:代码的实际主目的比声明狭窄得多,且大多数宣称能力在该代码中不存在。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

声明描述的是一个范围很广的“多Agent流水线编排平台/基础设施”,而给定代码片段只是其中很小的一部分:状态恢复与快照恢复工具。它确实与声明中的“错误重断点续传、统一错误恢复命令”部分相关,但远不足以代表所声明的大多数核心能力。代码没有显示编排执行、模板、可视化、审批、Web/MCP 接口等功能,因此描述对该代码片段而言明显过度宽泛,不能准确代表其实际行为。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

该代码片段属于“状态持久化管理器”,是编排系统的一个子模块,而不是声明中描述的完整编排平台。它确实覆盖了部分声明能力的基础设施层面内容,如跨节点状态持久化、简单依赖驱动的下一节点选择、失败重置式断点续传、历史记录/最近执行对比,以及审批节点相关字段保存。但大量声明中的核心能力在本代码中并不存在:没有真正的DAG调度引擎、没有可视化、没有Web控制台、没有MCP Server、没有模板库、没有版本提醒、没有硬件自适应,也没有完整报告生成。虽然有少量与声明一致的支撑能力,但从“描述是否准确代表该代码块实际行为”来看,声明显著高估了该代码块的功能范围,因此应判定为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

该代码只覆盖声明中的一小部分:官方模板库(通过 templates 目录中的预置模板进行列举/展示/渲染)、依赖探测,以及 newbie 向导(init)。从实现看,它主要处理模板 JSON 文件和本地文件系统中的 skill 安装探测,输出 pipeline.json,属于“模板管理/脚手架”而非“编排器运行时”。声明把大量运行时编排能力都归于该技能描述,但这些能力在本代码中完全未出现。虽然描述末尾提到“脚本提供基础设施”,但当前给出的代码块仍不足以支撑大部分已声明功能,因此描述与代码行为存在实质性不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

存在明显不匹配。声明描述的是一个大型多Agent编排引擎,而实际代码块仅实现“版本更新提醒”中的一个辅助脚本。虽然声明里包含“版本更新提醒”这一项,因此该脚本本身不是恶意的未声明能力,但从‘描述是否准确代表该代码块实际行为’来看,这段代码的实际主功能与声明的主功能严重不同。代码只会读取本地文件并访问 GitHub 远程文件进行版本比较后输出提示,未显示任何编排引擎核心行为。因此应判定为描述与代码行为不一致。

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**条件表达式语法**(`scripts/condition_evaluator.py`):

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**条件表达式语法**(`scripts/condition_evaluator.py`):

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

模块头部 L15 声称“所有变更通过 CLI 命令触发”,暗示 Web 控制台不直接执行状态修改;然而 L381-L437 的 do_POST 实现直接加载状态、修改节点字段并调用 state_store.safe_write 写回磁盘。该文档描述与实际行为相矛盾,属于主动误导性质的 intent-code divergence。

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
96% confidence
Finding

The skill advertises commands and behaviors that imply file I/O, shell execution, environment inspection, and outbound network access, but it does not declare any explicit tool scope such as permissions or allowed-tools. This increases the risk of overbroad execution in host environments because reviewers and runtime policy layers cannot easily constrain what the skill is expected to use.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
99% confidence
Finding

The manifest description is entirely in Chinese and presents the skill behavior and user-facing framing in that language without indicating that other languages are supported or selectable. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale constraint is documented and justified.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

Several broad invocation examples make activation overly permissive and easy to confuse with ordinary user requests. Because this skill claims powerful orchestration and local system interaction, loose matching increases the chance of unintentional execution and privilege-bearing actions under ambiguous user intent.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The Web console is described as a 'read-only' service, but the same section documents an approval POST endpoint that changes pipeline state. This misclassification can cause administrators to expose or trust the dashboard under weaker controls than a state-mutating service warrants, increasing the risk of unauthorized workflow approval or denial if the token or localhost boundary is bypassed.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

Using a very broad trigger phrase like '开始' can unintentionally activate the skill during unrelated conversations. In a skill that advertises shell, file, network, dashboard, and orchestration behaviors, accidental invocation can lead to unintended state changes, file writes, or outbound requests in contexts where the user did not intend to run automation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This markdown file is natural-language documentation, and its content consistently uses Chinese throughout. Under the policy rule for language or locale constraints, forcing a specific language without user opt-in or documented justification is a policy concern.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation claims that AI will automatically mask sensitive fields during execution, but the skill description also says the scripts only provide infrastructure and AI acts as the orchestrator. That creates a dangerous false assurance: users may place sensitive data into the pipeline assuming automatic redaction exists, leading to secrets or personal data being stored in state files, output files, logs, or downstream prompts without protection.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

This markdown file contains all operational instructions in Chinese and does not indicate that users may choose another language or that the protocol is intentionally limited to a Chinese-speaking context. That creates a natural-language policy concern because it effectively forces a specific language without user opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This code file contains extensive natural-language instructions, safety notes, error messages, and CLI help entirely in Chinese. Under the policy, forcing a specific language without user opt-in is a locale-policy violation unless the restriction is explicitly justified, which is not stated here.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

安全说明明确宣称“禁止函数调用”,但实现实际允许一批白名单函数和正则函数调用。这种文档与实现不一致会导致使用方错误设定信任边界,尤其在编排引擎场景下,调用方可能把该组件当作更严格的沙箱使用,从而低估可触发的计算、字符串处理和正则匹配能力。

Content

No source excerpt is available for this finding.