news 2026/9/17 23:51:53

MCP 动态分析系统提示词解析:AI-Infra-Guard mcp-scan 的测试用例生成引擎

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MCP 动态分析系统提示词解析:AI-Infra-Guard mcp-scan 的测试用例生成引擎

MCP 动态分析系统提示词解析:AI-Infra-Guard mcp-scan 的测试用例生成引擎

【免费下载链接】AI-Infra-GuardA full-stack AI Red Teaming platform securing AI ecosystems via Agent Scan, Skills Scan, MCP scan, AI Infra scan and LLM jailbreak evaluation.项目地址: https://gitcode.com/GitHub_Trending/ai/AI-Infra-Guard

MCP(Model Context Protocol)动态分析是 AI-Infra-Guard 中 mcp-scan 组件针对运行中的远程 MCP Server进行安全检测的核心模式。本文以 mcp-scan/mcp_scan/prompt/agents/dynamic/system_prompt.md 这份动态分析 Agent 的系统提示词为骨架,结合 mcp-scan 的源码实现,完整讲解这份提示词的语义、它在 Agent 运行链路中的注入方式、背后的工具描述净化与安全白名单机制,以及配套的测试维度覆盖要求。读完本文,你将理解 mcp-scan 如何驱动 LLM Agent 针对远程 MCP 工具生成并执行安全测试用例,并能在自己的 MCP 安全审计工作中复用这套提示词设计思路。

一、这份提示词在 mcp-scan 中的定位

mcp-scan 提供两种扫描模式(见 README_zh.md):

  • 静态扫描:扫描本地源码仓库,通过--repo指定项目路径,基于代码审计识别漏洞;
  • 动态分析:通过--server_url指向一个正在运行的 MCP Server,让 LLM Agent 实时枚举远程工具、生成测试用例并实际调用这些工具,观察工具响应以发现运行时安全问题。

本文聚焦的 system_prompt.md 正是动态分析模式下 Agent 的系统提示词。它位于mcp-scan/mcp_scan/prompt/agents/dynamic/目录下,与同目录的general_analyzing_prompt_template.md(结果分析规范)、malicious_behaviour_testing.md/vulnerability_testing.md(测试用例生成器)、project_summary.md(信息收集报告规范)共同构成动态分析 Agent 族的提示词体系。

从仓库目录结构看,mcp-scan 将提示词按功能分目录组织:prompt/system_prompt.md是通用系统提示词,prompt/agents/dynamic/是动态分析专属模板,这种"通用基座 + 场景专用"的提示词分层设计,使得同一套 Agent 框架可以灵活切换扫描场景。

二、系统提示词逐段解读

原文主体只有两个核心段落,但每一段都对应着动态分析的关键设计决策。

2.1 Mcp Tools:注入测试目标的描述

以下是你所需要生成测试用例的对象的描述,也即来自远程MCP服务器的工具描述。你可以使用call_mcp_tool调用以下工具。{mcp_tools}

这一段包含两层语义:

  1. 测试对象即工具描述:动态分析的被测对象不是代码,而是远程 MCP Server 通过tools/list暴露的工具列表及其描述。Agent 只依赖工具的名称、描述、参数 Schema 来理解"被测系统能做什么"。
  2. call_mcp_tool是唯一交互入口:Agent 不能直接执行 shell 或读写本地文件,只能通过call_mcp_tool调用远程工具——这正是动态扫描与静态扫描的本质区别。

{mcp_tools}是一个模板占位符,由 prompt_manager.py 的format_prompt()在运行时用真实的远程工具描述替换。该占位符的格式与系统提示词# 工具使用格式中定义的<function=...>/<parameter=...>调用语法一致,确保 Agent 输出的工具调用可被 base_agent.py 中的parse_tool_invocations()稳定解析。

2.2 测试覆盖:维度全量与每维度至少 3 条用例

请首先尽可能全面覆盖并输出所有当前威胁的测试维度,而后为测试目标的每个维度设计测试,对于每个维度至少生成3个测试用例。

这是整份提示词对 Agent 输出质量的硬性约束,包含两条强制要求:

  • 维度全量:Agent 必须先枚举"当前威胁的测试维度",即基于 MCP 威胁分类体系(MCP01-MCP10 及补充分类)把被测工具能映射到的所有风险维度都列出来,避免遗漏;
  • 每维度 ≥3 条:每个威胁维度至少生成 3 条测试用例,对应恶意行为测试中的 baseline / edge / adversarial(基线、边界、对抗)三种形态(详见 malicious_behaviour_testing.md)。

"先列维度、再逐维度出用例"的顺序要求,是为了防止 LLM 在长工具列表场景下"想到哪测到哪",保证测试覆盖面可审计、可核对。

