DSCmatter/Agentic_Firewall

GitHub: DSCmatter/Agentic_Firewall

面向 MCP 应用的运行时安全中间件,通过拦截代理实现工具调用最小权限管控、会话身份锁定、输出泄露检测与自动熔断,并附带 OWASP ASI 红队基准测试套件。

Stars: 2 | Forks: 1

# Agentic Firewall v2 **MCP 策略网关与独立的 OWASP 红队安全基准测试** 受 [Anthropic 的安全研究](https://www.anthropic.com/news/disrupting-AI-espionage) 启发 ## 问题背景 最近的安全研究揭示了 AI 编程环境中的一个严重漏洞:当自主 AI agent 连接到未经验证的工具并在没有人工监督的情况下执行请求时,它们可能会受到攻击。这种攻击之所以能够成功,是因为在执行之前缺乏用于验证意图的治理层。 ## 解决方案 Agentic Firewall v2 是一个运行时安全中间件和红队基准测试套件,旨在保护 Model Context Protocol (MCP) 应用。它充当 MCP 客户端(AI agent)与任何 MCP 服务器之间的拦截代理——执行最小权限工具策略、锁定会话身份、输出防护金丝雀扫描以及基于计数器的熔断器。 ## 为何这很重要 在 AI agent 变得越来越自主的时代,安全性绝不能事后才考虑。Agentic Firewall 提供了安全利用 AI 辅助而不牺牲控制权所需的治理层——验证每一次工具调用、记录每一个决策,并暂停表现出恶意行为的会话。 ## 1. 系统架构 网关充当 MCP 客户端 (Agent) 与 MCP 服务器之间的拦截代理。它拦截并过滤 `tools/call` JSON-RPC 请求,同时安全地放行其他消息(如 `initialize` 等)。 ``` ┌────────────────────────────────────────────────────────────────┐ │ MCP Client (AI Agent) │ └───────────┬──────────────────────────────────────▲────────────┘ │ 1. GET /sse?identity=alice │ 4. SSE endpoint URL ▼ │ ┌───────────────────────────────────────────────────────────────┐ │ POLICY GATEWAY │ │ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ → Pinned Session Identity Verification │ │ │ │ → Pydantic Policy Engine (per-identity allow-list) │ │ │ │ → Argument Constraint Enforcement (sandbox paths etc.) │ │ │ │ → Output Guard Canary Scanner (data egress detection) │ │ │ │ → Counter-Based Circuit Breaker (session suspension) │ │ │ └─────────────────────────────────────────────────────────┘ │ │ ↓ AUDIT LOG ↓ │ │ src/gateway/gateway_audit.log (JSONL) │ └───────────┬──────────────────────────────────────▲────────────┘ │ 2. GET /sse (proxied session) │ 3. SSE endpoint info ▼ │ ┌────────────────────────────────────────────────────────────────┐ │ TOY MCP SERVER (deliberate footguns) │ │ shell exec · file read/write · outbound HTTP │ └────────────────────────────────────────────────────────────────┘ ``` ### 核心防护层 1. **最小权限 Pydantic 策略**:根据严格的 `identity -> allowed_tools -> arg_constraints` schema 评估传入的工具请求。越界路径或未允许的工具会被立即拦截。 2. **锁定会话身份验证**:将在会话启动时(`GET /sse`)验证的身份绑定到该 session ID 上的所有传入 POST 命令,完全消除会话身份污染和参数篡改攻击。 3. **出站输出防护金丝雀扫描器**:扫描所有工具响应文本中是否存在敏感的金丝雀模式——例如 Linux 影子数据库、私有 SSH 密钥、云 token 和系统 INI 文件——在代理层面拦截泄露。 4. **有状态熔断器**:追踪每个会话的安全标记。如果某个会话连续 3 次触发输出防护,网关将暂停该会话并拒绝所有后续执行请求。 5. **JSON Lines 审计日志**:以结构化的 JSON Lines 格式将每个执行步骤、请求详情和安全决策记录到 `src/gateway/gateway_audit.log`。 ## 2. 目录结构 代码库被组织为模块化、清晰的目录结构: ``` src/ gateway/ mcp_gateway.py # FastAPI Gateway Server (HTTP/SSE proxy) policy_v2.json # Pydantic Policy Schemes Configuration toy_server/ toy_server.py # Target MCP Vulnerability Testbed Server benchmarking/ attack_harness.py # Red-Team OWASP benchmark runner benchmark_governor.py # Legacy benchmark bench_results.json # Legacy benchmark results cache security/ policy_engine.py # Pydantic Policy Enforcement Engine output_guard.py # Canary scanner output filter tests/ test_gateway.py # Gateway integration tests test_output_guard.py # Output guard unit tests test_policy.py # Policy unit tests test_proxy.py # Gateway-to-Backend proxy tests legacy/ mcp_governor.py # Legacy Phase 0 controller policy.json # Legacy Phase 0 policy test.py # Legacy Phase 0 test script ``` ## 3. OWASP ASI 红队基准测试结果 该网关在一个独立的红队测试套件中进行了评估,该套件执行了 **17 个攻击场景**,映射到 OWASP 针对 Agentic 应用的 Top 10(发布于 2025 年 12 月)。该基准测试将独立服务器性能(Baseline)与受网关保护的执行进行了对比。 **评分表:** | OWASP 类别 | 攻击 ID | 描述 | 独立运行 (Baseline) | 网关 (受保护) | 结果 | |---|---|---|---|---|---| | **ASI02:工具误用** | 1 | 通过 `read_file` 进行绝对路径遍历 | 利用成功 | 已拦截 | PASS | | **ASI02:工具误用** | 2 | 通过 `read_file` 进行相对路径遍历 | 利用成功 | 已拦截 | PASS | | **ASI02:工具误用** | 3 | 通过 `write_file` 进行未授权文件修改 | 利用成功 | 已拦截 | PASS | | **ASI02:工具误用** | 4 | 针对 `query_database` 的 SQL 注入 | 利用成功 | 已拦截 | PASS | | **ASI03:权限滥用** | 5 | Bob 尝试运行 `execute_command` | 利用成功 | 已拦截 | PASS | | **ASI03:权限滥用** | 6 | 未注册身份 charlie 调用 `read_file` | 利用成功 | 已拦截 | PASS | | **ASI04:供应链与 SSRF** | 7 | 通过 `fetch_url` 进行 SSRF / 云元数据泄露 | 已拦截 | 已拦截 | PASS | | **ASI04:供应链与 SSRF** | 8 | 通过 `fetch_url` 进行外部数据渗出 | 利用成功 | 已拦截 | PASS | | **ASI05:意外代码执行** | 9 | 通过 `execute_command` 进行命令 Shell 注入 | 利用成功 | 已拦截 | PASS | | **ASI05:意外代码执行** | 10 | 通过 `execute_command` 进行命令链式执行 | 利用成功 | 已拦截 | PASS | | **ASI05:意外代码执行** | 11 | 通过 `execute_command` 执行已植入的脚本 | 利用成功 | 已拦截 | PASS | | **ASI06:上下文投毒** | 12 | 间接 Prompt 注入 - 文件包含金丝雀 | 利用成功 | 已拦截 | PASS | | **ASI06:上下文投毒** | 13 | 间接 Prompt 注入 - SSRF 包含金丝雀 | 利用成功 | 已拦截 | PASS | | **ASI06:上下文投毒** | 14 | 间接 Prompt 注入 - 数据库包含金丝雀 | 利用成功 | 已拦截 | PASS | | **ASI10:恶意 Agent** | 15 | 触发 3 次标记后的熔断暂停 | 利用成功 | 已拦截 | PASS | | **ASI10:恶意 Agent** | 16 | 未授权泛洪锁定 | 利用成功 | 已拦截 | PASS | | **ASI10:恶意 Agent** | 17 | 会话身份污染检查 | 利用成功 | 已拦截 | PASS | **综合评分:捕获 17/17 次攻击 (100%)** ## 4. 已知局限性 Agentic Firewall v2 专注于系统级工具执行边界和数据外发保护。它不针对以下 OWASP 类别进行防御: * **ASI01:目标劫持**:推理层操纵(例如复杂的思维链劫持)必须通过 LLM 系统提示词工程、上下文修剪或模型侧评估来缓解,而不是通过代理网关。 * **ASI07:Agent 间通信**:该网关严格限定于单 Agent 到服务器的拓扑结构。它不验证或拦截协作式 Agent 间消息的有效载荷。 * **ASI08:级联故障**:防御链式 Agent 操作故障需要跨越状态边界的事务回滚,这超出了防火墙的范围。 * **ASI09:人机信任利用**:针对人类用户的欺骗性 Agent 行为属于客户端 UI 设计约束的范畴。 ## 5. 入门指南 ### 安装说明 克隆代码仓库并使用 `uv`(推荐)安装依赖: ``` uv venv .venv\Scripts\activate uv pip install fastapi uvicorn pydantic httpx pytest pytest-asyncio anyio ``` ### 运行测试 执行测试套件: ``` $env:PYTHONPATH=".;src" uv run pytest src ``` ### 运行红队基准测试 运行 OWASP 攻击测试套件,比较基线和受保护服务器: ``` # PowerShell $env:PYTHONPATH=".;src" uv run src/benchmarking/attack_harness.py # Git Bash PYTHONPATH=".;src" uv run src/benchmarking/attack_harness.py ``` ## 6. 手动测试与验证 您可以使用标准的命令行客户端或官方的 MCP Inspector 手动检查代理路由、路径遍历拦截和会话污染防护。 ### 场景启动 启动目标漏洞测试平台和策略网关: 1. **启动 Toy Server(终端 1)**: * *PowerShell*:`$env:PYTHONPATH=".;src"; uv run uvicorn src.toy_server.toy_server:app --port 8000` * *Git Bash*:`PYTHONPATH=".;src" uv run uvicorn src.toy_server.toy_server:app --port 8000` 2. **启动网关服务器(终端 2)**: * *PowerShell*:`$env:PYTHONPATH=".;src"; $env:FW_REAL_SERVER_URL="http://127.0.0.1:8000"; uv run uvicorn src.gateway.mcp_gateway:app --port 8001` * *Git Bash*:`PYTHONPATH=".;src" FW_REAL_SERVER_URL="http://127.0.0.1:8000" uv run uvicorn src.gateway.mcp_gateway:app --port 8001` ### 选项 A:通过 Git Bash 命令行进行测试 在一个窗口中打开客户端会话流,在另一个窗口中发送请求: 1. **打开 SSE 客户端连接(终端 3)**: curl "http://127.0.0.1:8001/sse?identity=alice&session_id=session_abc" 2. **执行工具调用(终端 4)**: * **场景 1:授权的文件读取(允许)**: curl -X POST "http://127.0.0.1:8001/message?session_id=session_abc&identity=alice" -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "read_file", "arguments": {"path": "src/gateway/policy_v2.json"}}}' * **场景 2:路径遍历(拦截)**: curl -X POST "http://127.0.0.1:8001/message?session_id=session_abc&identity=alice" -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": {"name": "read_file", "arguments": {"path": "C:\\Windows\\win.ini"}}}' * **场景 3:会话身份污染(拦截)**: curl -X POST "http://127.0.0.1:8001/message?session_id=session_abc&identity=bob" -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": {"name": "read_file", "arguments": {"path": "src/gateway/policy_v2.json"}}}' 3. **验证磁盘上的日志**: * 打开位于 [src/gateway/gateway_audit.log](./src/gateway/gateway_audit.log) 的活动审计日志,查看 JSON 结构化的决策日志。 ### 选项 B:通过 MCP Inspector 进行交互式验证 官方的 **MCP Inspector** 充当基于 SSE 的 Web 客户端 UI,用于查看和触发工具执行: 1. **启动 Inspector**: npx -y @modelcontextprotocol/inspector http://127.0.0.1:8001/sse?identity=alice 2. **连接到 SSE**: * 在网页的左上角侧边栏中,将 **Transport Type** 从 `STDIO` 更改为 `SSE`。 * 确保目标 URL 设置为 `http://127.0.0.1:8001/sse?identity=alice`。 * 点击 **Connect**。 3. **触发工具调用评估**: * 在 **Tools** 标签页下,您只会看到允许 `alice` 使用的工具(最小权限工具列表过滤)。 * 调用 `read_file` 并传入路径 `src/gateway/policy_v2.json` 以验证执行是否成功。 * 调用 `read_file` 并传入路径 `/etc/passwd` 以观察立即触发的 `ARG_CONSTRAINT_VIOLATION` 安全拦截。
标签:AI安全, Chat Copilot, MCP中间件, 人工智能, 拦截代理, 用户模式Hook绕过, 红队测评, 运行时防护, 逆向工具