rjcuff/plum

GitHub: rjcuff/plum

一款针对 npm 包的供应链安全扫描 CLI 工具,提前拦截风险依赖。

Stars: 1 | Forks: 0

🟣 plum

npm supply chain security scanner — scan before you install.

npm version GitHub release License

plum demo

``` 🟣 plum v0.1.0 ──────────────────────────────────────── scanning axios pkg axios v1.15.1 ↓ 99.9M downloads/week checks ✓ No known CVEs ✓ Maintainer (established) ✓ Download count healthy ──────────────────────────────────────── score ██████████████░░░░░░ 70/100 SAFE time 0.82s ``` plum 在触及您的项目之前,会对 npm 包进行供应链风险扫描。版本感知的 CVE 查询、拼写劫持检测、恶意代码模式扫描等功能 — 全部在 1 秒内完成。 无需账户。无需 API 密钥。无需更改工作流。 ## 快速开始 ``` npm install -g plum-scanner ``` ``` plum express # scan a package plum install express # scan + install if safe plum install express -y # auto-approve ``` 也可通过 curl 或从 [Releases](https://github.com/rjcuff/plum/releases) 获取独立二进制文件: ``` curl -fsSL https://raw.githubusercontent.com/rjcuff/plum/main/install.sh | bash ``` ## 拦截内容 | 信号 | 影响 | |--------|--------| | 已知 CVE(版本感知,通过 [OSV](https://osv.dev)) | 硬拦截或 −30 分 | | 混淆的 `eval(Buffer.from(...))` | 自动拦截 | | 凭证窃取(`process.env.npm_token`) | −15 分 | | 通过 `child_process.exec` 的 Shell 访问 | −5 分 | | 写入系统路径(`/etc/`) | −15 分 | | 拼写劫持(与 Top 200 包编辑距离 ≤ 2) | −30 分 | | 新维护者(账号 < 30 天) | −20 分 | | 近期发布(< 7 天) | −20 分 | | 安装脚本(postinstall/preinstall) | −15 分 | | 下载量低(< 100/周) | −10 分 | | 无 README | −10 分 | 包评分为 0–100。判决结果:**SAFE**、**RISKY** 或 **DANGEROUS**。 ## 工作原理 1. 从 npm registry 解析最新(或固定)版本 2. 使用精确版本查询 [OSV.dev](https://osv.dev) — 仅标记影响该版本的 CVE 3. 获取包元数据:维护者账号年龄、发布日期、下载次数、安装脚本 4. 下载 tarball 并在内存中扫描 `.js` 文件(永不写入磁盘) 5. 对 Top 200 npm 包进行拼写劫持检查 6. 计算加权评分并显示判决结果 所有网络请求并行执行。典型扫描耗时:**< 1 秒**。 ## 配置 在项目根目录放置 `plum.json`: ``` { "threshold": 70, "block_on_cve": true, "min_cve_severity": "high", "auto_install_above_threshold": false, "ignore": ["my-internal-package"] } ``` | 选项 | 默认值 | 描述 | |--------|---------|-------------| | `threshold` | `70` | 通过的最低分数 | | `block_on_cve` | `true` | 满足严重性阈值时硬拦截 CVE | | `min_cve_severity` | `"high"` | 触发拦截的最低严重等级(`critical`、`high`、`medium`、`low`) | | `auto_install_above_threshold` | `false` | 分数通过时跳过提示 | | `ignore` | `[]` | 忽略的包列表 | ## 数据来源 | 来源 | 提供内容 | |--------|----------| | [OSV.dev](https://osv.dev) | 带严重等级的版本感知 CVE 查询 | | npm Registry | 发布日期、维护者信息、下载次数、安装脚本 | | GitHub Advisory DB | 已知恶意包的安全公告 | | Tarball 分析 | 对 `.js` 文件的内存正则表达式扫描,检测危险模式 | ## 从源码构建 ``` git clone https://github.com/rjcuff/plum cd plum cargo build --release ``` 需要 [Rust](https://rustup.rs/) 1.70+。 ## 添加徽章 展示您的项目使用 plum 扫描依赖项: ``` [![scanned by plum](https://img.shields.io/badge/scanned%20by-🟣%20plum-purple)](https://github.com/rjcuff/plum) ``` [![scanned by plum](https://img.shields.io/badge/scanned%20by-🟣%20plum-purple)](https://github.com/rjcuff/plum) ## 为何选择 plum 供应链攻击发生在 `npm install` 之后。plum 在此之前进行拦截。它速度快、无需账户或 API 密钥,并能与现有工作流无缝集成。 类似 [Socket.dev](https://socket.dev) 的工具是 SaaS 产品。plum 是开源的、CLI 优先且完全免费。 ## 许可证 [Elastic License 2.0](./LICENSE) — 可自由用于 CLI 工具、个人和商业用途。未经许可,不得将 plum 作为托管/管理服务提供。欢迎贡献。
标签:CMS安全, CVE 检测, GNU通用公共许可证, JavaScript, Node.js, npm 安全, package.json, SEO 工具, typosquatting 检测, 二进制发布, 云安全监控, 依赖扫描, 可视化界面, 威胁情报, 安全评分, 开发者工具, 开源工具, 模型提供商, 通知系统, 零配置, 静态分析, 风险评分