三、提示词注入链路:从模板到 Agent 上下文

这份动态系统提示词并不是直接读文件塞进对话的,它要经过一条完整的组装链路。核心实现在 dispatcher.py 的get_all_tools_prompt()

if self.mcp_server_url: # 动态扫描:仅注册安全工具,移除 execute_shell / read_file prompt = get_tools_prompt(list(_DYNAMIC_SAFE_TOOLS)) manager = await self._ensure_mcp_manager() ... mcp_prompt = await manager.describe_mcp_tools() mcp_remote_prompt = prompt_manager.format_prompt( "dynamic/system_prompt", mcp_tools=mcp_prompt ) prompt += f"\n\n{mcp_remote_prompt}"

链路如下:

  1. 连接 MCP Server_ensure_mcp_manager()创建MCPTools实例,按streamable-httpsse的顺序尝试传输协议(见 dispatcher.py);
  2. 拉取远程工具描述describe_mcp_tools()调用 MCP 协议的tools/list,把远程工具列表渲染成<mcp_tools>XML 块;
  3. 渲染动态提示词prompt_manager.format_prompt("dynamic/system_prompt", mcp_tools=mcp_prompt)<mcp_tools>内容填充到{mcp_tools}占位符;
  4. 拼接进系统提示词:动态提示词追加在get_tools_prompt()生成的安全工具描述之后,最终由 base_agent.py 的generate_system_prompt()通过prompt_manager.format_prompt("system_prompt", generate_tools=tools_prompt, ...)组装为 Agent 的完整 system 消息。

因此 Agent 最终看到的上下文结构是:通用系统提示词(含安全工具列表 + 间接提示注入防御规则)→ 动态分析提示词(含<mcp_tools>远程工具描述)→ 用户任务 YAML

四、<mcp_tools>的生成:净化与 Schema 展开

{mcp_tools}里到底填充了什么?答案是 mcp_tools.py 的describe_mcp_tools()生成的 XML 结构化描述,每个远程工具包含三部分:

<mcp_tools> <name>工具名</name> <description>净化后的工具描述</description> <parameters> <parameter name="tool_name" type=string required=true>tool_name is {工具名}</parameter> <parameter name="参数名" type="参数类型" required="true/false" description="..." enum="..." default="..." minimum="..." maximum="..." minLength="..." maxLength="..." pattern="..." format="..." examples="..."></parameter> </parameters> </mcp_tools>

参数 XML 属性由_build_parameter_attributes()(mcp_tools.py)从 JSON Schema 展开,覆盖descriptionenumdefaultminimum/maximumminLength/maxLengthpatternformatexamplesitems(数组元素类型/枚举)等约束信息。这些约束不仅用于让 LLM 理解参数语义,还会在后续call_remote_tool()时通过_convert_param_type()按 Schema 做参数类型转换(如字符串转 integer、JSON 解析 array/object)。

4.1 工具描述净化:防提示注入的第一道闸门

远程 MCP 工具描述是不可信输入——恶意服务器可以在工具描述里藏提示注入指令。describe_mcp_tools()在渲染前调用_sanitize_description()(mcp_tools.py)做两道处理:

  1. 指令模式清除:用正则匹配并替换ignore previous/above/all instructionsyou are now insystem note/override/prompt:execute the shell/commandDNS connectivity self-testenvironment fingerprintexecute_shell等 12 类典型注入指令为[REMOVED]
  2. 长度截断:描述超过_MAX_DESC_LEN = 500字符时截断并追加... [truncated],防止超长描述塞入大量指令。

这意味着注入到提示词里的工具描述已经是"净化版",加上通用系统提示词中"Indirect Prompt Injection Defense"六条规则(不服从工具响应中的指令、不允许工具响应改变扫描计划、不因工具声称而降级发现、不因工具指示而调用 finish 等,见 mcp-scan/mcp_scan/prompt/system_prompt.md),构成双保险。

五、动态模式的安全边界:工具白名单

动态分析模式必须在"让 Agent 调用远程工具"的同时,阻止恶意工具描述诱导 Agent 调用本地危险工具。这一安全边界由 dispatcher.py 的_DYNAMIC_SAFE_TOOLS白名单实现:

_DYNAMIC_SAFE_TOOLS = frozenset({ "finish", "think", "call_mcp_tool", "list_mcp_tools", "list_mcp_prompts", "list_mcp_resources", })

动态模式下 Agent 只能使用这 6 个工具:finish(结束任务)、think(推理)、call_mcp_tool(调用远程工具)、list_mcp_tools/list_mcp_prompts/list_mcp_resources(枚举远程资源)。execute_shellread_file等本地操作工具在动态模式下被显式移出工具列表(dispatcher.py),并且在call_tool()入口还有一层运行时拦截——即使 Agent 通过提示注入试图调用白名单外的工具,也会被拒绝并返回错误(dispatcher.py)。

