mamabearmehmi-hub/skill-sentry

GitHub: mamabearmehmi-hub/skill-sentry

Skill Sentry 是一个在安装前静态扫描 Claude MCP 技能以发现安全威胁的零成本开源工具。

Stars: 1 | Forks: 0

Skill Sentry npm version
Scan Claude skills for security threats before you install them.

为什么 · 功能 · 快速开始 · 工作原理 · 限制 · 贡献

## 为什么我构建了这个 每天我都会发现新的技能和 MCP 服务器,让使用 Claude 构建功能变得像超级能力一样。社区非常棒。人们正在发布工具,将 Claude 变成设计伙伴、数据库管理器和部署引擎。 但有一件事让我夜不能寐:**每一个技能都要求你运行 `npx` 或 `npm install`。** 这意味着你必须信任别人的代码在你的机器上运行。拥有你的文件、环境变量、SSH 密钥和令牌。 我不是安全专家。我只是一个构建者,就像你一样。但我知道足够多的事实,因此害怕在看到内部代码之前就运行 `curl | bash` 的 `postinstall` 脚本。我读过供应链攻击的故事。我见过一个恶意包能造成什么后果。 所以我为自己构建了一个哨兵。 **Skill Sentry 会扫描代码,这样你就不需要了。** 它读取每个文件,检查危险模式,并给出风险评分。这一切都无需执行被扫描的哪怕一行代码。 欢迎你使用它。我希望它能帮助我们保持安全,并让我们继续享受使用 Claude 构建美好事物。 **V** | *只是一个想安心点击安装的构建者* ## 它能做什么 **Skill Sentry 是一个零成本、开源的安全扫描器,专为 Claude MCP 生态系统设计。** 不管它被称为“Skill”还是“MCP Server”。如果有 `package.json`,Skill Sentry 就会扫描它。 ### 扫描器会检查以下内容: | 风险等级 | 检测内容 | 重要性 | |:---:|---|---| | **严重** | 带有 Shell 命令的 `postinstall` / `preinstall` 脚本 | 代码会在你检查之前自动运行 | | **高** | `eval()`、`child_process`、`exec()`、SSH 密钥访问 | 让包控制你的整个系统 | | **高** | 读取 `process.env.GITHUB_TOKEN` 等密钥 | 凭证可能被盗 | | **中** | 混淆的 Base64 数据块、未固定版本的 `"*"` 依赖 | 隐藏的有效载荷和供应链风险 | | **中** | 访问粘贴站点和原始 GitHub URL 的网络请求 | 运行时下载有效载荷 | ### 风险评分 每个技能都会获得一个 **0 到 100** 的评分。 ``` Risk Score = min(100, sum of all finding scores) ``` - **0** = 未检测到已知风险模式 - **1-19** = 低风险 - **20-49** = 中风险(请查看结果) - **50-79** = 高风险(请谨慎) - **80-100** = 严重(不要安装) ### 已验证发布者和类型混淆检测 知名组织(Anthropic、Stripe、GitHub、Supabase 等)会被识别为 **已验证发布者**。它们的检测结果会显示,但会说明这是预期行为。Stripe 的工具包 *应该* 读取 `STRIPE_API_KEY`。这是正常的。 如果某个仓库所有者看起来与已验证发布者高度相似(例如 `stripee` 对比 `stripe`),扫描器会将其标记为 **潜在的类型混淆攻击**:有人冒充受信任品牌来诱骗你安装恶意代码。 ## 功能特性 - **npm CLI**:`npx skill-sentry ` 可从任意终端扫描,无需安装 - **Web 仪表板**:可搜索的审计技能表格,带交互式筛选 - **即时扫描**:粘贴 URL,5-15 秒内获取结果(扫描在服务端运行) - **直白英语**:每个发现都用人类语言解释,而非安全术语 - **判决结果**:清晰的扫描建议(“无已知风险” / “请仔细审查” / “不要安装”) - **CI 标志**:`--strict` 和 `--threshold` 用于自动化流水线拦截 - **自动发现**:每日通过 GitHub API 抓取新的 MCP 仓库 - **零成本**:完全在 Vercel 免费层和 GitHub Actions 上运行 ## 快速开始 ### 在终端中扫描(无需安装) ``` npx skill-sentry https://github.com/owner/repo ``` 你会看到一个带直白判决结果的高亮报告: ``` ┌─────────────────────────────────────┐ │ SKILL SENTRY v0.2 │ │ Security scanner for Claude skills │ └─────────────────────────────────────┘ Scanning: https://github.com/owner/repo Cloning and analyzing... ════════════════════════════════════════ NO KNOWN RISK PATTERNS DETECTED ════════════════════════════════════════ Risk Score: 0/100 Files: 42 scanned Findings: 0 issues ✓ No known risk patterns detected All 42 files passed 11 security checks. ``` **标志:** - `--json` 输出原始 JSON(可用于管道传输到其他工具或 CI) - `--strict` 如果发现任何 HIGH 或 CRITICAL 结果则退出状态为 1 - `--threshold ` 如果风险评分 >= N 则退出状态为 1(0-100) - `--help` 显示用法 **退出代码**(用于 CI/CD): - `0` = 无发现 - `1` = 检测到发现(或超过阈值) - `2` = 错误(无效 URL 或网络问题) **在 CI 中使用:** ``` # 阻止添加危险 MCP 依赖的 PR npx skill-sentry https://github.com/owner/new-skill --strict || exit 1 # 自定义阈值:如果风险分数达到 50 或以上则失败 npx skill-sentry https://github.com/owner/new-skill --threshold 50 ``` ### 使用仪表板 访问在线仪表板并将任意 GitHub URL 粘贴到提交表单中。结果会在 5-15 秒内直接显示在页面上。无需页面跳转,也无需等待后台任务。 ### 本地运行 ``` git clone https://github.com/mamabearmehmi-hub/skill-sentry.git cd skill-sentry npm install npm run dev ``` 打开 [http://localhost:3000](http://localhost:3000) 查看仪表板。 ### 运行测试 ``` npm test ``` 20 个集成测试会针对真实测试文件验证每一个安全规则。 ## 如何使用仪表板 ### 第一步:安装前先检查 有人刚刚在 Slack 中分享了一个很酷的 Claude 技能。在运行 `npx` 或 `npm install` 之前: 1. 复制 GitHub URL 2. 将其粘贴到 **提交技能以供审核** 的输入框中 3. 5-15 秒后结果会显示在页面上 4. 阅读判决结果 ### 第二步:阅读判决结果 | 你看到的内容 | 含义 | 应该做什么 | |:---:|---|---| | **“未检测到已知风险模式”** | 我们的 11 条检测规则均未匹配 | 风险较低,但仍建议检查不熟悉作者提供的代码 | | **“已验证发布者”** | 已知组织(Stripe、Anthropic 等)且结果符合预期 | 查看结果,但这些通常是该类型工具的正常运行 | | **“发现一些顾虑”** | 检测到可疑模式 | 阅读发现内容并自行判断 | | **“高风险”** | 多个危险模式 | 仅在信任作者并了解其所需权限的情况下安装 | | **“禁止安装”** | 严重威胁:自动执行脚本、窃取凭证或访问 SSH 密钥 | 切勿安装。告知他人。 | | **“看起来像是伪造账户”** | 仓库所有者与已验证发布者高度相似 | 很可能是一种模仿攻击。不要安装。 | ### 第三步:理解发现内容 每个发现都会用直白语言解释。不需要安全学位: 点击 **“技术细节”** 可展开完整分解,包括文件路径和行号。 ## 自动发现:注册表自我增长 Skill Sentry 拥有一个 **每日自动抓取器**,它会: 1. **每天 06:00 UTC** 通过 GitHub Actions 运行 2. **搜索 GitHub** 上标记为 `mcp-server`、`mcp-tool`、`claude-skill` 和 `model-context-protocol` 的仓库 3. **跳过已扫描的仓库**(无重复) 4. **审计每个新仓库** 的全部 11 条安全规则 5. **自动提交结果** 到注册表 6. **Vercel 自动重新部署**,新技能会在几分钟内出现在仪表板上 注册表每天都在增长,无需人工操作。社区也可以通过提交按钮参与反馈,形成越多人使用、内容越完整的良性循环。 **当前注册表:** 已扫描 128+ 个技能,并持续增长。 ## “但我们公司已经有 SonarQube / Snyk / Checkmarx 了...” 很好,继续使用它们。Skill S 填补了一个不同的空白。 | 工具 | 何时触发 | 覆盖范围 | 空白点 | |------|:---:|---|---| | **SonarQube** | 代码已进入你的仓库后 | 代码质量、错误和你仓库中的安全异味 | 无法在安装前扫描第三方包 | | **Snyk / Checkmarx** | `npm install` 之后 | 依赖树中的已知 CVE | 此时恶意 `postinstall` 脚本已经运行 | | **Azure Defender** | 运行时 | 部署基础设施中的威胁 | 无法覆盖开发者本地机器或本地 `npx` | | **Ivanti App Control** | 端点级别 | 受管控设备上的白名单/黑名单可执行文件和脚本 | 不理解 npm 包,基于二进制而非意图。运行恶意技能的 `node.exe` 与安全的一样 | | **Skill Sentry** | **安装前** | **你即将信任的包中的危险模式** | **这就是空白点** | 以下是某人安装 Claude 技能的时间线: ``` 1. Someone shares a skill URL in Slack 2. Developer runs: npx some-mcp-skill ← Skill Sentry checks HERE 3. npm downloads the package ← Ivanti sees node.exe (allowed) 4. postinstall script runs silently ← Too late. Snyk hasn't scanned yet. 5. Code is in node_modules ← NOW Snyk/Checkmarx can see it 6. Developer commits and pushes ← NOW SonarQube can see it 7. App deploys to production ← NOW Azure Defender can see it ``` 第 3-4 步是致命区。恶意代码会在任何企业工具有机会查看之前运行。 **Skill Sentry 是第 2 步的唯一检查。** 在下载前。在执行前。在任何损害发生前。 ## 它是如何工作的 ``` Terminal or Dashboard │ ▼ ┌──────────────┐ │ auditRepo() │ Stateless function: URL in, JSON out └──────┬───────┘ │ ┌──────▼───────┐ │ Clone repo │ git clone --depth 1 (local) │ or tarball │ GitHub API download (Vercel/npx) └──────┬───────┘ │ ┌──────▼───────┐ │ Scan files │ 11 regex rules x matching file targets │ (static) │ Records: file, line, match, severity └──────┬───────┘ │ ┌──────▼───────┐ │ Risk score │ min(100, sum of finding scores) │ + verdict │ Checks verified publishers + typosquats └──────┬───────┘ │ ┌──────▼───────┐ │ Cleanup │ Temp directory deleted (always, even on error) └──────────────┘ ``` **核心原则:** 扫描器**永远不会执行**它正在分析的代码。它下载文件,读取内容,运行正则表达式模式匹配,然后删除文件。仅此而已。静态分析而已。 ### 架构 | 层级 | 技术 | 成本 | |------|------|------| | CLI | TypeScript + tsx | 免费(npm) | | 前端 | Next.js 15、Tailwind CSS、Shadcn UI | 免费(Vercel) | | 数据库 | `registry.json` 提交到 Git | 免费 | | 扫描器 | TypeScript + 正则表达式(仅使用 Node.js 内置模块) | 免费 | | 自动化 | GitHub Actions(3 个工作流) | 免费(公开仓库) | | npm 包 | 22.9KB,仅 2 个生产依赖(tar、tsx) | 免费 | **总运行成本:每月 0 美元。** ### npm 包:轻量设计 CLI 仅包含 **2 个生产依赖**(tar + tsx)。Web 仪表板的依赖(React、Next.js、Tailwind)仅用于开发环境,运行 `npx skill-sentry` 时不会下载。总安装体积仅约 14MB。 ## 项目结构 ``` skill-sentry/ ├── bin/ # npm CLI entry point │ ├── cli.js # Node wrapper (loads tsx) │ └── skill-sentry.ts # CLI with colored output + flags ├── app/ # Next.js App Router (dashboard) │ ├── page.tsx # Dashboard │ ├── api/submit/route.ts # Scan API (runs auditor directly) │ ├── api/check/route.ts # Registry lookup API │ └── repo/[owner]/[name]/ # Per-repo report pages ├── components/security/ # Dashboard UI components │ ├── DashboardClient.tsx # Interactive stats + ticker + table │ ├── SkillsTable.tsx # Searchable skills table (desktop + mobile) │ ├── SubmitSkillForm.tsx # Submit form with inline results │ ├── RiskBadge.tsx # Color-coded risk scores │ ├── FindingCard.tsx # Finding with plain English + source link │ ├── ThreatBar.tsx # Severity distribution bar │ ├── SearchFilter.tsx # Search + filter controls │ └── ReportHeader.tsx # Report page header ├── scripts/ # Scanner engine │ ├── auditor.ts # Core: auditRepo(url) -> RegistryEntry │ ├── clone-repo.ts # Git clone or tarball download + cleanup │ ├── scan-files.ts # File walker + regex matcher │ ├── cli.ts # JSON CLI (used by GitHub Actions) │ ├── scraper.ts # GitHub topic discovery │ └── update-registry.ts # Registry upsert ├── lib/ # Shared types and logic │ ├── types.ts # TypeScript data contract │ ├── constants.ts # 11 security rules with plain English │ ├── registry.ts # Server-side registry helpers │ ├── registry-utils.ts # Client-safe: verdicts, impact, search │ └── verified-publishers.ts # Publisher whitelist + typosquat detection ├── .github/workflows/ # GitHub Actions │ ├── reusable-auditor.yml # Core scan workflow (called by others) │ ├── on-demand-scan.yml # repository_dispatch trigger │ └── scheduled-scrape.yml # Daily discovery cron (06:00 UTC) └── public/data/ └── registry.json # The "database" (128+ entries) ``` ## 它是什么以及它不是什么 **让我对你坦诚相待。** Skill Sentry 是一个 **初级安全扫描器**。它是烟雾探测器,而不是消防队。 **它能捕获:** - 安装时自动执行的恶意 `postinstall` / `preinstall` 脚本 - `child_process`、`exec`、`spawn` 的使用(可在你的机器上运行命令) - SSH 密钥访问尝试(`~/.ssh`、`id_rsa`、`known_hosts`) - 凭证窃取(`process.env.GITHUB_TOKEN`、密钥、API 密钥) - `eval()` 使用(任意代码执行) - 混淆的 Base64 有效载荷、未固定版本的依赖、可疑的网络目标 - 类型混淆攻击(模仿已知发布者的伪造账户) **它无法捕获:** - 混淆或编码的恶意代码(例如通过字符串拼接构建 `eval`) - 深度依赖树中的复杂供应链攻击 - 编译后的二进制文件或 WebAssembly 中的威胁 - 文档或 README 中的社会工程学攻击 - 已知依赖中的零日漏洞 **这对你意味着什么:** - 评分为 **0** 并不意味着包绝对安全,只是未匹配到我们的检测规则 - 如果 Skill Sentry 显示 **“禁止安装”**,请认真对待。确实存在问题 - 对于关键生产系统,请结合使用 Snyk、SonarQube、Checkmarx 和人工代码审查 大多数 npm 供应链攻击都很简单。一个在安装时 `curl` 有效载荷的 `postinstall` 脚本是头号攻击方式。Skill Sentry 能在几秒钟内捕获这些。这解决了最常见的攻击。对于更复杂的长期攻击,企业工具和人工审查仍然不可或缺。 **坦诚说明局限性能建立更多信任。** 我宁愿你知道这个工具能做什么,也不愿你在无意中遭受损失。 ## 我如何构建它 我在一次会话中使用 Claude Code(Opus)构建了 Skill Sentry。从痛点到发布的完整构建过程被逐步记录: **[阅读完整的构建过程](docs/HOW-I-BUILT-THIS.md)** 其中涵盖了架构决策、遇到的问题及修复、推动改进的社区反馈,以及构建你自己的工具的原则。 ## 贡献 我构建 Skill Sentry 是因为我需要它。如果你觉得它有用,我很乐意你的帮助让它变得更好。 **这是我的第一个开源项目,所以我也在学习。请对我有耐心,我也会对你有耐心。** 我们都在一起,是因为我们希望用 Claude 安全地构建。 ### 如何贡献 1. **Fork 仓库。** 点击 GitHub 上的 Fork 按钮。 2. **创建分支。** `git checkout -b feature/你的想法` 3. **做出修改。** 参考代码库中的模式进行更改。 4. **运行测试。** `npm test`(全部 20 个必须通过) 5. **成功构建。** `npm run build`(必须无错误完成) 6. **打开 Pull Request。** 目标分支为 `main`,并附上清晰的描述 ### 我希望得到的帮助 - **更多安全规则。** 看到我遗漏的模式?添加到 `lib/constants.ts` - **AST 解析。** 超越正则表达式以减少误报 - **更好的正则表达式。** 某些规则可能存在误报/漏报 - **UI 改进。** 仪表板界面可以更好看 - **测试。** 更多边界情况、更多测试文件、更多信心 - **可访问性。** 让仪表板对所有人可用 ### 基本规则 - **友善待人。** 我们都在学习。 - **保持简单。** 这个项目故意保持零成本、低依赖。 - **绝不执行代码。** 扫描器绝不能运行被扫描的代码。这是不可谈判的。 - **测试你的修改。** 添加规则就添加测试,修复 Bug 就证明它被修复了。 - **一次只做一件事。** 小的、专注的 PR 更容易被审查 ### 分支保护 `main` 分支受到保护。所有变更必须通过 Pull Request 提交,并满足: - 至少需要 1 次审查 - 过期的审查会在新推送时被清除 - 禁止强制推送 - 禁止删除分支 这不是官僚主义。这是一个安全项目。我们以身作则。 ## 开发环境设置 ### 先决条件 - Node.js 20+ - Git - GitHub 账户(用于测试提交流程) ### 环境变量 创建 `.env.local` 文件: ``` # 可选:仅适用于 Web 仪表板的提交按钮 GH_TOKEN=your_github_personal_access_token # 可选:默认为此仓库 GITHUB_OWNER=mamabearmehmi-hub GITHUB_REPO=skill-sentry ``` CLI(`npx skill-sentry`)不需要任何环境变量。它使用本地的 `git clone` 或 GitHub API 的 tarball 下载(可通过可选的 `GH_TOKEN` 提高速率限制)。 ## 贡献者

V

创建者与维护者
你?
成为贡献者
## 许可证 MIT 许可证。使用它、分支它、改进它。只需继续安全地构建。

纯静态分析。永不执行代码。永远。
由一位关心安全的 Claude 构建者构建——只希望能安心点击安装。

标签:Claude, CVE检测, JSONLines, LNA, MCP, MITM代理, npm安全, npx, postinstall脚本, SEO: Skill Sentry, SEO: 安全扫描工具, SEO: 开源安全工具, 云安全监控, 前端安全, 威胁情报, 安全威胁, 安全扫描, 开发者工具, 技能安装, 技能扫描, 时序注入, 自动化攻击, 零信任, 静态分析, 风险评分