扫描器评分方法
每个 zn Scan 分数都是适用检查项的加权占比。本页定义完整的检查项目录、各等级权重,以及确保测量中立、可复现的规则。评分标准带有版本号;每次变更都会连同日期列在下方的变更日志中,每份报告也会注明其评分所用的评分标准版本。
1. 仅被动扫描
远程扫描通过 Streamable HTTP 执行 MCP 握手(initialize、notifications/initialized)和 tools/list,限时 15 秒,且仅限 443、80 或 8443 端口。从不调用任何工具,也不会向目标发送任何对抗性载荷。若 tools/list 需要身份验证,工具类检查项将移出分母而不是判为失败,报告会显示实际计分的检查项数量。
2. 适用性
目标按设计无法满足的检查项(无变更类工具、只读服务器)会从分母中排除,而不是判为失败。分数 = 获得权重 / 适用权重。字母评级至少需要一项工具层面的检查:否则报告为未评级。
3. 产品中立
没有任何检查项偏向特定产品。zn-gate 仅作为多种修复方案之一出现,并始终与一个开源替代方案并列。从 A+ 到 F 的任何评级都无需购买即可达到。
评级区间
| 评级 | 分数 | 含义 |
|---|---|---|
| A+ | 95–100 | 高度稳健 |
| A | 85–94 | 基线扎实 |
| B | 70–84 | 中等风险 |
| C | 50–69 | 较高风险 |
| F | < 50 | 严重漏洞 |
| NR | — | 未评级:没有任何工具层面的检查可以计分(端点需要身份验证、使用旧版 SSE 传输或没有工具 Schema)。已观察到的检查项仍会列出。 |
必备等级
每项 12 分基础安全。缺失的检查项按失败计分。
TLS 1.2+ 传输加密
RFC 5246 / RFC 8446tls_transport端点可通过 HTTPS 访问,且证书链对该主机名有效。明文 HTTP 传输判为失败。
修复: 在边缘使用托管证书终止 TLS,并重定向所有明文请求。
开源替代方案: Let's Encrypt + Caddy,或 Nginx certbot 并启用 HSTS。
经过认证的传输边界
MCP Authorizationauth_boundary暴露具备变更能力工具的 MCP 端点,在提供这些工具前强制执行认证边界(带 PKCE 的 OAuth 2.1 或签名 bearer token)。
修复: 在每个 MCP 传输端点上强制使用带 PKCE 的 OAuth 2.1 授权码流程。
开源替代方案: 开源身份提供方(Keycloak、Ory Hydra、oauth2-proxy)提供相同的流程。
输入边界与载荷限制
OWASP LLM10input_bounds声明的字符串参数包含最大长度、枚举或模式,使单次调用无法携带无上限的载荷。
修复: 用 maxLength、enum 或 pattern 约束字符串参数,并在传输层拒绝超大请求体。
开源替代方案: JSON Schema maxLength 加上框架层的请求体大小限制(例如 express body-parser 的 limit)。
工具描述卫生
OWASP LLM01tool_desc_hygiene扫描工具和参数描述,查找隐藏在 docstring 中的对抗性祈使句和不可见 Unicode 字符(间接工具投毒)。
修复: 将描述改写为中性的能力说明;删除祈使性语句和不可见字符。
开源替代方案: mcp-scan(Invariant Labs)和 LlamaFirewall 都能标记被投毒的描述。
无不受限的 shell 原语
OWASP LLM06shell_primitives在主机上暴露任意 shell、eval 或命令执行且没有沙箱的工具,按设计即属严重问题。
修复: 用细粒度、限定范围的操作替换开放的 shell 工具,或在沙箱(Docker、Firecracker)中运行它们。
开源替代方案: Firecracker microVM、gVisor,或使用只读 rootfs 并移除 capabilities 的 Docker。
文件系统变更受限
OWASP LLM06fs_mutation文件写入或删除工具必须限定其路径参数(pattern、长度或声明的沙箱根目录)。未限定范围的路径判为失败。
修复: 将服务器绑定到单一工作区根目录,并遵守隐藏文件排除规则。
开源替代方案: 参考实现的 MCP filesystem 服务器以同样方式限定根目录。
无明文凭据参数
OWASP LLM02credentials_exposure工具参数不得以模型可见参数的形式接收 API 密钥、密码或令牌。
修复: 在运行时通过环境变量或密钥管理器注入凭据,绝不通过工具参数传递。
开源替代方案: Vault、AWS Secrets Manager 或 Doppler,按环境范围注入。
推荐等级
每项 6 分对外暴露服务器的良好实践。失败会扣除权重。
严格的参数 Schema 类型
OWASP LLM05param_typing每个工具都声明 object 类型的 inputSchema,且每个声明的参数都有明确类型。无参数工具通过;缺少 Schema 或类型为开放容器的判为失败。
修复: 在每个工具的 inputSchema 中声明类型(string、integer、boolean)和必填字段。
开源替代方案: Zod、Pydantic 或原生 JSON Schema 都能以同样方式生成严格的 Schema。
高风险变更的人工审批
OWASP LLM06financial_human_gate不可逆操作(退款、转账、扣款、部署)需要可审计的人工审批步骤。无法被动观察:仅列出供人工核实,从不计分。
修复: 为变更类工具添加两步确认流程,并使用服务端审批令牌。
开源替代方案: 任何基于 webhook 的审批队列(Slack 机器人、Linear 流程)都能实现相同的审批关口。
工具输出过滤能力
OWASP LLM01output_filter_capacity无论采用哪家供应商,目标都必须具备某种机制,在工具返回的内容到达模型之前对其进行检查或过滤。
修复: 在重新注入上下文之前,内联过滤工具输出(神经网络过滤器、正则策略或框架中间件)。
开源替代方案: LlamaFirewall、LLM Guard 或 Azure Prompt Shield 提供同等能力。
工具命名空间隔离
OWASP LLM01namespace_isolation上下文无法通过不可信文档重新定义、遮蔽或覆盖已注册的工具名称。
修复: 每轮重建工具注册表,并拒绝被遮蔽的名称。
开源替代方案: 参考实现的 MCP SDK 会保持客户端控制的工具名称不可变。
加分等级
每项 2 分额外加分。若按设计不具备,该检查项从分母中排除:永不扣分。
已发布零数据保留政策
OWASP LLM02zdr_policy一份已发布、可链接的声明,说明服务器会从工具调用或对话中保留哪些内容。
修复: 在网站上发布数据保留声明。
开源替代方案: 一个公开的文档页面或信任报告即可满足,无需任何供应商。
加密审计追踪
OWASP LLM06audit_trail判定结果和变更操作会生成哈希链式或签名的证据记录。
修复: 使用哈希链或仅追加存储记录判定结果。
开源替代方案: 使用 OpenSSL 的哈希链日志或仅追加的 Merkle 日志即可实现这一模式。
远程扫描机制
- 每次连接前都会校验 DNS 解析结果;请求固定使用一个已解析的地址(不留 DNS 重绑定窗口)。
- 私有、回环、链路本地(包括 169.254.169.254)、CGNAT、组播及文档保留地址段会在 DNS 解析时被拒绝,并在每次重定向跳转时再次检查。
- 最多 2 次重定向,每个请求最长 8 秒,整个扫描限时 15 秒,每个请求的响应上限为 512 KB。
- HTTP 401 或 403 只有在带有 WWW-Authenticate: Bearer 响应头、RFC 9728 受保护资源元数据或 JSON-RPC 错误体时,才算作 MCP 认证质询。需要身份验证的服务器报告为未评级,绝不会仅凭传输层得到 A+。
- 频率限制:每个来源 IP 每小时 20 次扫描。
- 未以 MCP 服务器身份响应的目标(无法访问,或返回非 MCP 的 HTTP 响应)只会反馈给用户本人,不会发布任何内容。
- TLS 证书必须针对被扫描的主机名校验通过(SNI、完整证书链)。
- 每份报告都包含逐项证据及其专属 URL(scan.usezn.com/r/{id}/),并提供 JSON、Markdown 和徽章版本,任何分数都可以通过重新运行同一扫描来复核。报告不会被搜索引擎收录,并在 90 天后删除。
静态模式(粘贴的内容)
粘贴的系统提示词和工具 Schema 在浏览器中分析,从不上传。适用相同的词库和等级权重;传输类检查项从分母中排除,因为粘贴的内容无法体现这些信息。只粘贴系统提示词而没有工具 Schema 时为未评级。此模式只证明这些内容本身所声明的东西,仅此而已。
规范性参考
- TLS 1.2 (RFC 5246) / TLS 1.3 (RFC 8446).
- Model Context Protocol (2025-06-18): initialize, tools/list, Streamable HTTP, Authorization (OAuth 2.1).
- OAuth 2.0 Protected Resource Metadata: RFC 9728.
- OWASP Top 10 for LLM Applications (2025): LLM01 Prompt Injection, LLM02 Sensitive Information Disclosure, LLM05 Improper Output Handling, LLM06 Excessive Agency, LLM10 Unbounded Consumption.
变更日志
v1.1
2026-10-10- Not rated (NR): a letter grade now requires at least one tool-level check. Auth-gated endpoints, legacy SSE servers and empty tool lists are reported as Not rated instead of earning A+ on transport alone.
- Auth detection: an HTTP 401/403 counts as an MCP auth challenge only with a WWW-Authenticate: Bearer header, RFC 9728 protected-resource metadata or a JSON-RPC error body; a bare 403 from a firewall is not an MCP server and is not published.
- Fewer false positives: credential parameters are matched on whole name segments (author, max_tokens and page_token no longer match); tools without arguments pass schema typing; filesystem checks only apply to file-shaped tools; shell detection needs a shell/eval/command-execution name, or a description of arbitrary command or code execution.
- Tool description hygiene also inspects parameter descriptions and flags invisible Unicode (zero-width, bidirectional and tag characters).
- References corrected to the OWASP Top 10 for LLM Applications 2025 (LLM01, LLM02, LLM05, LLM06, LLM10) and the MCP authorization spec.
- Duplicate auth and transport rows removed from reports.
v1.0
2026-09-30- First public rubric: 13 checks in three tiers, applicability exclusions, passive remote mode and in-browser static mode.
报告保留其计分时所用的评分标准版本。重新运行扫描即可获得按当前版本计算的分数。变更日志以英文发布。
申诉与更正
认为某项检查对你的服务器判断有误?请发送邮件至 security@usezn.com,附上扫描 ID(scan_…,每份报告上都有显示)以及你认为不准确的内容。经确认的评分标准错误会在新版评分标准中修正,并列入上方的变更日志。服务器所有者也可以申请删除已发布的关于其服务器的报告。 security@usezn.com