← 返回博客

Rotifer v0.7.9:Trust Shield — AI Agent 生态的安全扫描基础设施

一个将 AI 工具分为 A-D 四级的静态安全扫描器。一个任何开发者都能嵌入 README 的徽章服务。一次将 CLI、MCP、WebMCP 和文档全面对齐的跨层审计。

Rotifer v0.7.9:Trust Shield — AI Agent 生态的安全扫描基础设施

VirusTotal 能告诉你"这不是病毒"。但在一个拥有 38,000+ AI Agent 工具的生态中,"不是病毒"是一个相当低的标准。ClawHavoc 事件暴露了 ClawHub 上 1,184 个恶意 Skill 之后,真正的问题从 "这安全吗?" 变成了 "这东西到底好不好?"

v0.7.9 用三样东西回答这个问题:一个静态安全扫描器、一个任何人都能嵌入的徽章系统,以及一次将 CLI、MCP Server 和浏览器全面对齐的跨层审计。

@rotifer/playground@rotifer/mcp-server 已在 npm 更新。


V(g) 安全扫描器

rotifer vg 是一个新的 CLI 命令,对 AI 工具源代码执行静态分析。它扫描七类风险,从代码执行模式到可疑网络调用:

rotifer vg ./my-skill/src

输出:

{
  "grade": "B",
  "findings": [
    {
      "rule": "S-04",
      "severity": "HIGH",
      "file": "src/api.ts",
      "line": 42,
      "snippet": "fetch('https://api.openai.com/...')",
      "note": "Known API endpoint"
    }
  ],
  "stats": { "files_scanned": 3, "lines_of_code": 245 }
}

七条扫描规则

