ethereum-optimism/op-injection-scanner
GitHub: ethereum-optimism/op-injection-scanner
一个基于 MCP 协议的 AI Agent 安全防护服务器,通过多层级 LLM 检测机制扫描外部 URL 内容中的 prompt injection 攻击,保护 Agent 免受恶意内容劫持。
Stars: 0 | Forks: 0
# op-injection-scanner
一个用于 prompt injection 边界强制执行的 MCP server。AI agent 调用 `scan_url(url)` 而非直接获取 URL。该 server 获取 URL(带有 SSRF 保护),将 HTML 剥离为纯文本,并使用三层模型升级策略(Haiku → Sonnet → Opus)扫描内容是否存在 prompt injection。结果按 URL 和 TTL 桶进行缓存,因此在缓存窗口内的重复调用不会产生额外的 LLM 成本。
## 安装
```
git clone https://github.com/ethereum-optimism/op-injection-scanner
cd op-injection-scanner
bun install
```
## Claude Code MCP 配置
添加到 `~/.claude.json` 或你项目的 `.claude/settings.json`:
```
{
"mcpServers": {
"op-injection-scanner": {
"command": "bun",
"args": ["run", "/absolute/path/to/op-injection-scanner/src/server.ts"]
}
}
}
```
该 server 需要环境中设置 `ANTHROPIC_API_KEY`。
## 使用方法
Agent 调用 `scan_url` 并传入 URL,而不是直接获取它:
```
scan_url({ url: "https://some-external-docs.example.com/page" })
```
**Clean 响应** — 状态 200,tool 返回:
```
{
"status": "clean",
"content": "The stripped page text...",
"url": "https://some-external-docs.example.com/page",
"scanned_at": "2026-03-08T12:00:00.000Z",
"model_used": "claude-haiku-4-5",
"escalated": false
}
```
**Blocked 响应** — tool 返回 `isError: true`,因此调用的 agent 会收到一个 tool 错误:
```
{
"status": "blocked",
"reason": "Content contains instructions attempting to override agent behaviour",
"url": "https://malicious.example.com/page",
"scanned_at": "2026-03-08T12:00:00.000Z",
"model_used": "claude-haiku-4-5",
"escalated": false
}
```
当 tool 返回 `isError: true` 时,调用的 agent 不应继续处理该 URL。
## 环境变量
| Variable | Default | Purpose |
|----------|---------|---------|
| `ANTHROPIC_API_KEY` | (required) | Anthropic API key — SDK 自动读取 |
| `CACHE_MAX_ENTRIES` | `500` | 缓存扫描结果的最大数量 |
| `CACHE_TTL_SECONDS` | `3600` | 缓存条目生命周期(秒)(1 小时) |
| `CONFIDENCE_THRESHOLD` | `0.8` | 判定的最低置信度 — 低于此值则升级到下一层 |
| `FETCH_TIMEOUT_MS` | `10000` | HTTP 请求超时时间(毫秒) |
| `MAX_RESPONSE_BYTES` | `2097152` | 最大响应体大小 (2 MB) |
| `MAX_REDIRECTS` | `5` | 最大 HTTP 重定向跟随次数 |
| `MAX_URL_LENGTH` | `2048` | 最大 URL 长度(字符数) |
## 设计决策
### 为什么选择 MCP 而非 hook
Claude Code hook 会在每次 tool 调用时自动触发,但无法选择性地调用或独立测试。MCP server 是显式的 — agent 选择加入扫描,接口可测试,并且可以在不触及 hook 基础设施的情况下进行扩展(新 tool、新扫描类型)。
### v1 范围
此版本仅检测 prompt injection。恶意意图检测(例如钓鱼、凭据收集)将在未来迭代中实现。`clean` 判定意味着"未检测到注入尝试" — 而非"内容在各方面都是安全的"。
### 分层模型策略
- **Haiku** — 快速、便宜,处理大多数明显的案例
- **Sonnet** — 当 Haiku 返回 `uncertain` 或置信度 < 0.8 时升级
- **Opus** — 最终仲裁者,仅在 Sonnet 也无法得出置信判定时调用;schema 强制执行确定的 `clean` 或 `blocked` 判定(不允许 `uncertain`);解析失败默认为 `blocked`
### 无认证或速率限制
这是内部开发工具。网络隔离即访问控制。认证和按会话的速率限制在源代码中已作为未来工作记录。
### DNS rebinding(已知的 v1 限制)
SSRF 防护在请求前解析一次 DNS 并检查所有返回的 IP。控制低 TTL DNS 记录的复杂攻击者可能在初始检查时返回公网 IP,并在 TCP 连接时重新解析为私有 IP,从而绕过防护。完整的缓解措施需要自定义 DNS-pinning HTTP 客户端。这对内部工具是可以接受的,但在任何公共或共享部署之前必须解决。
标签:AI安全, AI防御工具, Anthropic Claude, Bun, Chat Copilot, DNS 反向解析, Ethereum Optimism, LLM护栏, MCP服务器, SSRF防护, TypeScript, URL安全检测, 内容安全扫描, 多层模型检测, 大语言模型安全, 安全插件, 提示词注入防御, 智能体安全, 机密管理, 网络内容过滤, 自动化攻击, 边界强制执行