skill-security-check · diff
git:20260830.2c099b8 to git:20260925.32ce6c0
88 added, 303 removed. Audit A to A.
---
name: skill-security-check
- description: 专门用于skill安装前的安全检查。支持多种编程语言(JavaScript/TypeScript, Python, Rust, Java, Go, C/C++, Ruby, PHP等)。在用户安装任何skill之前自动执行安全检查,检查数据外泄、凭证访问、文件系统越界、敏感文件访问、动态代码执行、权限提升、持久化机制、运行时安装、代码混淆、进程侦察、浏览器会话访问等安全风险。必须在安装任何第三方或社区skill之前使用此skill进行全面安全审查。
+ description: "Skill 安装前的静态安全检查:对目标 skill 目录执行 11 项风险扫描(数据外泄、凭证访问、文件系统越界、敏感身份文件访问、动态代码执行、权限提升、持久化机制、运行时安装、代码混淆、进程侦察、浏览器会话访问),输出风险等级 / 最终评级 / 置信度报告并给出安装建议。支持 JavaScript/TypeScript、Python、Rust、Java、Go、C/C++、Ruby、PHP、Shell、PowerShell、Perl。必须在安装或更新任何第三方、社区或来源不明的 skill 之前使用此 skill 做全面安全审查。触发词:安全检查、安全审查、skill 安全、安装前检查、检查这个 skill 安全吗、有没有风险、第三方 skill 审查、security check、security audit、skill safety、is this skill safe、malicious skill。"
---
# Skill 安装前安全检查 (Multi-Language)
- 此skill用于在skill安装前进行全面的安全检查,确保待安装的skill不会对系统造成安全威胁。
-
- **支持语言**: JavaScript/TypeScript, Python, Rust, Java, Go, C/C++, Ruby, PHP, Shell, PowerShell, Perl
-
- ## 自动化工具(推荐入口)
-
- 本 skill 随附可执行实现,优先用工具扫描,再按需做人工研判:
-
- - `scripts/security-check.js`:开箱即用的 Node CLI。对目标 skill 目录做 11 项静态扫描并生成报告:
- ```bash
- node scripts/security-check.js <skill-path>
- ```
- - `src/`:TypeScript 源码(`npm install && npm run build` 编译至 `dist/`,`dist/` 默认被 .gitignore 忽略)。
-
- 下方「安全检查流程」即工具的检测逻辑;手动审查时可直接使用文末的 grep 模式。
- `scripts/security-report-*.md` 为示例输出,仅作格式参考(其中引用的 skill 名仅为样例)。
-
- ## 何时使用
-
- 在以下情况下必须执行安全检查:
- - 安装来自GitHub、npm、PyPI、Crates.io或其他源的第三方skill
- - 安装社区贡献的skill
- - 更新已安装的skill到新版本
- - 对安全性有疑问时
-
- ## 安全检查流程
-
- 对于每个待检查的skill,按照以下清单逐项检查:
-
- ### 1. 数据外泄检查
-
- **检查目标:** 确保skill不会将敏感数据传输到外部服务器
-
- **检测模式 (按语言):**
- - JavaScript: `fetch`, `axios`, `XMLHttpRequest`, `WebSocket`
- - Python: `requests`, `urllib`, `http.client`, `aiohttp`, `httpx`
- - Rust: `reqwest`, `hyper`, `ureq`, `curl`
- - Java: `HttpClient`, `HttpURLConnection`, `OkHttp`, `Retrofit`
- - Go: `http.Get`, `http.Post`, `net/http`
- - Ruby: `Net::HTTP`, `open-uri`, `httparty`, `faraday`
- - PHP: `curl_`, `file_get_contents`, `fsockopen`
-
- **预期结果:** ✅ 无 - 无外部服务器通信(除非是skill的核心功能且已明确声明)
-
- ### 2. 凭证访问检查
-
- **检查目标:** 确保skill安全地访问凭证和敏感配置
-
- **检测模式 (按语言):**
- - JavaScript: `process.env`, `dotenv`
- - Python: `os.environ`, `os.getenv`
- - Rust: `std::env`, `dotenv`
- - Java: `System.getenv`, `System.getProperty`
- - Go: `os.Getenv`, `os.LookupEnv`
- - Ruby: `ENV[]`, `ENV.`
- - PHP: `$_ENV`, `$_SERVER`, `getenv`
-
- **预期结果:** ✅ 安全 - 仅读取配置型环境变量
-
- ### 3. 文件系统越界检查
-
- **检查目标:** 确保skill只在预期目录内操作文件
-
- **检测模式 (按语言):**
- - JavaScript: `fs.writeFile`, `fs.readFile`, `fs.copyFile`
- - Python: `open`, `pathlib`, `shutil.copy`, `shutil.move`
- - Rust: `File::create`, `File::open`, `fs::write`, `std::fs`
- - Java: `FileWriter`, `FileReader`, `Files.write`, `Files.read`
- - Go: `os.WriteFile`, `os.ReadFile`, `os.Open`, `os.Create`
- - Ruby: `File.open`, `File.write`, `FileUtils`
- - PHP: `file_put_contents`, `file_get_contents`, `fopen`, `fwrite`
-
- **预期结果:** ✅ 无 - 仅访问预期目录
-
- ### 4. 身份文件访问检查
-
- **检查目标:** 确保skill不访问敏感的身份识别文件
-
- **检测文件:**
- - `MEMORY.md` - AI记忆文件
- - `~/.ssh/*` - SSH密钥
- - `~/.gitconfig` - Git配置
- - `id_rsa`, `id_ed25519` - SSH私钥
- - `known_hosts`, `authorized_keys`
-
- **预期结果:** ✅ 无 - 不访问 MEMORY.md 等敏感文件
-
- ### 5. 动态代码执行检查
-
- **检查目标:** 确保动态代码执行是可控且安全的
-
- **检测模式 (按语言):**
- - JavaScript: `eval()`, `new Function()`, `child_process`, `vm.runInNewContext`
- - Python: `exec()`, `eval()`, `subprocess.call`, `os.system`, `os.popen`
- - Rust: `Command::new`, `std::process::Command`, `libc::system`
- - Java: `Runtime.exec`, `ProcessBuilder`, `ScriptEngine`
- - Go: `exec.Command`, `os.Exec`, `syscall.Exec`
- - Ruby: `eval`, `instance_eval`, `system`, ``, `Open3`
- - PHP: `eval()`, `exec()`, `system()`, `shell_exec()`, `proc_open()`
-
- **预期结果:** ✅ 受控 - 仅用于 Chrome 自动化或明确的合法用途
-
- ### 6. 权限提升检查
-
- **检查目标:** 确保skill不尝试提升系统权限
-
- **检测模式 (按语言):**
- - Shell: `sudo`, `chmod +x`, `chmod 777`, `chown`
- - Python: `os.chmod`, `os.chown`, `shutil.copymode`
- - Rust: `std::os::unix::fs::PermissionsExt`, `set_permissions`
- - Java: `Runtime.exec("sudo")`, `ProcessBuilder`
- - Go: `os.Chmod`, `os.Chown`, `syscall.Chmod`
- - Ruby: `File.chmod`, `File.chown`, `system("sudo")`
- - PHP: `chmod()`, `chown()`, `exec()`, `system()`
-
- **预期结果:** ✅ 无 - 无特权操作
-
- ### 7. 持久化机制检查
-
- **检查目标:** 确保skill不会在后台持续运行或保持驻留
-
- **检测模式 (按语言):**
- - Shell: `daemon`, `cron`, `crontab`, `systemctl`, `nohup`
- - Python: `schedule`, `APScheduler`, `threading.Timer`, `daemon=True`
- - Rust: `tokio::time`, `std::thread::spawn`
- - Java: `TimerTask`, `ScheduledExecutorService`, `@Scheduled`
- - Go: `time.Tick`, `time.NewTicker`
- - Ruby: `whenever`, `rufus-scheduler`, `Thread.new`
- - 开机启动: `/etc/init.d`, `/etc/systemd`, `Library/LaunchAgents`, Windows注册表Run键
-
- **预期结果:** ✅ 无 - 无后台驻留
-
- ### 8. 运行时安装检查
-
- **检查目标:** 确保依赖是预先声明的,运行时不会偷偷安装
-
- **检测模式 (按语言):**
- - JavaScript: `npm install`, `yarn add`, `pnpm add`
- - Python: `pip install`, `pip3 install`, `subprocess.call("pip")`, `importlib`
- - Rust: `Command::new("cargo")`
- - Java: `Runtime.exec("mvn")`, `ProcessBuilder("gradle")`
- - Go: `exec.Command("go get")`
- - Ruby: `system("gem install")`
-
- **预期结果:** ✅ 无 - 依赖预先声明
-
- ### 9. 代码混淆检查
-
- **检查目标:** 确保源代码清晰可读,没有恶意混淆
-
- **检测指标:**
- - 单字母变量比例 > 50%
- - 超长行数 (>500字符) > 5行
- - 大量长字符串 (>50字符) > 5个
- - Base64/Hex编码的可疑字符串 > 10个
- - 检测语言: JavaScript, TypeScript, Python, Rust, Java, Go, Ruby, PHP, C/C++
-
- **预期结果:** ✅ 无 - 源码清晰可读
-
- ### 10. 进程侦察检查
-
- **检查目标:** 确保skill不会扫描或枚举系统进程
-
- **检测模式 (按语言):**
- - Shell: `ps`, `tasklist`, `wmic`, `/proc/`
- - Python: `psutil`, `subprocess.call("ps")`, `os.listdir("/proc")`
- - Rust: `sysinfo`, `psutil`, `std::process::Command("ps")`
- - Java: `ProcessHandle.allProcesses`, `ManagementFactory`, `sigar`
- - Go: `exec.Command("ps")`, `process.`
- - Ruby: `Sys::ProcTable`, `` `ps` ``, `system("ps")`
- - PHP: `proc_open`, `shell_exec("ps")`, `exec("ps")`
-
- **预期结果:** ✅ 无 - 无系统扫描
-
- ### 11. 浏览器会话访问检查
-
- **检查目标:** 确保浏览器自动化使用独立的配置文件
-
- **检测模式 (按语言):**
- - JavaScript: `puppeteer`, `playwright`, `selenium`, `--user-data-dir`
- - Python: `selenium`, `playwright`, `pyppeteer`, `user_data_dir`
- - Rust: `headless_chrome`, `thirtyfour`, `fantoccini`
- - Java: `selenium`, `ChromeDriver`, `WebDriver`, `HtmlUnitDriver`
- - Go: `chromedp`, `rod`, `playwright-go`
- - Ruby: `selenium-webdriver`, `watir`, `capybara`
- - PHP: `facebook/webdriver`, `php-webdriver`, `panther`
-
- **预期结果:** ✅ 受控 - 使用独立 Chrome 配置文件
-
- ## 执行检查
-
- 当用户要求检查一个skill时,按照以下步骤执行:
-
- 1. **获取skill文件:** 如果skill是本地路径,直接读取;如果是远程链接,先下载
- 2. **静态代码分析:** 使用grep等工具搜索风险模式(支持多语言)
- 3. **逐项检查:** 按照上述11项检查清单逐一验证
- 4. **生成报告:** 创建结构化的安全检查报告
-
- ## 输出格式
-
- 生成安全检查报告,格式如下:
-
- ```markdown
- # 安全审查完成 ✅
-
- 已完成对 **xxx** skill
- 的全面安全审查,并生成详细报告。
-
- ## 📊 审查结果
-
- **风险等级:** 🟢 LOW / 🟡 MEDIUM / 🔴 HIGH
- **最终评级:** ✅ SAFE / ⚠️ REVIEW_NEEDED / ❌ UNSAFE
- **置信度:** HIGH / MEDIUM / LOW
-
- ---
-
- ## 🔍 关键发现
-
- ### ✅ 安全优势
-
- 1. **无数据外泄** - 无外部服务器通信
- 2. **透明代码** - 所有源码可读,无混淆
- 3. **凭证安全** - 不访问敏感凭证或会话令牌
- 4. **作用域隔离** - 仅访问用户明确提供的文件
- 5. **无持久化** - 无 crontab、启动脚本或后台服务
- 6. **无权限提升** - 无 sudo、chmod 或 setuid 操作
- 7. **干净的依赖** - 所有依赖都是预先声明的
-
- ### ⚠️ 需要用户知晓的点(非漏洞)
-
- 1. **Chrome 会话持久化** - 首次运行需手动登录,会话保存在 Chrome 配置文件中
- 2. **网络图片下载** - 如果 Markdown 包含外部图片 URL,skill 会下载
- 3. **浏览器自动化** - 通过 CDP 控制 Chrome(发布功能所需)
-
- ### 🚨 安全风险(如果有)
-
- 1. **数据外泄** - [具体问题描述]
- 2. **权限提升** - [具体问题描述]
- ...
+ ## Purpose
- ---
+ 在安装一个 skill 之前,把它当作不可信代码做只读静态审查,产出一份带风险等级、最终评级和
+ 置信度的 Markdown 报告,并给出「可以安装 / 需用户确认 / 不建议安装」的明确建议。它回答的是
+ "这个 skill 会不会外泄数据、越权、驻留或混淆代码",不是"这个 skill 好不好用"。
- ## 📋 详细检查项
+ **支持语言**: JavaScript/TypeScript, Python, Rust, Java, Go, C/C++, Ruby, PHP, Shell, PowerShell, Perl
- | 检查项 | 结果 | 说明 |
- |--------|------|------|
- | 数据外泄 | ✅ | 无外部服务器通信 |
- | 凭证访问 | ✅ | 仅读取配置型环境变量 |
- | ... | ... | ... |
+ ## When to Use
- ## 💡 建议操作
+ - 安装来自 GitHub、npm、PyPI、Crates.io 或其他源的第三方 skill。
+ - 安装社区贡献的 skill。
+ - 更新已安装的 skill 到新版本。
+ - 用户对某个 skill 的安全性有疑问,或要求"检查一下这个 skill"。
+ - 触发词:安全检查、安全审查、安装前检查、skill 安全、security check、security audit、
+ is this skill safe。
- - **安全等级:** ✅ 安全 / ⚠️ 需要注意 / ❌ 高风险
- - **建议:** 可以安装 / 请仔细阅读需要用户知晓的点 / 不建议安装
- ```
+ ## When NOT to Use
- ## 风险评级标准
+ - **代码质量 / 重构审查**(不涉及不可信来源)-> 交给 `claude-simplify` 或 `clean-code`。
+ - **自己正在编写、且完全可信的 skill** -> 无需安装前审查;如需自查,只跑工具即可。
+ - **运行时防护 / 入侵检测 / 沙箱** -> 本 skill 是安装前的一次性静态审查,不是运行时安全产品。
+ - **非 skill 的普通依赖审计**(如 `npm audit` 场景)-> 用对应生态的工具。
+ - **要求执行或"试跑"目标代码来验证** -> 本 skill 只做只读静态分析,拒绝执行被检查代码。
- ### 风险等级
+ ## Workflow
- - **🟢 LOW (低风险)** - 所有检查项通过,或仅有低风险问题且已明确说明用途
- - **🟡 MEDIUM (中风险)** - 存在中风险问题,或需要用户确认某些功能
- - **🔴 HIGH (高风险)** - 存在数据外泄、权限提升、恶意代码等高风险问题
+ 1. **获取 skill 文件**:本地路径直接读取;远程链接先下载到临时目录再扫描。
+ 2. **优先跑工具**:`node <skill>/scripts/security-check.js <skill-path>`。工具对目标目录执行
+ 11 项静态扫描并写出报告。
+ 3. **人工复核**:按 `references/checklist.md` 逐项确认;工具覆盖不到或结果可疑时,用
+ `references/grep-patterns.md` 的 grep 定位具体代码位置。
+ 4. **判定等级**:按 `references/report-format.md` 汇总为风险等级 / 最终评级 / 置信度。
+ 5. **给出建议**:明确写「可以安装 / 请先看需要用户知晓的点 / 不建议安装」,并保存报告。
- ### 最终评级
+ ## Decision Rules
- - **✅ SAFE** - 可以安全安装
- - **⚠️ REVIEW_NEEDED** - 需要用户查看"需要用户知晓的点"后决定是否安装
- - **❌ UNSAFE** - 不建议安装
+ - 目标是本地目录 -> 直接扫描;是远程仓库/包 -> 先下载到临时目录,扫描下载结果。
+ - 命中第 1 项数据外泄、第 6 项权限提升、或第 5 项恶意动态执行 -> 至少 HIGH 风险,除下方
+ Priority 的受控声明情形外不得降级。
+ - 目标 skill 声明了 `network_access: user-configured-origin` -> 按「需要用户知晓并在人工
+ 审查后放行」处理,**不自动判 SAFE**;仍须确认代码只使用用户配置的 base URL(见
+ `references/checklist.md` 第 1 项「网络能力声明」)。
+ - 命中第 7 项持久化或第 11 项浏览器会话复用 -> 通常是「需要用户知晓的点」,不是漏洞,但必须
+ 写进报告。
+ - 命中第 9 项代码混淆 -> 置信度降为 LOW/MEDIUM,并在报告中标注需人工复核。
+ - 某项无法判定 -> 记为「需要人工确认」,不得猜测结论。
+ - 支持语言之外的代码 -> 明确说明未覆盖,不给出结论。
+ - 报告落盘位置 -> 当前目录 `security-report-<skill-name>.md`。
- ### 置信度
+ ## Constraints
- - **HIGH** - 静态分析结果明确,无歧义
- - **MEDIUM** - 部分情况需要人工确认
- - **LOW** - 代码复杂或存在混淆,检测结果不确定
+ - **只读分析,绝不执行被检查 skill 的任何代码**,也不运行其安装脚本。
+ - 静态分析不能替代完整安全审计;报告必须写明这一限制。
+ - 「已声明能力」不是安全证明,只能把网络请求降级为「需要用户知晓」。
+ - 不得对未覆盖的语言或高度混淆代码给出确定结论。
+ - 报告中的 skill 名称、路径、代码位置必须来自实际扫描目标,不得编造。
- ## 报告结构说明
+ ## Priority
- 报告分为三个主要部分:
+ 1. **硬阻断优先**:数据外泄、权限提升、恶意动态执行 -> 不得因「已声明用途」降为 SAFE。
+ 2. **受控的已声明能力**可降为「需要用户知晓」,但仅在确认代码不存在固定第三方上报端点、
+ 隐蔽 telemetry 或跨主机重定向之后。
+ 3. **工具结果与人工判断冲突时**,以人工复核为准,并把该项标为 MEDIUM + 需人工确认。
- 1. **安全优势** - 展示该skill的安全亮点,让用户了解为什么它是安全的
- 2. **需要用户知晓的点** - 非漏洞,但用户需要了解的功能行为(如浏览器自动化、网络请求等)
- 3. **安全风险** - 真正的安全问题(如果有),会列出具体问题
+ ## Stop Conditions
- ### 网络能力声明
+ - 目标目录大到遍历成本不可接受,或大量文件命中混淆指标 -> 停止全量逐行审查,改为抽样扫描
+ 并把置信度标为 LOW。
+ - 单项无法判定 -> 停止该项、记为需人工确认,不继续推测。
+ - 不为了"更确定"而反复重扫同一目录;一次工具扫描 + 一次人工复核即止。
- 需要访问用户指定服务地址的 Skill,应在 `SKILL.md` frontmatter 中明确声明:
+ ## Verification
- ```yaml
- network_access: user-configured-origin
- ```
+ - [ ] 11 项检查逐项都有结论(通过 / 需要用户知晓 / 风险)。
+ - [ ] 报告同时给出风险等级、最终评级、置信度。
+ - [ ] 每条风险都指向具体文件、行号或检测模式。
+ - [ ] 未执行被检查 skill 的任何代码。
+ - [ ] 报告已保存为 `security-report-<skill-name>.md`,且给出了明确的安装建议。
- 该声明只把网络请求从“未声明外发”降为“需要用户知晓并人工审查”,不会自动证明安全。审查时仍须确认代码只使用用户配置的 base URL,不包含固定第三方上报端点、隐蔽 telemetry 或跨主机重定向。
+ ## Output
- ## 常见模式搜索
+ - **Outcome**:一份 Markdown 安全检查报告(安全优势 / 需要用户知晓的点 / 安全风险 / 详细
+ 检查项表格),外加明确的安装建议。
+ - **Done when**:11 项检查完成,报告写入 `security-report-<skill-name>.md`,安装建议明确。
+ - **Evidence**:报告中的风险等级、最终评级、置信度,以及每条风险对应的具体代码位置。
- 在执行检查时,使用以下grep模式进行快速扫描:
+ ## References
- ```bash
- # 网络请求 (多语言)
- grep -r "fetch\|axios\|requests\.\|urllib\|reqwest\|http\.client" \
- --include="*.js" --include="*.ts" --include="*.py" --include="*.rs"
+ Load only when needed:
- # 动态代码执行 (多语言)
- grep -r "eval\|exec\s*(\|subprocess\|Command::new\|Runtime\.exec" \
- --include="*.js" --include="*.ts" --include="*.py" --include="*.rs" --include="*.java" --include="*.go"
+ - `references/checklist.md` — 执行 11 项检查、或需要单项目判定标准与网络能力声明处理方式时读。
+ - `references/report-format.md` — 准备产出报告、或需要判定风险等级 / 最终评级 / 置信度时读。
+ - `references/grep-patterns.md` — 工具未覆盖、需要人工 grep 定位风险模式时读。
+ - `references/six-layer-architecture.md` — 仅在扩展本工具实现(六层架构、基线记忆、AST
+ 语义分析、多层解码)时读;它不是当前 11 项静态扫描的运行逻辑。
- # 文件系统访问
- grep -r "fs\.\|open\s*(\|File::\|FileWriter\|os\.WriteFile" \
- --include="*.js" --include="*.ts" --include="*.py" --include="*.rs" --include="*.java" --include="*.go"
+ ## Examples
- # 子进程 (多语言)
- grep -r "child_process\|subprocess\|Command::new\|exec\.Command\|Runtime\.exec" \
- --include="*.js" --include="*.ts" --include="*.py" --include="*.rs" --include="*.java" --include="*.go"
+ 仅在需要参照成品报告形态时读。示例中的 skill 名与路径仅为样例,不要照抄:
- # 环境变量 (多语言)
- grep -r "process\.env\|os\.environ\|os\.Getenv\|System\.getenv\|std::env" \
- --include="*.js" --include="*.ts" --include="*.py" --include="*.go" --include="*.java" --include="*.rs"
+ - `examples/security-report-attention-daily.md` — 参照「低风险 + 可以安装」的报告成品形态时读。
+ - `examples/security-report-infocard.md` — 参照带「需要用户知晓的点」(浏览器自动化)的报告形态时读。
+ - `examples/security-report-fengshuixue.md` — 参照短报告的裁剪形态时读。
+ - `examples/security-report-article-deconstructor.md` — 参照另一类 skill 的报告结构时读。
+ - `examples/security-report-translate-polisher.md` — 参照翻译类 skill 的报告结构时读。
- # 敏感文件路径
- grep -r "MEMORY\.md\|\.ssh\|\.gitconfig\|id_rsa" \
- --include="*.js" --include="*.ts" --include="*.py" --include="*.rs" --include="*.java" --include="*.go"
- ```
+ ## Scripts
- ## 执行步骤
+ - `scripts/security-check.js` — 主扫描入口。运行 `node scripts/security-check.js <skill-path>`,
+ 对目标目录执行 11 项静态扫描并输出 Markdown 报告。
+ - `scripts/security-check.test.js` — 工具自测。运行 `npm test`(等价于
+ `node scripts/security-check.test.js`)验证检测逻辑。
- 1. 询问用户要检查的skill路径或来源
- 2. 获取skill代码文件(支持多语言项目)
- 3. 执行上述11项安全检查(使用语言特定的检测模式)
- 4. 生成完整的安全检查报告(包含安全优势和注意事项)
- 5. 给出明确的安装建议
+ 实现说明:`src/` 为 TypeScript 源码(`npm install && npm run build` 编译至 `dist/`,
+ `dist/` 被 .gitignore 忽略);日常审查用 `scripts/security-check.js` 即可,无需先构建。