关于 uta-shield
uta-shield 是面向 MCP 服务运营方的零依赖 Node.js 防火墙,也为 Agent 提供 PhishGuard 威胁情报 MCP 服务。它结合身份验证、逐工具授权、威胁筛查、速率限制、DLP、计量和审计日志;README 区分了已交付功能与规划项目。
主要功能
- 01HMAC 身份验证和逐工具 ACL
- 02入站与出站威胁筛查
- 03按 IP 和已验证 Agent 限流
- 04DLP 遮罩及编辑策略
- 05逐次调用计量和 JSONL 审计
- 06PhishGuard IOC 查询与文本筛查
适用场景
- 01将 MCP 访问限制为已验证 Agent
- 02阻止或编辑调用中的威胁指标
- 03按 IP 或 Agent 限制请求速率
- 04使用内置情报源筛查 URL 和文本
MCP 相关
作为提供方侧代理,它可包装 MCP 服务并执行身份验证、访问控制、筛查和日志记录。其 PhishGuard MCP 服务以工具形式提供 IOC 查询、URL 与文本筛查、活动列表和情报源信息。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
5收录的工具列表 · 更新于 1 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| value | string | 是 | 要检查的指标(domain、url、ip、email、sha256、filename、filepath) |
详细介绍
uta-shield
面向 MCP 服务的提供方防火墙 + PhishGuard 威胁情报 MCP 服务——集于一个零依赖软件包中。
主页 / 文档:https://wall.utalabs.tech
MCP 安全类别中的所有网关(Lasso、Mintive、Obot、agentgateway、Cequence)保护的都是使用方——即员工将 Agent 连接到第三方服务的公司。没有任何产品保护运营方——也就是发布 MCP 服务、并将数据库暴露给互联网上所有匿名 Agent 的 SaaS 服务商。
uta-shield 则从另一侧提供保护:将它套在你自己的 MCP 服务外,就能获得已验证身份、按工具授权、威胁情报拦截(入站和出站)、双层速率限制、DLP 脱敏、代理加固、逐次调用计量和 JSONL 审计记录——无需修改服务端代码。
其依据是一场真实且有记录的攻击行动:taikotalent 网络钓鱼事件(针对开源开发者的假招聘人员恶意软件,相关域名在约 12 小时内被下线,C2 基础设施已追踪)。随附的情报源包含其中 23 个已验证的 IOC。
快速开始
# 1. Screen any indicator offline (exit code 1 on match → scriptable)
npx uta-shield check gaganata.ink # → MATCH (C2, campaign taikotalent-2026-10)
npx uta-shield check example.com # → NO_MATCH
# 2. Screen text (email body, web content, tool output)
echo "verify at https://taikotalent.xyz/verify_m" | npx uta-shield screen
# 3. Run the PhishGuard MCP server (agents get lookup_ioc / check_url / screen_text)
npx uta-shield mcp
# 4. THE FIREWALL: wrap your MCP server (fail-closed: keys or explicit opt-out)
cat > keys.json <<'EOF'
{ "recruiter-agent": "generate-a-long-random-secret", "auditor-agent": "another-secret" }
EOF
npx uta-shield wrap --upstream http://localhost:3001 --port 8787 --keys-file keys.json --admin-token "$(openssl rand -hex 24)"
# → agents now talk to :8787; your server stays at :3001
# GET /health · GET /pricing (x402-ready) · GET /audit (admin-only: x-uta-admin header)
# 5. See it all live
node demo/run-demo.mjs
已验证身份(v0.2.0,ACL 严格模式 v0.2.2)
身份验证不再仅依赖声明。Agent 需提供三个标头:
x-agent-name: recruiter-agent
x-agent-timestamp: 1761196800000 (ms; ±5 min window)
x-agent-signature: <hex> HMAC_SHA256(secret, `${agent}|${ts}|${sha256(rawBody)}`)
- 签名有效 →
ALLOW_VERIFIED(按 Agent 分桶限速、执行 ACL、计量)。 - 提供了凭证但凭证无效 →
REJECT_AUTH(401)。始终采用失败即关闭。 - 未提供凭证 →
REJECT_ANON(401),除非运营方传入--allow-anonymous。 - 未签名的声明名称仅作为标签,标记为
verified:false——不会获得按 Agent 分桶的速率限制。 - 按工具设置 ACL(
--acl-file):默认情况下,不在映射表中的 Agent 不受限制。要采用允许列表语义,请添加--acl-deny-unlisted——未列出的 Agent 即使签名有效,也会收到403 REJECT_FORBIDDEN。没有 ACL 文件时,CLI 会拒绝--acl-deny-unlisted(没有映射表时,拒绝未列出的 Agent 会导致所有 Agent 都被拒绝)。/health会披露identity.acl_deny_unlisted。
请求签名(客户端侧,任意语言):
import { createHmac, createHash } from "node:crypto";
const ts = Date.now();
const bodyHash = createHash("sha256").update(rawBody).digest("hex");
const sig = createHmac("sha256", secret).update(`${agent}|${ts}|${bodyHash}`).digest("hex");
8 个层级
| # | 层级 | v0.2.2 中的状态 |
|---|---|---|
| 1 | Agent 身份:已验证 HMAC-SHA256(--keys-file、防重放时间窗口、失败即关闭)+ 按工具设置 ACL(--acl-file)+ 声明式 / 匿名回退 | 已发布 |
| 2 | 每个 Agent 的信誉评分 | hook(记录身份判定结果;评分功能列入路线图) |
| 3 | 入站 / 出站威胁情报:拦截入站参数;出站响应遵循明确的策略(--outbound-policy block|redact|log,默认 redact) | 已发布 |
| 4 | 速率限制:双层——按 IP 分桶(始终启用)+ 按 Agent 分桶(仅限已验证身份);免费 / 付费层级 | 已发布 |
| 5 | 计费:逐次调用计量 + 兼容 x402 的定价清单(结算委托给运营方的支付层) | 已发布(计量) |
| 6 | DLP:电子邮件地址(明文 + 混淆形式)、JWT、AWS / GCP 密钥、GitHub PAT、Stripe 密钥、Bearer 令牌、PEM 区块、十六进制密钥、信用卡号(通过 Luhn 算法校验)、可选的 Base64 内容块 | 已发布 |
| 7 | 反向漂移警报(架构变化时通知客户端) | 路线图 |
| 8 | 审计:按决策记录 JSONL(指标 + 活动信息供排查使用,绝不记录原始参数或密钥) | 已发布 |
如实说明:本 README 标注的功能均与实际发布内容一致。第 2 和第 7 层只是设计接口,不作夸大宣传。
代理加固(v0.2.1)
| 控制项 | 默认值 | 标志 |
|---|---|---|
| 启动时默认拒绝 | 未指定 --keys-file 或 --allow-anonymous 时拒绝运行 | — |
/audit 需要身份验证 | 未提供令牌时禁用(404);提供令牌时,需通过 x-uta-admin 验证(采用时序安全比较)——审计记录包含 IOC 和 Agent 名称,属于运营遥测信息,绝不公开 | --admin-token SECRET / UTA_SHIELD_ADMIN(≥16 个字符) |
| 请求正文大小上限 | 1 MiB(包括声明值和流式传输值——伪造标头无济于事) | --max-body-bytes N |
| 上游超时 | 30 s → 504,固定消息 | --upstream-timeout-ms N |
| MCP 方法允许列表 | initialize、notifications/initialized、ping、tools/list、tools/call → 其他所有方法均返回 403 METHOD_DENIED | --allow-methods "a,b" | "*" |
| 安全错误 | 上游故障返回固定消息;详情写入审计日志,绝不发送给客户端 | — |
| 精确的出站判定 | x-uta-shield 响应标志是核心判定(OUT_OK/OUT_MASKED/OUT_REDACTED/OUTBOUND_INTEL)——不重新计算;policy=log 报告 OUTBOUND_INTEL,绝不会返回看似正常的 OUT_OK | — |
| 原始正文转发 | 按原始字节转发至上游(保证签名完整性) | — |
| 每 IP 速率上限 | 120 req/min,突发上限 60 | -- 通过 API 配置 |
| 标头超时 | 标头 10 s,请求超时 = 上游超时 + 5 s | 自动 |
已知限制(如实说明适用范围)
- 身份验证采用 HMAC 共享密钥(由运营方颁发)。它可验证 Agent 对运营方的身份,但不是联邦 PKI。
/.well-known/agent.json来源验证仍是补充机制。 policy=log会记录出站 IOC,但仍会将其放行——该模式供明确选择启用的运营方使用;安全选项是redact(默认)或block。- 混淆邮箱和十六进制密钥的 DLP 模式采用启发式检测,可能误报(可通过
dlp选项调整)。 - 不终止 TLS——请在现有反向代理(Caddy/nginx/certbot)后运行。
- 附带的情报源仅包含 1 个有文档说明的攻击活动(23 个 IOC)。情报源数据采用 CC-BY-4.0 许可;可通过添加自己的攻击活动进行扩展。
为什么零依赖?
拥有 47 个传递依赖的安全产品不是防御,而是攻击面。uta-shield 是约 1,600 行可审计的 Node.js ≥18(ESM)代码,其中包括手写的 MCP stdio 实现(以换行符分隔的 JSON-RPC 2.0)。npm pack 后约为 108 kB 解包大小 / 54 kB 压缩包。
内置情报源
feed/iocs.json(架构 pg/1)附带攻击活动 taikotalent-2026-10:涵盖 9 种类型的 23 个 IOC——钓鱼域名(已由注册商客户端将其状态设为 clientHold),位于 Cloudflare 后方的在线 C2 域名、发件人 IP、假冒招聘人员邮箱、暂存器 URL、载荷的 sha256、通配符二阶段路径(/var/tmp/.kdm.*)、互斥体名称——并包含 MITRE ATT&CK 映射(T1566.002、T1656、T1204.002、T1059.004、T1027、T1071.001、T1070.004、T1583.001)和每个 IOC 的上下文。每项判定都会附带这些证据,供下游 Agent 推断自己为何被拦截。
情报源数据来自公开案例仓库,采用 CC-BY-4.0 许可。添加攻击活动对象即可更新或扩展;架构由 uta-shield verify-feed 验证。
作为 MCP 服务(面向 Agent,而不只是运营方)
Agent 可通过工具获取情报:lookup_ioc(value)、check_url(url)(情报源 + 启发式建议)、screen_text(text)、list_campaigns()、feed_info()。每个响应都是数据——服务绝不会获取或执行任何内容。
商业方案
| 方案 | 内容 | 价格 |
|---|---|---|
| 自托管(本软件包,许可使用) | 所有随附层和内置情报源——在自己的基础设施上运行,允许商用 | 免费 |
| S7 — 托管情报源订阅 | 更新后的攻击活动情报源 + Webhook 告警 + YARA 规则 | $50/mes(前 100 个持有 ATC 的 Agent 免费) |
| S6 — Shield 评估 + piloto | MCP 服务审计 + 部署的 piloto(身份验证 + 情报 + 审计)+ 报告 | $1,000 setup + $100/mes/server |
联系:AliceLabs LLC — [email protected]
测试(可复现)
node --test test/*.test.mjs # 85 tests: identity/HMAC, strict-ACL, outbound policies, DLP formats,
# authenticated /audit, exact verdict propagation, streamed overflow,
# MCP client lifecycle e2e, proxy limits,
# two-tier rate limits, hardened proxy e2e (413/502/504/403/429),
# feed matching, MCP protocol
npm run verify-feed # feed schema validation
npm run demo # end-to-end with signed traffic
独立执行: .github/workflows/tests.yml 会在每次推送时,使用 GitHub 自有运行器(Node 20/22/24)运行完整测试套件——结果公开,且不依赖本文件中的说法。
v0.2.2 的测试结果:请参阅 EVIDENCE.md(命令、Node 版本、完整运行器摘要)。
从 v0.1.0 迁移到 v0.2.0(有破坏性变更)
- 未指定
--keys-file/UTA_SHIELD_KEYS/--allow-anonymous时,wrap拒绝启动(默认失败关闭)。 - 未验证调用方的速率限制按 IP 设置;声明的 Agent 名称不再创建独立的 Agent 桶。
gateOut的默认行为从透传改为redact。设置outboundPolicy:"log"可恢复 v0.1.0 的行为。- 审计流新增判定结果:
ALLOW_VERIFIED、REJECT_AUTH、REJECT_FORBIDDEN、OUT_REDACTED、OUT_BLOCKED、UPSTREAM_ERROR。
从 v0.2.0 迁移到 v0.2.1(有破坏性变更)
GET /audit不再支持无凭据访问。 未设置--admin-token(或UTA_SHIELD_ADMIN)时,会返回 404;设置令牌后,必须提供x-uta-admin标头。匿名抓取/audit的仪表板必须提供操作员令牌。响应标记x-uta-shield现在表示精确的核心判定结果——使用policy=log的用户将看到OUTBOUND_INTEL,而非此前标记错误的结果。
从 v0.2.1 迁移到 v0.2.2
- 增量更新。
--acl-deny-unlisted可启用可选的严格 ACL(允许列表语义);使用此标记但未指定--acl-file时,CLI 会拒绝启动(失败关闭)。新增审计判定结果:BODY_TOO_LARGE(适用于两种 413 路径——v0.2.1 新增了AUDIT_DISABLED/AUDIT_DENIED)。新增公共 CI——现有运营者的其他内容均不变。
授权使用——请参阅 LICENSE(使用许可 / 使用许可)。© 2026 AliceLabs LLC。商业例外(白标、OEM、再分发、托管服务):[email protected]
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。