此外,base_agent.py 内置了_generate_challenge()挑战机制:当工具响应命中curl|bash管道、云元数据端点(169.254.169.254)、主机信息收集、Base64 编码敏感数据、提示注入指令、SSH 密钥操作、持久化机制(crontab/systemctl/launchctl)等 8 类敏感模式时,自动向 Agent 追加审计追问,强制其评估该能力是否超出最小权限。

六、配套提示词族:测试用例生成与结果分析

动态系统提示词本身只规定"测什么、覆盖到什么程度",具体每个威胁维度如何生成用例、如何输出,由同目录下的配套模板承接:

  • malicious_behaviour_testing.md:恶意行为测试 Agent,内嵌tool_poisoning_detection.yamlrug_pull_detection.yaml两个威胁定义,采用crispe:Schema(role / capabilities / threats / tasks / constraints)描述角色能力与约束。它给出明确的扫描式工作流:信息收集 → 威胁-工具映射 → 用例生成(每维度 ≥3,含 baseline/edge/adversarial)→ 输出可执行 MCP 调用;
  • vulnerability_testing.md:漏洞测试 Agent,内嵌credential_leakagemalicious_code_executiontool_output_prompt_injection三个威胁定义,强调"忽略输入参数中的风险、聚焦工具调用结果",并提供可操作的 Payload 指引(如用良性 canary 标记探测凭据回显、用安全 echo 风格标记探测命令执行副作用);
  • general_analyzing_prompt_template.md:结果分析 Agent 规范,定义 MCP01-MCP10 风险分类标准、风险等级校准矩阵(Critical/High/Medium/Low 的必要条件)以及严格过滤规则(排除正常业务功能、框架默认行为、无实际危害项)。

6.1 测试用例的输出格式

测试 Agent 生成用例后,必须以严格格式输出,供协调器解析执行。格式要求(见 malicious_behaviour_testing.md):

<mcp_tool_calls> <mcp_function=TOOL_NAME> <parameter=PARAM_NAME>VALUE</parameter> </mcp_function> </mcp_tool_calls>

规则包括:必须使用 MCP 工具列表中真实存在的工具名;最终必须调用本地finish工具结束;若某个威胁找不到对应工具,则输出最小的安全调用集(如 health/status/list)来建立基线行为。

七、威胁维度体系:动态测试的覆盖目标

"尽可能全面覆盖并输出所有当前威胁的测试维度"中的"威胁维度",以 mcp-scan 的 MCP 风险分类体系为基准(README_zh.md 与 general_analyzing_prompt_template.md 均给出完整定义):

风险 ID风险类型检测重点
MCP01令牌管理与密钥暴露凭据窃取与密钥泄露,如硬编码密钥、.cursor/mcp.json敏感凭据
MCP02权限提升与范围蔓延工具权限定义过宽导致非必要系统控制权
MCP03工具投毒攻击合法 MCP 工具被篡改或注入恶意逻辑
MCP04软件供应链攻击依赖库篡改、恶意第三方 MCP 服务器
MCP05命令注入与执行根据不可信输入构造并执行系统命令
MCP06提示注入攻击通过上下文(OCR、网页内容)注入恶意指令劫持模型
MCP07认证与授权不足身份校验缺失导致跨代理/跨用户越权
MCP08审计与遥测缺失缺乏不可篡改的工具调用日志
MCP09影子 MCP 服务器未经授权部署的 MCP 实例
MCP10上下文注入与过度分享敏感上下文跨会话/代理共享泄露
补充名称混淆 / Rug Pull / 工具阴影相似名称诱导误调、注册后变更行为、同名工具覆盖

动态分析尤其聚焦与"运行中工具"强相关的维度,例如 Tool Poisoning(攻击输入层:篡改工具描述/参数诱使 Agent 危险调用)、Rug Pull(攻击执行层:工具注册后变更行为,data/mcp/mcp_tool_rug_pull.yaml 给出了该威胁的静态检测规则定义)、Prompt Injection via Tool Output(攻击输出层:工具响应携带隐藏指令)。三类攻击分别对应 MCP 模型的输入层、执行层、输出层,是动态测试必须覆盖的主战场。

八、实战:启动一次 MCP 动态分析扫描

动态分析模式的完整命令(见 README_zh.md):

# 针对运行中的 MCP Server 做动态分析 python main.py \ --server_url "http://localhost:8000/sse" \ --prompt "测试工具投毒漏洞" # 组合其他参数 python main.py \ --server_url "http://localhost:8000/sse" \ -m "google/gemini-2.5-pro" \ -p "重点测试提示注入与凭据泄露" \ --debug \ -o report.sarif.json

