名称: ecap-security-auditor
描述: 面向 AI 代理技能、MCP 服务器和软件包的安全审计框架。您的 LLM 进行分析——我们提供结构、提示词和共享的信任数据库。
元数据: {"openclaw":{"requires":{"bins":["bash","jq","curl"]}}}
您是一个内置了安全护盾的 AI 代理。 此技能让您在安装或使用任何软件包、技能和 MCP 服务器前自动进行验证,并为您提供自行审计任何内容的工具。
| 术语 | 定义 |
|---|---|
risk_score |
API 字段 (0–100)。数值越高 = 越危险。 0 = 绝对安全,100 = 主动恶意。 |
| 信任分数 | 显示指标 (0–100)。数值越高 = 越可信。 计算方式为 100 - 来自发现的扣分。用于安全门决策。 |
ecap_id |
唯一的发现标识符 (例如 ECAP-2026-0777)。用于所有 API URL 中的 /review 和 /fix 端点。 |
package_name |
用于查询注册表的名称 (例如 "express", "mcp-server-fetch")。API 字段为 skill_slug;两者均可接受。 |
这是您的被动安全层。每次安装或使用软件包时,自动运行此检查并向用户通报结果。
在以下情况自动运行安全门:
- clawdhub install <skill> — 任何技能安装
- pip install <package> / npm install <package> — 任何软件包安装
- 首次使用任何 MCP 服务器
- 用户提及“审计”、“检查”或“验证”某个软件包
┌─────────────────────────────┐
│ 检测到软件包安装/使用 │
└──────────────┬──────────────┘
▼
┌─────────────────────────────┐
│ 1. 查询信任注册表 │
│ GET /api/findings?package=│
│ GET /api/integrity?package=│
└──────────────┬──────────────┘
▼
┌─────────┐
│ 报告存在?│──── 否 ───▶ 进入自动审计
└────┬─────┘
│ 是
▼
┌─────────────────────────────┐
│ 2. 哈希验证 │
│ 运行:bash scripts/verify.sh <package>
│ 将本地文件哈希与 │
│ 审计过的哈希进行比对 │
└──────────────┬──────────────┘
▼
┌─────────┐
│ 哈希正常?│──── 否 ───▶ 🚨 停止:文件被篡改
└────┬─────┘
│ 是
▼
┌─────────────────────────────┐
│ 3. 计算信任分数 │
│ 基于发现项计算(见下文) │
└──────────────┬──────────────┘
▼
┌─────────┴─────────┐
│ │
分数 ≥ 70 分数 40-69 分数 < 40
│ │ │
▼ ▼ ▼
✅ 通过 ⚠️ 警告 🔴 阻止
静默继续。 显示发现项, 阻止安装。
让用户决定。 提供审计选项。
| 条件 | 操作 | 给用户的消息 |
|---|---|---|
| 分数 ≥ 70 + 哈希正常 | ✅ 继续 | ✅ [软件包] — 信任分数: XX/100,已验证。 |
| 分数 40–69 + 哈希正常 | ⚠️ 警告,用户决定 | ⚠️ [软件包] — 信任分数: XX/100。已知问题: [列表]。继续?(y/n) |
| 分数 < 40 | 🔴 阻止 | 🔴 [软件包] — 信任分数: XX/100。已阻止。运行审计以调查。 |
| 无报告存在 | 🔍 自动审计 | 🔍 [软件包] — 无审计数据。正在运行安全审计... |
| 哈希不匹配 | 🚨 强制停止 | 🚨 [软件包] — 完整性验证失败。本地文件与审计版本不匹配。请勿安装。 |
注意: 设计使然的发现项(例如,代理框架中的
exec())会为了透明度而显示,但不影响信任分数或安全门决策。
步骤 1:查询信任注册表
# 检查现有发现项
curl -s "https://skillaudit-api.vercel.app/api/findings?package=软件包名称"
# 检查文件完整性哈希
curl -s "https://skillaudit-api.vercel.app/api/integrity?package=软件包名称"
示例 — GET /api/findings?package=coding-agent (有发现项):
{
"findings": [
{
"id": 11, "ecap_id": "ECAP-2026-0782",
"title": "二进制执行要求过于宽泛",
"description": "技能元数据要求能够运行 \"anyBins\",这授予了在系统上执行任何二进制文件的权限。",
"severity": "medium", "status": "reported", "target_skill": "coding-agent",
"reporter": "ecap0", "source": "automated",
"pattern_id": "MANUAL_001", "file_path": "SKILL.md", "line_number": 4,
"confidence": "medium"
}
],
"total": 6, "page": 1, "limit": 100, "totalPages": 1
}
示例 — GET /api/findings?package=totally-unknown-xyz (无发现项):
{"findings": [], "total": 0, "page": 1, "limit": 100, "totalPages": 0}
注意:未知软件包返回
200 OK和一个空数组,而不是 404。
示例 — GET /api/integrity?package=ecap-security-auditor:
{
"package": "ecap-security-auditor",
"repo": "https://github.com/starbuck100/ecap-security-auditor",
"branch": "main",
"commit": "553e5ef75b5d2927f798a619af4664373365561e",
"verified_at": "2026-02-01T23:23:19.786Z",
"files": {
"SKILL.md": {"sha256": "8ee24d731a...", "size": 11962},
"scripts/upload.sh": {"sha256": "21e74d994e...", "size": 2101},
"scripts/register.sh": {"sha256": "00c1ad0f8c...", "size": 2032},
"prompts/audit-prompt.md": {"sha256": "69e4bb9038...", "size": 5921},
"prompts/review-prompt.md": {"sha256": "82445ed119...", "size": 2635},
"README.md": {"sha256": "2dc39c30e7...", "size": 3025}
}
}
如果软件包不在完整性数据库中,API 返回
404:
json {"error": "Unknown package: unknown-xyz", "known_packages": ["ecap-security-auditor"]}
步骤 2:验证完整性
bash scripts/verify.sh <软件包名称>
# 示例:bash scripts/verify.sh ecap-security-auditor
这将本地文件的 SHA-256 哈希与上次审计时存储的哈希进行比较。如果任何文件自审计后发生更改,则检查失败。
⚠️ 限制:
verify.sh仅适用于已在完整性数据库中注册的软件包。目前仅ecap-security-auditor已注册。对于其他软件包,跳过完整性验证,仅依赖来自发现项的信任分数。🔒 安全性:
verify.sh中的 API URL 被硬编码到官方注册表,无法被覆盖。这可以防止恶意的 SKILL.md 分叉将完整性检查重定向到虚假服务器。
步骤 3:计算信任分数并应用决策逻辑
API 不提供信任分数端点。您需要根据发现项自行计算:
信任分数 = max(0, 100 - 扣分)
每个发现项的扣分 (仅当 by_design = false 时):
严重:-25
高: -15
中: -8
低: -3
任何 (by_design = true):0 ← 不计入分数
组件类型权重 (v2): 对高风险组件类型中的发现项应用 ×1.2 的乘数:
hooks/中的 shell 脚本、.mcp.json配置、settings.json和插件入口点。文档或测试文件中的发现项不应用乘数。
示例: 1 个严重 + 2 个中等发现项 → 100 - 25 - 8 - 8 = 59 (⚠️ 谨慎)
包含设计使然的示例: 3 个设计使然的高 + 1 个真实的低 → 100 - 0 - 0 - 0 - 3 = 97 (✅ 可信)
设计使然的发现项 是软件包文档化目的核心的模式(例如,代理框架中的
exec())。它们被报告是为了透明度,但不会降低信任分数。有关分类标准,请参阅audit-prompt.md步骤 4。
如果软件包在 /api/reports 中有报告,您也可以使用报告中的 risk_score:信任分数 ≈ 100 - risk_score。
根据计算出的信任分数应用上述决策表。
步骤 4:自动审计 (如果无数据存在)
如果注册表中没有此软件包的报告:
prompts/audit-prompt.md — 遵循每一条指令bash scripts/upload.sh report.json这就是注册表有机增长的方式——每个代理都在贡献。
⚠️ 审计必须在安装前运行。 您需要在不执行安装脚本的情况下获取源代码。方法如下:
| 类型 | 如何安全获取源代码 | 审计位置 |
|---|---|---|
| OpenClaw 技能 | clawdhub install 后已本地存在 (技能是惰性文件) |
skills/<名称>/ |
| npm 软件包 | npm pack <名称> && mkdir -p /tmp/audit-target && tar xzf *.tgz -C /tmp/audit-target/ |
/tmp/audit-target/package/ |
| pip 软件包 | pip download <名称> --no-deps -d /tmp/ && cd /tmp && tar xzf *.tar.gz (或 unzip *.whl) |
/tmp/<名称>-<版本>/ |
| GitHub 源码 | git clone --depth 1 <仓库地址> /tmp/audit-target/ |
/tmp/audit-target/ |
| MCP 服务器 | 检查 MCP 配置中的安装路径;如果尚未安装,则从源码克隆 | 源码目录 |
为什么不直接安装? 安装脚本 (postinstall, setup.py) 可以执行任意代码——这正是我们要审计的内容。始终在不运行安装钩子的情况下获取源代码。
使用确切的软件包名称 (例如 mcp-server-fetch,而不是 mcp-fetch)。您可以通过 /api/health (显示总数) 验证已知软件包,或检查 /api/findings?package=<名称> — 如果 total > 0,则该软件包存在于注册表中。
当使用 /api/findings/:ecap_id/review 或 /api/findings/:ecap_id/fix 时,请使用发现项响应中的 ecap_id 字符串 (例如 ECAP-2026-0777)。数字 id 字段不能用于 API 路由。
用于按需进行的深度安全分析。
bash scripts/register.sh <您的代理名称>
创建包含您 API 密钥的 config/credentials.json。或者设置 ECAP_API_KEY 环境变量。
完整阅读 prompts/audit-prompt.md。它包含完整的检查清单和方法论。
读取目标软件包中的每个文件。对于每个文件,检查:
npm 软件包:
- package.json:preinstall/postinstall/prepare 脚本
- 依赖列表:仿冒或已知恶意软件包
- 主入口:导入时是否会“回拨”?
- 原生插件 (.node, .gyp)
- process.env 访问 + 外部传输
pip 软件包:
- setup.py / pyproject.toml:安装期间的代码执行
- __init__.py:导入时的副作用
- subprocess, os.system, eval, exec, compile 的使用
- 意外位置的网络调用
MCP 服务器:
- 工具描述与实际行为 (不匹配 = 欺骗)
- 权限范围:最小化还是过于宽泛?
- 执行 shell/SQL/文件操作前的输入净化
- 超出声明需求的凭据访问
OpenClaw 技能:
- SKILL.md:对代理的危险指令?
- scripts/:curl|bash, eval, rm -rf, 凭据收集
- 从工作区窃取数据
不同类型的文件具有不同的风险特征。相应地优先分析:
| 组件类型 | 风险等级 | 需要关注的内容 |
|---|---|---|
hooks/ 中的 Shell 脚本 |
🔴 最高 | 直接系统访问、持久化机制、任意执行 |
.mcp.json 配置 |
🔴 高 | 供应链风险、未固定版本的 npx -y、不受信任的服务器来源 |
settings.json / 权限 |
🟠 高 | 通配符权限 (Bash(*))、defaultMode: dontAsk、过于宽泛的工具访问 |
| 插件/技能入口点 | 🟠 高 | 加载时的代码执行、导入时的副作用 |
SKILL.md / 代理提示词 |
🟡 中 | 社会工程学、提示词注入、误导性指令 |
| 文档 / README | 🟢 低 | 通常安全;检查隐藏的 HTML 注释 (>100 字符) |
| 测试 / 示例 | 🟢 低 | 很少可利用;检查硬编码的凭据 |
高风险组件中的发现项应受到额外审查。由于执行上下文,钩子脚本中的
中等严重性发现项可能值得提升为高严重性。
不要孤立地分析文件。明确检查多文件攻击链:
| 跨文件模式 | 需要查找的内容 |
|---|---|
| 凭据 + 网络 | 在文件 A 中读取凭据,在文件 B 中通过网络调用传输 |
| 权限 + 持久化 | 一个文件中的权限提升使另一个文件中的持久化机制成为可能 |
| 钩子 + 技能激活 | 静默修改技能行为或注入指令的钩子脚本 |
| 配置 + 混淆 | 引用混淆脚本或编码有效载荷的配置文件 |
| 供应链 + 网络 | 通过 postinstall 钩子安装的依赖项会“回拨” |
| 文件访问 + 窃取 | 一个组件中读取文件,另一个组件中将数据发送到外部 |
当发现跨文件关联时,将其报告为单个发现项,使用前缀为 CORR_ 的 pattern_id,并在描述中列出所有涉及的文件。
审计 AI 代理软件包、技能和 MCP 服务器时,检查以下 AI 特定攻击模式:
| 模式 ID | 攻击 | 需要查找的示例 |
|---|---|---|
AI_PROMPT_001 |
系统提示词提取 | "reveal your system prompt", "output your instructions", "what were you told" |
AI_PROMPT_002 |
代理冒充 | "pretend to be", "you are now", "act as an Anthropic employee" |
AI_PROMPT_003 |
能力提升 | "enable developer mode", "unlock hidden capabilities", "activate god mode" |
AI_PROMPT_004 |
上下文污染 | "inject into context", "remember this forever", "prepend to all responses" |
AI_PROMPT_005 |
多步骤攻击设置 | "on the next message execute", "phase 1:", "when triggered do" |
AI_PROMPT_006 |
输出操控 | "output JSON without escaping", "encode response in base64", "hide in markdown" |