camilolb/warden
GitHub: camilolb/warden
一个本地运行的 Node.js 供应链安全 CLI 工具,解决依赖中的恶意包与合规风险。
Stars: 58 | Forks: 1
**你的依赖项守护者**
[](https://www.npmjs.com/package/warden-cli)
[](https://nodejs.org)
[](https://www.typescriptlang.org)
[](https://opensource.org/licenses/MIT)
[](docs/en/contributing.md)
_一个面向 Node.js 开发者的安全 CLI 工具。扫描恶意包、检测山寨包、监控外联连接、强制执行许可证合规性并审计你的供应链 —— 100% 本地运行,数据永不离开你的机器。_
[安装指南](#installation) | [命令列表](#commands) | [检测功能](#detection) | [策略配置 (.wardenrc)](#policy) | [文档](#documentation) | [路线图](#roadmap)
**[English docs](docs/en/README.md)** | **[Documentacion en espanol](docs/es/README.md)**
## 为什么选择 warden?
npm 生态系统中供应链攻击问题日益严重:
- **山寨包** — 名称与流行包相似(如 `lodashs`、`expres`)
- **安装后脚本** — 运行 `npm install` 时立即执行任意代码
- **凭证外泄** — 读取 `process.env` 并将令牌发送到外部服务器
- **代码混淆** — `eval()`、`Function()`、十六进制编码载荷隐藏在依赖项中
- **维护者账号被盗** — 合法包被劫持
`warden` 通过静态分析、运行时监控、许可证合规性和可强制执行策略为你提供可见性与控制权 —— 全部在本地运行。

## 安装
```
npm install -g warden-cli
```
**要求:** Node.js >= 18,npm >= 8
```
warden --version # 0.2.0
warden doctor # health check + security score
```
## 命令
| 命令 | 描述 |
|------|------|
| **`warden check [path]`** | 预安装门控 — 若检测到危险版本则阻止 `npm install` |
| **`warden scan [path]`** | 对 node_modules 进行静态分析 — 包含 11 种检测类别 |
| **`warden audit [path]`** | 可读且分组输出的 npm audit |
| **`warden fix [path]`** | 应用漏洞修复(默认为干运行) |
| **`warden monitor`** | 实时外联连接监控 |
| **`warden config`** | 跨 Node 版本管理 npm 安全设置 |
| **`warden update [path]`** | 带有备份功能的交互式依赖更新器 |
| **`warden license [path]`** | 允许/拒绝列表驱动的许可证合规扫描器 |
| **`warden doctor`** | 环境健康检查并给出安全评分(0-100) |
| **`warden report [path]`** | 生成 JSON/Markdown 格式安全报告 |
| **`warden versions`** | 管理已知危险包版本列表 |
### warden check [path]
预安装门控。读取 `package.json` 与 `package-lock.json`,若发现危险版本则阻止安装。可将其添加到 `preinstall` 脚本以实现自动化:
```
{
"scripts": {
"preinstall": "warden check"
}
}
```
```
warden check # check current directory
warden check ./my-project
```
### warden scan [path]
路径为可选参数,默认为当前目录。
```
warden scan # scan current directory
warden scan ./my-project
warden scan ./my-project --only-dangerous
warden scan ./my-project --output json > report.json
```
**选项:** `--only-dangerous` `--verbose` `--output json`
### warden audit [path]
```
warden audit ./my-project --level high
```
**选项:** `--level `
### warden fix [path]
```
warden fix ./my-project # dry-run (preview)
warden fix ./my-project --apply # apply safe fixes
warden fix ./my-project --apply --force # include breaking changes
```
### warden monitor
```
warden monitor --interval 2 --alert
warden monitor --pid 9832
```
### warden license [path]
```
warden license ./my-project
warden license ./my-project --deny GPL-3.0,AGPL-3.0
warden license ./my-project --allow MIT,ISC,Apache-2.0 --fail-on-unknown
warden license ./my-project --output json
```
### warden update [path]
```
warden update ./my-project --patch-only
```
### warden doctor
```
warden doctor
```
### warden versions
```
warden versions # list all known dangerous versions
warden versions add event-stream@3.3.6 --reason "..." # add to your local list
warden versions add pkg@1.0.0 --reason "..." --source "url" --severity high
warden versions remove event-stream@3.3.6 # remove from your local list
```
### warden report [path]
```
warden report . --format markdown --out security-report.md
```
## 检测
Warden 会跨 **12 种检测类别** 扫描 `node_modules` 中的每个包:
| 类别 | 检测内容 | 严重等级 |
|------|----------|----------|
| **危险版本** | 与 63 个已知恶意 `name@version` 条目精确匹配 | 高 |
| **山寨包** | 基于 Levenshtein 距离的名称相似性检测 | 高 |
| **代码混淆** | `eval()`、`new Function()`、XOR 加密、`Buffer.from('base64')`、十六进制/Base64 载荷、字符串反转、动态 `require()` | 高 |
| **反取证** | 自删除(`unlinkSync(__filename)`)、篡改证据(写入自身 `package.json`)、文件替换 | 高 |
| **生命周期脚本** | `preinstall`、`postinstall`、`prepare` 存在于 package.json | 高 |
| **系统执行** | `exec()`、`spawn()`、`child_process`、`shelljs`、`execa` | 高 |
| **文件系统访问** | 读写 `.ssh`、`.env`、`.aws/credentials`、`/etc/passwd` | 高 |
| **环境变量外泄** | `process.env.TOKEN`、`SECRET`、`AWS_*`、`GITHUB_TOKEN` | 高 |
| **加密操作** | `crypto.createCipher()` 等可能表示勒索软件的加密行为 | 中 |
| **网络调用** | `fetch()`、`http.request()`、`WebSocket`、`axios`、`got` | 中 |
| **原生二进制文件** | `.node`、`.so`、`.dll`、`.exe` 文件(不可审计的代码) | 中 |
| **Git 依赖** | `git+https://`、`github:` — 绕过 npm 注册表检查 | 中 |
### 风险分级
| 等级 | 条件 |
|------|------|
| **DANGEROUS** | 已知危险版本;或存在山寨包;或反取证 + 混淆/执行/生命周期;或混淆 + 网络;或执行 + 网络/环境;或生命周期 + 执行/混淆/网络;或文件系统 + 执行;或加密 + 网络 |
| **SUSPICIOUS** | 任意单一风险信号 |
| **CLEAN** | 无检测结果 |
## 策略
在项目根目录创建 `.wardenrc` 文件以强制执行安全策略:
```
{
"scan": {
"ignorePackages": ["esbuild", "rollup"],
"failOnRisk": "DANGEROUS",
"maxSuspicious": 20,
"blockDangerousVersions": true
},
"audit": {
"failOnSeverity": "high"
},
"license": {
"deny": ["GPL-3.0", "AGPL-3.0", "SSPL-1.0"],
"allow": ["MIT", "ISC", "Apache-2.0", "BSD-2-Clause", "BSD-3-Clause"],
"failOnUnknown": true
},
"policy": {
"bannedPackages": ["request", "colors"]
}
}
```
### 退出码
| 退出码 | 含义 |
|--------|------|
| `0` | 成功 |
| `1` | 策略违规(禁止包或可疑数量超限) |
| `2` | 发现 DANGEROUS 包 |
| `3` | 漏洞阈值超出 |
| `4` | 许可证违规 |
| `99` | 错误 |
## CI/CD 集成
```
# GitHub Actions
- run: npm install -g warden-cli
- run: warden scan .
- run: warden audit . --level high
- run: warden license .
- run: warden report . --format markdown --out security-report.md
```
## 数据文件
检测数据存储在可编辑的 JSON 文件中,无需修改代码即可贡献:
| 文件 | 用途 | 贡献方式 |
|------|------|----------|
| `src/data/popular-packages.json` | 山寨包检测用(150+ 包名) | 在数组中添加包名 |
| `src/data/licenses.json` | SPDX 许可证分类 | 在对应分类中添加标识符 |
| `src/data/dangerous-versions.json` | 63 个已知恶意 `name@version` 条目 | 添加条目或使用 `warden versions add` |
用户自定义条目保存在 `~/.warden/dangerous-versions.json`,运行时与内置列表合并。已知事件包括:event-stream (2018)、ua-parser-js (2021)、node-ipc (202)、Shai-Hulud 攻击(2025年9月,40+ 包)、Axios RAT 攻击(2026年3月)。
## 架构
```
src/
├── index.ts # CLI entry point
├── data/ # Editable JSON (popular packages, licenses)
├── types/ # Domain types (as const enums, zero any)
├── constants/ # Detection patterns, thresholds, features
├── services/ # Business logic (no CLI knowledge)
│ ├── AstAnalyzer.ts PackageScanner.ts RiskCalculator.ts
│ ├── NpmrcManager.ts AuditRunner.ts NetworkMonitor.ts
│ ├── DependencyAnalyzer.ts PolicyLoader.ts LicenseScanner.ts
│ ├── TyposquatDetector.ts DangerousVersionsChecker.ts
├── commands/ # Thin CLI handlers (10 commands)
└── utils/ # display, prompt, fs helpers
```
## 技术栈
| 依赖 | 用途 |
|------|------|
| [acorn](https://github.com/acornjs/acorn) | JavaScript AST 解析器 |
| [commander](https://github.com/tj/commander.js) | CLI 框架 |
| [chalk](https://github.com/chalk/chalk) | 终端颜色 |
| [ora](https://github.com/sindresorhus/ora) | 加载动画 |
| [cli-table3](https://github.com/cli-table/cli-table3) | 表格输出 |
**除上述五项外零运行时依赖。无 API 调用,无遥测。**
## 安全保障
- **100% 本地** — 数据永不离开你的机器
- **无需 root** — `lsof`/`ss` 可在普通用户下运行
- **只读默认** — 扫描、审计、doctor、许可证、报告均不修改文件
- **显式确认** — 破坏性操作(修复、配置禁用)需确认
- **自动备份** — 文件修改前自动备份(修复、更新)
## 文档
| 语言 | 链接 |
|------|------|
| English | [docs/en/](docs/en/README.md) |
| Español | [docs/es/](docs/es/README.md) |
包含:快速入门、命令参考、检测模式、策略配置、架构、CI/CD 集成与贡献指南。
## 路线图
- [ ] 单元测试套件(vitest)
- [ ] `warden sbom` — 软件物料清单(支持 CycloneDX/SPDX)
- [ ] `warden diff` — 比较两个快照的安全配置
- [ ] GitHub Code Scanning 的 SARIF 输出
- [ ] Windows 支持 `warden monitor`
- [ ] GitHub Actions 可复用动作
- [ ] VS Code 扩展
- [ ] 供应链风险评分(包年龄、维护者数量、下载趋势)
## 贡献
欢迎贡献!从以下开始:
- **添加检测模式** — 编辑 `src/constants/patterns.ts`
- **添加流行包** — 编辑 `src/data/popular-packages.json`
- **添加许可证标识符** — 编辑 `src/data/licenses.json`
- **报告危险版本** — 编辑 `src/data/dangerous-versions.json` 或运行 `warden versions add`
- **编写测试** — `RiskCalculator.ts` 和 `TyposquatDetector.ts` 为纯函数,适合单元测试
## 许可证
MIT
为 Node.js 社区构建。如果 warden 帮你发现问题,不妨给它一颗星。
标签:MITM代理, Node.js >= 18, Node.js安全, Python库, SEO: 供应链安全, SEO: 依赖审计, SEO: 安全扫描, TypeScript, 云安全监控, 依赖审计, 外联监控, 威胁情报, 安全CLI, 安全插件, 开发者工具, 恶意包扫描, 本地化安全工具, 类型劫持检测, 自动化攻击, 许可证合规, 运行时监控, 静态分析