rjcuff/plum
GitHub: rjcuff/plum
一款针对 npm 包的供应链安全扫描 CLI 工具,提前拦截风险依赖。
Stars: 1 | Forks: 0
🟣 plum
npm supply chain security scanner — scan before you install.
```
🟣 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 扫描依赖项:
```
[](https://github.com/rjcuff/plum)
```
[](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 检测, 二进制发布, 云安全监控, 依赖扫描, 可视化界面, 威胁情报, 安全评分, 开发者工具, 开源工具, 模型提供商, 通知系统, 零配置, 静态分析, 风险评分