上下文注入器
用于测试语义检查引擎效能的联合MCP客户端和服务器框架。
目的
作为一名狂热的读者,我想找到一种方法将我的GoodReads数据暴露给法学硕士,以获得符合我口味的书籍推荐。
作为一名安全迷,我希望能够将恶意上下文注入到这些数据中。因此,我构建了这个轻量级的MCP演示服务器和客户端,它公开了Goodreads/RSS数据,并演示了常见的集成和攻击场景(用于学习和测试)。
此设置不需要LLM,也不相关。此设置纯粹用于测试来自互联网上恶意MCP服务器的攻击企图。根据现实世界中LLM和MCP客户端的幼稚程度,这些攻击可能会成功或失败。我只是想知道内联代理/网关是否会使用互联网和MCP客户端之间的语义检查来捕获攻击。
这个项目是一个基于MCP的服务的小型演示,该服务获取和公开与书籍相关的数据(通过RSS/Goodreads集成),包括日志记录,并包含攻击向量的示例。对我来说,主要的驱动力是测试语义检查代理的有效性。
特性
该项目包括客户端和服务器。攻击类型可以在任何一侧选择,在服务器上通过在启动时设置攻击配置文件来选择,和/或在客户端上通过在请求时设置来选择。
服务器上存在用于检索合法数据的工具,也可以用于攻击类型的控制平面配置(如下所列)。
这意味着客户端可以天真地向服务器发送请求,服务器在启动时配置了特定的攻击配置,或者客户端可以在请求中设置/覆盖服务器设置。
元数据用于跟踪双方的请求以及启用了哪些攻击。
提供的 scripts/run_attack_matrix.sh 将运行所有攻击组合,并生成一份关于被阻止或允许的内容的报告。
先决条件
- Python 3.13或更新版本(参见
pyproject.toml) - 推荐:使用
uv以及虚拟环境
安装
- 创建并激活虚拟环境(建议:
uv):
uv venv .venv
source .venv/bin/activate- 在可编辑模式下安装项目(从安装依赖项
pyproject.toml):
uv pip install -e .或者,如果您不使用 uv:
python -m venv .venv
source .venv/bin/activate
python -m pip install -e .如果您更喜欢手动安装依赖项:
python -m pip install fastmcp feedparser python-dotenv配置
示例 .env:
# OpenAI / LLM key (optional)
OPENAI_API_KEY=your-openai-api-key
# Goodreads settings
# Optional: if GOODREADS_USER_ID is unset, the server falls back to a built-in default.
GOODREADS_USER_ID=182366515
GOODREADS_USER_AGENT=ContextInjector/1.0
GOODREADS_HTTP_TIMEOUT_SECONDS=10
# MCP server configuration
MCP_HOST=0.0.0.0
MCP_PORT=3333
MCP_HTTP_PATH=/mcp
# Logging
LOG_LEVEL=INFO用法
- 运行服务器:
python server.py- 运行客户端:
python client.py探索 attacks/ 和 models/ 查看示例组件和演示代码。
攻击概况
配置文件模拟嵌入在工具输出中的真实恶意内容,或者可选地作为工具输出的完全替代品发送回来(attack-only).
- 按请求配置文件覆盖:
fetch_shelf_rss接受profile_id(数字)和可选attack_only(布尔)。
这避免了通过代理发送配置文件名称,这可能会使语义检查引擎跳闸。
baseline:正常含量;没有注入攻击文本。
prompt_injection:嵌入式系统覆盖摘要中的指令。
mixed_content:带有隐藏指令覆盖的合理内容。
tool_coercion:试图强迫客户调用危险工具。
data_exfiltration:请求机密、内部配置和先前的工具输出。
oversized_payload:向油田注入大量有效载荷,以测试尺寸限制和截断。
high_entropy:注入高熵base64数据以测试熵或类似二进制的有效载荷处理。
schema_confusion:结构化结果中存在错误的类型和意外项,无法测试模式验证。
assistant_impersonation:模拟先前助手输出以测试权限混淆的内容。
role_confusion:在内容中嵌入SYSTEM/DEVELOPER标头,以测试角色边界强制执行。
delayed_instruction:延迟指令意味着在以后的用户查询中触发。
obfuscated_injection:用于测试规范化的隐藏/模糊指令(零宽度/HTML注释)。
tool_args_smuggling:工具调用JSON嵌入到内容中,以测试工具门控。
data_poisoning:微妙的推荐偏差指令,用于测试语义操纵。
context_stuffing:重复短语以测试重复的偏见。
sampling_override:尝试覆盖客户端采样参数并请求多个候选者。
elicitation_probe:旨在引出隐藏提示或凭证的探究性问题。
logging_tamper:尝试禁用或编辑客户端日志记录/审计跟踪。
配置文件ID(用于 profile_id 和控制平面工具):
0:基线1:prompt_injection2:tool_coercion3:data_exfiltering4:尺寸过大_有效载荷5:高营养6:schema_coundation7:混合内容8:助理_模仿9:角色_融合10:指令延迟11:混淆注入12:tool_args_走私13:数据中毒14:上下文填充15:采样_覆盖16:启发17:记录电流
命令行参数
服务器(server.py):
--host:要绑定的主机(默认0.0.0.0或MCP_HOSTenv)--port:要监听的端口(默认3333或MCP_PORTenv)--path:MCP端点的HTTP路径(默认/mcp或MCP_HTTP_PATHenv)--profile:攻击配置文件名称(默认prompt_injection或ATTACK_PROFILEenv)。仅服务器端。--inject/--no-inject:细粒度启用/禁用注入--inject-max-items:每个响应注入的最大项目数(默认值2)--single-field:每个输出只注入一个字段(默认值,或ATTACK_SINGLE_FIELD=1)--multi-field:向每个输出的所有启用字段注入--attack-only:仅返回攻击内容(剥离真实Goodreads数据)。也可以通过以下方式设置ATTACK_ONLY=1--disable-control-plane-tools:禁用控制平面工具注册
TLS/HTTPS选项(可选):
--https:使用提供的证书和密钥启用HTTPS--cert:TLS证书文件(PEM)的路径。也可以通过以下方式设置TLS_CERT.--key:TLS私钥文件(PEM)的路径。也可以通过以下方式设置TLS_KEY.--client-ca:用于客户端证书验证的可选CA包(PEM)。也可以通过以下方式设置TLS_CLIENT_CA.
客户(client.py):
--url:MCP端点URL(默认http://127.0.0.1:3333/mcp)--http2:启用HTTP/2--timeout:请求超时秒数(默认值20.0)--insecure:禁用TLS验证--profile-id:作为工具arg传递的数字配置文件id(代理安全)--attack-only:仅请求攻击工具输出(按请求覆盖)--tool:要调用的工具名称(默认fetch_shelf_rss)--shelf:默认工具参数使用的工具架名称(默认read)--limit:默认工具参数的限制(默认20)--tool-args:用作工具参数的原始JSON字符串(重写--shelf/--limit)
控制平面工具(仅限ID)
控制平面工具I/O使用数字ID来指示攻击配置文件,以避免通过线路发送配置文件名称并触发语义代理引擎:
list_attack_profiles返回配置文件ID和默认ID。get_attack_profile回报profile_id.set_attack_profile接受profile_id.set_injection_scope接受single_field_per_output(布尔)。
注射反应包括 server_note.meta.attack_profile_id (数字)。
项目布局
server.py--MCP服务器入口点示例client.py--简单客户端/演示运行器models/--应用程序模型和客户端attacks/--攻击模块(例如注入)logutils/--日志格式化程序tools/--工具实现