规则 检测内容 严重级别
S-01 动态代码执行(eval()new Function CRITICAL
S-02 系统命令执行(child_processexecspawn CRITICAL
S-03 代码混淆(atob() + eval 组合、base64 解码链) CRITICAL
S-04 可疑外部通信(fetchhttp.request 到未知域名) HIGH
S-05 环境变量读取(process.envDeno.env HIGH
S-06 持久化外联(WebSocketnet.Socket HIGH
S-07 文件系统操作(fs.readFilefs.writeFilefs.unlink MEDIUM

分级:A 到 D

结果汇总为字母等级:

等级 条件 徽章颜色
A 零 CRITICAL + 零 HIGH 绿色
B 零 CRITICAL + ≤2 HIGH(有合理说明) 浅绿色
C 零 CRITICAL + >2 HIGH 黄色
D 存在 CRITICAL 红色
? 纯 prompt 工具(无可扫描代码) 灰色

扫描器只报告客观事实——"在第 17 行发现 eval() 调用"——从不判定恶意意图。它是 VirusTotal 的补充,不是替代。


徽章系统:badge.rotifer.dev

每次扫描结果都会汇入运行在 Cloudflare Workers 上的徽章服务。端点遵循 shields.io JSON schema,任何开发者都可以在 README 中嵌入信任徽章:

![Safety](https://img.shields.io/endpoint?url=https://badge.rotifer.dev/safety/@author/my-skill)

提供四种徽章:

徽章 端点 数据源
安全等级 /safety/:skill_id V(g) 扫描结果(Worker KV)
Gene 声誉 /gene/:id Cloud Reputation 评分
Gene 适应度 /gene/:id/fitness Arena F(g) 性能数据
开发者声誉 /dev/:username 开发者综合评分

响应缓存 1 小时,通过 CORS 提供服务,可嵌入任何地方。

Badge Generator

一个专用页面让你无需接触 API 即可生成徽章代码。输入工具名称,在四种样式(flat、flat-square、for-the-badge、plastic)中实时预览,一键复制 Markdown。


Top 50 扫描:我们发现了什么

我们扫描了 ClawHub 上安装量最高的 50 个 Skill,建立了生态基线。完整报告另行发布,但核心发现是:100% 可扫描 Skill 至少触发了一项发现。

发现 占比
外部网络调用 (S-04) 94%
环境变量读取 (S-05) 72%
文件系统操作 (S-07) 58%
系统命令执行 (S-02) 36%
动态代码执行 (S-01) 14%

这并不意味着 100% 的 Skill 都有危险——fetch() 是 API 封装工具的基本操作。但这说明生态在代码层面缺乏可见性。

等级分布:

等级 数量 占比
A 0 0%
B 6 12%
C 22 44%
D 8 16%
?(纯 prompt) 14 28%

零 Grade A 值得关注。即使是善意的工具通常也至少有一次 fetch() 调用被扫描器标记。问题不在于是否有发现——而在于这些发现是否合理。

重要:这些结果描述的是代码模式,不是恶意意图。一个 Grade D 工具如果其 eval() 使用是有意且沙箱化的,可能完全安全。扫描器提供数据;开发者做判断。


WebMCP:从声明到执行

v0.7.9 之前,市场站点上的 WebMCP 工具是纯声明的——<form hidden> 标签告诉浏览器 Agent 有哪些工具可用,但实际无法执行。Agent 会发现 5 个工具然后……什么也做不了。

现在有 13 个 WebMCP 工具,全部具备浏览器原生执行能力:

站点 工具数 能力
市场 (rotifer.ai) 10 Gene 搜索、详情、对比、Arena 排名、开发者画像、声誉、版本历史、排行榜、统计、能力元工具
文档站 (rotifer.dev) 3 文档搜索、MCP 配置生成、域名建议

每个工具使用 navigator.modelContext.registerTool() 提供真实的 execute() 函数。当浏览器 Agent 调用 get_gene_detail(name="search.web.google-v2") 时,工具通过共享的 resolveGeneId() 函数将人类可读名称解析为 UUID,从云端 API 获取数据,并返回结构化结果。

这才是 WebMCP 应有的工作方式:工具在 浏览器内 运行,使用用户已认证的会话,受同源策略保护。无需额外 API 密钥。


跨层对齐:CLI ↔ MCP ↔ WebMCP ↔ 文档

一次系统性的跨层审计暴露了每个交汇点的缺口:

修复前 修复后
MCP 文档覆盖 28 个工具中的 9 个(32%) 28/28 工具全部文档化(100%)——中英文同步
WebMCP 有 5 个声明式工具 13 个工具,含执行逻辑
get_gene_detail WebMCP 用 name,MCP 期望 UUID id 通过 resolveGeneId() 翻译层统一
4 个 CLI 文档页缺少中文翻译 全部翻译完成
开发者无 CLI ↔ MCP 功能映射 映射表已添加至 MCP 配置指南

MCP 文档现在将全部 28 个工具分为四类——Gene 生命周期、查询与发现、Arena 与声誉、Agent 与认证——每个工具附有参数描述和示例响应。

CLI ↔ MCP 映射

MCP 配置指南中新增的参考表展示了 CLI 命令与 MCP 工具的对应关系:

CLI: rotifer search <query>MCP: search_genes
CLI: rotifer info <gene-ref>MCP: get_gene_detail
CLI: rotifer vg <path>     →  (仅 CLI — 本地扫描)
MCP: get_mcp_stats              →  (仅 MCP — 服务器元数据)

一些操作有意不对称:rotifer vg 在本地运行(不需要 MCP 对应工具),而 get_mcp_stats 是服务器元数据,在 CLI 上下文中没有意义。


下一步:v0.8 — Iron Shell

v0.8 将焦点转向安全加固——深度 Supabase 审计覆盖 Hybrid Gene 和 Badge Worker 引入的新攻击面,用精心构造的恶意载荷进行 WASM 沙箱逃逸测试,以及 P2P Protocol RFC(仅设计,v0.9 之前不实现)。

v0.7.9 的安全扫描器扫描的是 别人的 代码。v0.8 将同样的审视转向内部。


安装 / 升级

npm install -g @rotifer/playground@0.7.9

MCP Server 用户:

npm install -g @rotifer/mcp-server@0.7.9

VSCode 扩展:在扩展面板搜索 "Rotifer",或从最新 Release 安装 .vsix