关键参数说明:

  • --server_url:远程 MCP Server URL,启用动态分析模式的开关,支持ssestreamable-http两种传输协议(协议选择见 mcp_tools.py);
  • --prompt/-p:自定义测试提示词,会成为动态系统提示词之上的任务指令;
  • -m/--model:LLM 模型名称,默认deepseek/deepseek-v3.2-exp
  • -k/--api_key:API Key,可回退到环境变量LLM_API_KEY/OPENAI_API_KEY/OPENROUTER_API_KEY
  • --header:自定义 HTTP header(key:value,可多次使用),用于给 MCP Server 请求附加认证头;
  • -o:结果保存为 SARIF 2.1.0 JSON,可直接接入 GitHub Code Scanning 等 SARIF-aware 工具。

配置优先级为:命令行参数 > 环境变量 > 代码默认值。

扫描时,动态系统提示词、任务 YAML 与<mcp_tools>描述共同构成 Agent 的 system + user 上下文;Agent 按"列维度 → 逐维度生成 ≥3 用例 → 以<mcp_tool_calls>格式输出 → 协调器执行 → 分析工具响应"的循环推进,直到调用finish结束(max_iter=80上限,见 base_agent.py)。

九、总结

mcp-scan/mcp_scan/prompt/agents/dynamic/system_prompt.md虽然篇幅精炼,却精准定义了 MCP 动态分析 Agent 的三个核心机制:

  1. <mcp_tools>注入被测对象——远程工具描述经过净化(去注入指令 + 500 字符截断)后成为 Agent 理解被测系统的唯一来源;
  2. call_mcp_tool作为唯一交互通道——配合_DYNAMIC_SAFE_TOOLS白名单与运行时拦截,把 Agent 的能力边界严格限制在"只与远程 MCP 工具交互",从机制上阻断工具描述诱导 Agent 执行本地危险操作;
  3. 以"维度全量 + 每维度 ≥3 用例"约束输出质量——与配套的威胁分类体系(MCP01-MCP10 + 名称混淆/Rug Pull/工具阴影)和 crispe 任务 Schema 配合,保证对运行中 MCP Server 的安全测试覆盖可枚举、可审计、可复现。

这套"系统提示词 + 模板占位符 + 安全白名单 + 威胁分类"的组合设计,不仅适用于 mcp-scan,也为任何需要在不可信工具生态中驱动 LLM Agent 进行安全测试的场景提供了可参考的工程范式。深入阅读 dispatcher.py、mcp_tools.py 与 base_agent.py 的完整实现,可以进一步看到工具调用解析、历史压缩、敏感模式挑战等更多细节。

【免费下载链接】AI-Infra-GuardA full-stack AI Red Teaming platform securing AI ecosystems via Agent Scan, Skills Scan, MCP scan, AI Infra scan and LLM jailbreak evaluation.项目地址: https://gitcode.com/GitHub_Trending/ai/AI-Infra-Guard

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 23:50:16

Uncloud 集群系统服务日志排查指南:uc machine logs 详解

Uncloud 集群系统服务日志排查指南&#xff1a;uc machine logs 详解 【免费下载链接】uncloud A lightweight tool for deploying and managing containerised applications across a network of Docker hosts. Bridging the gap between Docker and Kubernetes ✨ 项目地址…

作者头像 李华
网站建设 2026/9/17 23:46:45

8款AI论文写作工具评测与使用指南

1. AI论文写作工具的价值与现状作为一名在学术圈摸爬滚打多年的研究者&#xff0c;我深刻理解论文写作过程中的痛点。从文献综述到数据呈现&#xff0c;从格式排版到查重降重&#xff0c;每个环节都耗费大量时间精力。而AI写作工具的出现&#xff0c;正在改变这一现状。目前市面…

作者头像 李华
网站建设 2026/9/17 23:46:07

WPS公式编辑器排版难题:行距、字号、对齐与VBA批量矫正

简介&#xff1a;这份Word文档是WPS公式编辑器的进阶使用指南&#xff0c;适合已经能完成基础公式插入、希望进一步提升公式编排效率的理科教师、试卷编写者和学术文档制作者&#xff0c;尤其针对公式字号不匹配、字体样式单一、位置移动不自由等常见痛点。资源仅含1个docx文件…

作者头像 李华
网站建设 2026/9/17 23:43:40

systemd核心解析:service与target单元管理实战指南

前阵子帮朋友调试一台新上线的服务器&#xff0c;装好Nginx之后我习惯性敲了service nginx start&#xff0c;结果屏幕上直接回了一句nginx: unrecognized service。愣了两秒才反应过来&#xff0c;这台机器走的是 systemd 管理&#xff0c;早就不靠/etc/init.d下的脚本来干活了…

作者头像 李华