Edurd987/devops-scanner-core
GitHub: Edurd987/devops-scanner-core
轻量级命令行依赖扫描器,通过解析多语言项目清单并对接 OSV.dev 漏洞数据库,检测已知漏洞、许可证风险和技术债务并生成综合风险评分。
Stars: 0 | Forks: 0
# Dependency Scanner — 核心
扫描项目清单中的已知漏洞(通过 [OSV.dev](https://osv.dev))、许可证风险和维护信号,并生成综合风险评分。
这是一个商业 SCA 服务的开源核心(采用 MIT 许可证)。
## 支持的生态系统
| 生态系统 | 清单文件 | 状态 |
|---|---|---|
| Python | `requirements.txt`, `poetry.lock`, `pyproject.toml` | **生产可用** — 已在真实项目中验证 |
| Node.js | `package.json`, `package-lock.json` | **生产可用** — 已在真实项目中验证 |
| Go | `go.mod` | **生产可用** — 已在真实项目中验证 |
| Java | `pom.xml` | 实验性 — **已禁用**(见下文) |
| Rust | `Cargo.toml` | 实验性 — **已禁用**(见下文) |
| Ruby | `Gemfile.lock` | 实验性 |
**为什么禁用 Java/Rust:** 针对真实清单(`apache/commons-lang`、`BurntSushi/ripgrep`)进行的压力测试表明,Maven 解析器会将多个 `` 块合并为单个条目 —— 包名中包含了原始的 XML,且版本号在不同包之间发生了混淆。将其发送到漏洞数据库会产生错误的结果,这还不如没有结果。Rust 的内联表(`dep = { version = "1.0", path = "..." }`)解析不完整。在彻底修复之前,这两个解析器都将返回空结果。
## 设计原则
**结果具有确定性。** 每次扫描仅发送一个 OSV `querybatch` 请求;网络错误会直接抛出,而不是被静默吞没。运行相同的扫描三次会返回相同的数值 —— 这是用于审计的必要条件。
**仅对可验证的事实进行扣分。** 数据缺失并不代表风险。未知的许可证、版本启发式推断以及仅仅存在传递性依赖等情况,都会作为*观察结果*报告,绝不会用于夸大评分。评分来源于真实的 CVE、Copyleft 许可证、未锁定的版本范围以及确认已过时的包。
## 用法
```
git clone https://github.com/Edurd987/devops-scanner-core.git
cd devops-scanner-core
# 扫描目录(仅限声明的 dependencies,无网络)
python dependency_scanner.py /path/to/project
# 包含来自 OSV.dev 的漏洞数据
python dependency_scanner.py /path/to/project --osv
# 其他格式与过滤器
python dependency_scanner.py /path/to/project --osv -f json
python dependency_scanner.py /path/to/project --ecosystem npm --severity high
```
需要 Python 3.10+。无第三方依赖。
## 范围与限制
- 分析**已声明**的依赖项。带有范围(`>=2.11.0`)的清单会作为范围进行匹配,因此某些发现可能不适用于实际安装的版本。Lock 文件可提供精确结果。
- 许可证检测目前依赖于一个内置的小型映射表;大多数包会被解析为 `Unknown`。计划实现基于注册中心的许可证信息扩充。
- 无可达性分析 —— 每个已知的 CVE 都会被报告,不会根据是否实际使用了易受攻击的代码路径进行过滤。
## 商业版本
CycloneDX SBOM 导出、Web 仪表板、扫描历史记录、经过身份验证的 API 以及可审计的报告都是托管服务的一部分,不包含在此代码库中。
## 许可证
MIT — 见 [许可证](LICENSE)。
标签:SCA工具, WebSocket, 云安全监控, 依赖分析, 合规风险, 文档结构分析, 逆向工具, 静态分析