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绕过, 红队测评, 运行时防护, 逆向工具