nnatuan03/auto-scan-vuln-license

GitHub: nnatuan03/auto-scan-vuln-license

一款自动化依赖漏洞与许可证扫描工具,通过一条命令完成 SBOM 生成、漏洞检测与许可证规范化,并输出汇总报告。

Stars: 0 | Forks: 0

# 自动扫描漏洞与许可证 **目标:** 只需在源码目录下运行一条命令——工具会自动处理剩余的所有工作,从检测、生成 SBOM、扫描、规范化许可证,到生成最终报告。 ## 目录 1. [快速开始](#bắt-đầu-nhanh) 2. [命令行界面](#giao-diện-dòng-lệnh) 3. [进度面板](#dashboard-tiến-độ) 4. [安装要求](#yêu-cầu-cài-đặt) 5. [支持的代码库类型](#các-loại-mã-nguồn-được-hỗ-trợ) 6. [扫描流程](#luồng-quét) 7. [ITS 文档对照](#đối-chiếu-tài-liệu-its) 8. [代码结构](#cấu-trúc-mã-nguồn) 9. [输出结果](#đầu-ra) 10. [使用报告](#sử-dụng-báo-cáo) 11. [排查结果缺失/错误](#gỡ-lỗi-khi-kết-quả-thiếusai) 12. [多生态系统测试矩阵](#ma-trận-kiểm-thử-đa-ecosystem) 13. [CLI 选项](#tùy-chọn-cli) 14. [安全与源码保护注意事项](#lưu-ý-bảo-mật--an-toàn-mã-nguồn) 15. [常见问题](#lỗi-thường-gặp) ## 快速开始 ### Windows / PowerShell ``` .\run_scan.ps1 -Path "D:\Projects" ``` ### 所有操作系统 — 直接使用 Python 运行 ``` python autoscan.py "D:/Projects" ``` ### `Path` 参数的含义 - 如果 `Path` 指向**单个项目**(包含 `pom.xml`、`package.json`、`pubspec.yaml` 等)—— 工具将扫描单个项目。 - 如果 `Path` 指向包含多个一级子服务的**父目录** —— 工具会自动检测每个服务,并行扫描并合并报告。 - 没有识别**标记**的一级目录仍会通过 `trivy fs` 进行扫描,并标记为 `kind = unknown`,以避免遗漏。 运行完成后,打开汇总报告: ``` D:\Projects\scan-results\consolidated-report.html ``` ## 命令行界面 在扫描过程中,终端会为调用的**每个外部命令**(Maven、Gradle、npm/npx、Flutter、Trivy 等)实时打印日志,每组命令都有各自的颜色: ``` [RUN] trivy sbom --scanners vuln,license --format json ... [OK ] exit=0 time=1.24s trivy sbom --scanners vuln,license --format json ... [FAIL] exit=1 time=0.42s gradle cyclonedxBom ``` 批量扫描时,将出现一个不断更新的**进度面板**(见下一节)。 完成后,终端会打印**摘要**: ``` Auto Scan Summary ================= Root : D:\Projects Run output : D:\Projects\scan-results\20260609-153000 Projects : 10 OK : 8 FAIL : 2 Report : D:\Projects\scan-results\20260609-153000\consolidated-report.html Stable copy: D:\Projects\scan-results\consolidated-report.html Debug : D:\Projects\scan-results\20260609-153000\debug-report.md Stable dbg : D:\Projects\scan-results\debug-report.md [OK ] backend-api [maven] vulns=4 licenses=87 sbom=ok [OK ] web-portal [node] vulns=2 licenses=43 sbom=ok [FAIL] legacy-app [gradle] vulns=0 licenses=0 sbom=fail error: gradle cyclonedxBom exited with code 1 ``` ## 进度面板 每当一个服务完成或开始合并报告时,进度面板都会自动更新: ``` Auto Scan Dashboard =================== Stage : scanning Progress : [###############---------------] 5/10 ( 50.0%) Status : DONE=5 OK=5 FAIL=0 RUNNING=5 Elapsed : 03:20 ETA : 03:20 ``` - **Stage** —— 当前阶段:`scanning` 或 `merging`。 - **Progress** —— 文本进度条 + 百分比。 - **Status** —— 处于 `DONE` / `OK` / `FAIL` / `RUNNING` 状态的服务数量。 - **Elapsed / ETA** —— 已运行时间和预计剩余时间。 如果需要为 CI 保留精简日志,可以通过 `--no-dashboard` (CLI) 或 `-NoDashboard` (PowerShell) 关闭面板。 ## 安装要求 ### 必需项 | 组件 | 最低版本 | 备注 | | --- | --- | --- | | **Python** | **3.10+** | 工具使用了 `PEP 604` 语法 (`list[str] \| None`, `X \| Y`)。 | | **Trivy** | 最新版 | 必须在 `PATH` 中可用。 | | **PowerShell** | 5.1+ (Windows) | 仅在使用 `run_scan.ps1` 包装器时需要。 | ### 推荐项 —— 为了在各生态系统中获得更准确的 SBOM | 生态系统 | 首选工具 | 回退机制 | | --- | --- | --- | | **Maven** | 项目中的 `mvnw` / `mvnw.cmd` | `PATH` 中的 `mvn` | | **Gradle** | 项目中的 `gradlew` | `PATH` 中的 `gradle` | | **Node.js** | `node`, `npm`, `npx` | — | | **.NET** | `dotnet` | 如有缺失,自动安装 `dotnet-CycloneDX` | | **Flutter** | `flutter` | — | ### 快速检查 ``` python --version trivy --version ``` ### 配置 Python 环境 该工具**仅使用 Python 的标准库**,因此无需额外的 `pip install`。但是,为了保持环境的一致性和可重复性,建议使用代码库附带的 `requirements.txt` 文件(该文件仅包含指导注释——相当于为 `pip install -r requirements.txt` 提供“锚点”)。 ``` python -m venv .venv # Windows .venv\Scripts\activate # macOS / Linux source .venv/bin/activate pip install -r requirements.txt ``` ## 支持的代码库类型 | 生态系统 | 识别标记 | | --- | --- | | **Maven** | `pom.xml` | | **Gradle** | `build.gradle`, `build.gradle.kts`, `settings.gradle`, `settings.gradle.kts`, `gradlew`, `gradlew.bat` | | **Node.js** | `package.json`, `package-lock.json`, `npm-shrinkwrap.json`, `yarn.lock`, `pnpm-lock.yaml`, `bun.lock`, `bun.lockb` | | **Flutter** | `pubspec.yaml` | | **.NET** | `.sln`, `.csproj` | | **Python** | `requirements.txt`, `pyproject.toml`, `Pipfile`, `poetry.lock` | | **Go** | `go.mod` | | **PHP** | `composer.json`, `composer.lock` | | **Ruby** | `Gemfile`, `Gemfile.lock` | | **Unknown** | 没有标记的一级目录 —— 回退到 `trivy fs` | 如果没有专用的生成器或生成器报错,工具**始终会回退**到: ``` trivy fs --format cyclonedx ``` ## 扫描流程 对于**每个**项目 / 服务: 1. 根据标记**检测代码库类型**。 2. 针对当前扫描**始终生成新的 SBOM** —— *不复用* 源码中已有的 SBOM,以避免重新扫描时出现旧结果。 3. **预构建内部 Maven lib**(如果扫描目录包含多个相互引用的 Maven 项目): - 读取所有 `pom.xml`,查找被同一源码目录下其他项目引用的 Maven 项目。 - 在扫描前,对内部 lib / parent 运行 `mvn clean install -DskipTests -Dmaven.test.skip=true -DskipITs`。 - 目标:确保本地 `.m2` 中包含完整的 `.jar` 和 `.pom`,避免因缺少内部 lib 元数据而导致服务扫描到旧版本的 dependency。 - 可以通过此选项跳过此步骤以进行快速调试:`--skip-maven-prebuild` (CLI) 或 `-SkipMavenPrebuild` (PowerShell)。 4. 如果存在合适的工具,则**根据生态系统生成 SBOM**: | 生态系统 | 首选命令 | 备注 | | --- | --- | --- | | Maven | 优先使用 `mvnw.cmd` / `mvnw`,回退到 `mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom -DskipTests` | | | Gradle | `gradlew cyclonedxBom` 或 `gradle cyclonedxBom` | 如果缺少插件,则使用临时 init script 应用 `org.cyclonedx.bom` v2.3.1 —— **不修改** `build.gradle.kts`。 | | Node.js (npm lock) | `npx --yes @cyclonedx/cyclonedx-npm --ignore-npm-errors --package-lock-only` | | | Node.js (yarn / pnpm / bun) | 回退到 `trivy fs` | | | .NET | `dotnet-CycloneDX -j` | 如果缺少工具但存在 `dotnet`,会自动运行 `dotnet tool install --global CycloneDX`。 | | Flutter / Python / Go / PHP / Ruby / unknown | 回退到 `trivy fs` | | 如果专用生成器失败或未生成新的 SBOM → 回退到 `trivy fs --format cyclonedx`。 5. 将 SBOM 中的版本与在当前源码 / lock file 中找到的最新版本进行 **核对(Reconcile)**。例如:Node 同时有 `package-lock.json` 和 `yarn.lock`,如果 SBOM 输出为 `1.80.0`,但 `package.json` / `yarn.lock` 处于 `1.84.0` —— 工具会在扫描前将 SBOM 更新为 `1.84.0`。工具**不会主动查询 registry** 来升级源码之外的 dependency。 6. 将许可证**规范化**到 `SBOM.cdx-fix.json`。 7. 对每个服务**仅运行一次 Trivy**: - `trivy sbom --scanners vuln,license --format json` → `report.json`。 - 从 `report.json` 中提取出 `license.json`、`license.txt`、`vuln.json`。 - 这种方式保持了与之前相同的输出,但减少了每个服务调用 Trivy 的次数。 8. 将 `SBOM.cdx-fix.json` 中的许可证与 `report.json` / `license.json` 进行**比对**;如果 Trivy 返回的 package 许可证缺失,工具会自动从 SBOM 中补充。未声明许可证的组件将显示为 `LicenseRef-No-Declared-License`,以防止其被“静默遗漏”。 9. 为每个服务**生成 HTML 报告**: - `report.html` - `report-vuln.html` 10. 将所有服务**合并**为 `consolidated-report.html`。 11. **生成调试报告** `debug-report.md` / `debug-report.json`,用于对照文档并调试各个服务。 ## ITS 文档对照 该工具覆盖了文档中的许可证 / dependency 扫描用例,不包括已排除在范围之外的部分: | 文档中的用例 | 工具的处理方式 | | --- | --- | | Trivy dependency vulnerability scan | 运行 `trivy sbom --scanners vuln --format json`,随后生成 `report-vuln.html`。 | | Gradle license scan | 运行 `gradlew / gradle cyclonedxBom`;如果缺少插件,则使用带有 `org.cyclonedx.bom` v2.3.1 的临时 init script。 | | Maven license scan | 如果其他服务依赖于源码目录中的内部 Maven lib,则进行预构建 / install,随后运行 `mvnw / mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom`。 | | Node.js npm / package-lock license scan | 运行 `npx --yes @cyclonedx/cyclonedx-npm --ignore-npm-errors`;如果存在 npm lock,则使用 `--package-lock-only`。 | | .NET license scan | 如有缺失则自动安装 `CycloneDX`,然后在 `.sln` / `.csproj` 上运行 `dotnet-CycloneDX`。 | | Normalize SBOM trước khi scan license | 通过内部 normalize 模块创建 `SBOM.cdx-fix.json`。 | | License TXT / JSON | 为每个服务创建 `license.txt` 和 `license.json`。 | ### 有意为之的差异 - 每次扫描都会在 `scan-results\` 中生成新的 SBOM,**不写入 / 不将 dependency 放入 `third-party`**,以避免重新扫描时使用旧的 SBOM。 - Gradle **不修改** `build.gradle` / `build.gradle.kts`;临时 init script 仅保留在输出目录中。 - `report-vuln.html` 是使用**内部模板**从 `vuln.json` 生成的,而不是使用 Trivy 的 `html.tpl`。 - 根据确定的范围,当前已排除 SonarQube 以及 CI/CD / Jenkins / email 脚本。 ## 代码结构 ``` auto-scan-vuln-lic/ ├── autoscan.py # Entrypoint chính, nhận path và điều phối quét ├── run_scan.ps1 # Wrapper PowerShell trên Windows ├── README.MD # File này ├── requirements.txt # Cài đặt môi trường Python (xem chi tiết) │ ├── autoscan/ │ ├── __init__.py │ ├── batch.py # Quét nhiều project / service song song và gộp báo cáo │ ├── config.py # Hằng số cấu hình, marker hệ sinh thái, ignore-dir │ ├── debug_report.py # Sinh debug report đối chiếu tài liệu, marker, command, count SBOM / license │ ├── dependency_health.py # Phát hiện lock file thiếu / cũ và mismatch manifest ↔ lock trước khi sinh SBOM │ ├── detector.py # Tự phát hiện Maven, Gradle, Node, Flutter, .NET, Python, Go, PHP, Ruby │ ├── license_inventory.py # Bù license từ SBOM vào report nếu Trivy không trả đủ dòng license │ ├── license_normalizer.py # Chuẩn hóa license SBOM về SPDX / LicenseRef │ ├── license_rules.py # Bộ rule normalize license từ tên vendor / free-text về SPDX ID │ ├── maven_prebuild.py # Prebuild / install lib Maven nội bộ trước khi quét │ ├── models.py # Dataclass: Project, CommandRecord, ScanResult │ ├── package_names.py # Khôi phục package name bị thiếu từ PURL, PkgID, node_modules path, license file path, Target │ ├── progress.py # Dashboard terminal: tiến độ %, elapsed, ETA │ ├── sbom_generator.py # Sinh SBOM theo từng loại mã nguồn, fallback `trivy fs` │ ├── scanner.py # Quét một project / service │ ├── terminal.py # In command, status, màu terminal / PowerShell │ ├── trivy_runner.py # Chạy Trivy và sinh output JSON / TXT │ ├── utils.py # Tiện ích chung: subprocess, JSON, ensure_dir, copy_file │ ├── version_reconciler.py # Đối chiếu version SBOM với lock file / manifest hiện tại │ └── reporting/ │ ├── __init__.py │ ├── merge_report.py # Engine sinh report HTML tổng hợp │ ├── reports.py # Facade gọi generator single / merged │ └── single_report.py # Engine sinh report HTML cho từng service │ └── tests/ └── ecosystem_matrix.py # Tạo fixture nhiều ecosystem để test detect / dependency-health / report recovery ``` ## 输出结果 ### 运行示例 ``` python autoscan.py "D:/Projects" ``` ### 结果目录结构 ``` D:\Projects\scan-results\ ├── consolidated-report.html # Bản ổn định (ghi đè) trỏ tới lần chạy mới nhất ├── scan-summary.json # Bản ổn định ├── debug-report.md # Bản ổn định ├── debug-report.json # Bản ổn định │ └── 20260609-153000\ # Thư mục theo timestamp mỗi lần chạy ├── consolidated-report.html ├── scan-summary.json ├── debug-report.md ├── debug-report.json └── services\ ├── backend-api\ │ ├── SBOM.cdx.json │ ├── SBOM.cdx-fix.json │ ├── license-normalize.log │ ├── report.json │ ├── report.html │ ├── report-vuln.html │ ├── license.json │ ├── license.txt │ ├── vuln.json │ └── scan.log └── web-portal\ └── ... ``` ### 重要文件 | 文件 | 作用 | | --- | --- | | `consolidated-report.html` | 最终的汇总报告 —— 打开此文件查看全貌。 | | `scan-summary.json` | 机器可读的摘要:OK / FAIL,统计 vuln / license,各个服务的输出路径。 | | `debug-report.md` | Markdown 格式的调试报告:文档对照、检测到的服务、已执行的命令、SBOM / license 计数。 | | `debug-report.json` | JSON 格式的调试报告 —— 在需要后续追踪时用于发送 / 解析。 | | `services\\scan.log` | 详细的命令日志,用于调试。 | | `services\\license-normalize.log` | 统计 SBOM 中拥有许可证的组件数量以及已规范化的许可证。 | ## 使用报告 打开文件: ``` scan-results\consolidated-report.html ``` 报告包含: - vulnerability / license 的**概览**。 - **vulnerability 表格** —— 按 package、severity、category、action 进行筛选。 - **license 表格** —— 进行类似筛选,但没有 category / action 列。 - **导出 Excel** —— 报告中直接提供 **Export Excel** 按钮。 ### 导出 Excel HTML 报告内置了 **Export** 按钮。Excel 文件将下载到本地。特点: - `Severity` 带有颜色标识: - `CRITICAL` —— 深红色 - `HIGH` —— 红色 - `MEDIUM` —— 黄色 - `LOW` —— 绿色 - 如果每个 package 有多行(例如:多个 CVE),这些行会**合并**在顶部,以便于阅读。 - `License` 工作表**移除**了 `Category` 和 `Action` 列。 ## 排查结果缺失/错误 ### 第 1 步 —— 先进行 Dry-run 运行 dry-run 以查看工具检测到了多少个服务: ``` python autoscan.py "D:/Projects" --dry-run ``` ### 第 2 步 —— 打开调试报告 ``` D:\Projects\scan-results\debug-report.md ``` 按顺序检查: | 调试项 | 检查内容 | | --- | --- | | `Document Coverage` | 哪些用例已覆盖,哪些是有意与文档不同,哪些被排除了。 | | `Services` | 检测到了哪些服务,属于什么类型,基于什么标记,通过哪个生成器生成的 SBOM。 | | `Maven Prebuild` | 在扫描前有哪些内部 Maven lib / parent 被 `mvn clean install`,哪些命令失败了。 | | `Dependency health` | 警告缺失的 lock file、manifest 中声明但 lock 中缺失的 dependency,或者 manifest 版本高于 lock 版本的情况。 | | `Commands` | 实际执行的命令及其 exit code。 | | `Retry / fallback note` & `Command failures` | 后续失败 / 成功的命令,并附带 stderr 尾部信息 —— 用于查看回退原因。 | | `Pkg name recovery` | 原始报告缺失 package name 的行数,工具恢复的行数,以及仍然未知的行数。 | | `Version updates` | SBOM 中被升级到源码 / lock file 里找到的更高版本的组件数量。 | | `Fixed components` | `SBOM.cdx-fix.json` 中的组件数量;如果数量本身缺失,则错误出在生成 SBOM 的步骤。 | | `SBOM license rows` & `Trivy licenses` | 如果 SBOM 具备完整的 license rows 但 Trivy 缺失,工具会将其 backfill(回填)到报告中。 | ### 常见的 dependency health 状态 | 状态 | 含义 | | --- | --- | | `DEPENDENCY_HEALTH_OK` | 在工具支持的用例中未发现 manifest / lock 不匹配的情况。 | | `LOCK_FILE_MISSING` | 有 manifest (`package.json`, `pubspec.yaml`, `composer.json`, `Gemfile`, …) 但缺少相应的 lock file。 | | `MANIFEST_LOCK_MISMATCH` | manifest 要求更高的版本,但 lock 依然解析为旧版本 —— 扫描将以 lock / SBOM 为准。 | | `LOCK_DEPENDENCY_MISSING` | manifest 声明了 dependency,但 lock 中不存在该 dependency。 | | `UNPINNED_DEPENDENCY` | Python `requirements.txt` 中的 dependency 没有通过 `==` 指定固定版本 (pin)。 | | `BUILD_FILE_MISSING` | 找不到足以根据生态系统解析 dependency 的 build / dependency manifest。 | ## 多生态系统测试矩阵 运行本地测试夹具,**无需安装** Maven / Gradle / Flutter / PHP / Go: ``` python tests/ecosystem_matrix.py ``` 测试会自动生成 **Maven, Gradle, Node, Flutter, .NET, Python, Go, PHP, Ruby** 以及 `unknown source` 的示例代码。它验证了以下用例: - Lock file 正常。 - 缺失 Lock file。 - manifest 声明的版本高于 lock。 - manifest 中的 dependency 在 lock 中缺失。 - Python dependency 未指定固定版本。 - 报告恢复了缺失的 package name。 ## CLI 选项 ### 常见示例 ``` # 增加并行扫描的 worker 数量 python autoscan.py "D:/Projects" --max-workers 6 # 增加嵌套 project 的搜索深度(对 monorepo、位于 apps/ packages/ frontend/ 的 frontend 很有用) python autoscan.py "D:/Projects" --recursive-depth 4 # 跳过单独的 generator,仅使用 trivy fs python autoscan.py "D:/Projects" --trivy-only # 仅 detect,不运行 Trivy / 外部 tool python autoscan.py "D:/Projects" --dry-run # 关闭 dashboard 进度(为 CI 简化 log) python autoscan.py "D:/Projects" --no-dashboard # 不在 terminal 中打印每个 command,关闭颜色 python autoscan.py "D:/Projects" --hide-commands --no-color # 更改 output folder python autoscan.py "D:/Projects" --output "D:/Audit/scan-results" ``` ### 选项表格 | 选项 | 描述 | | --- | --- | | `--max-workers` | 并行扫描的项目数。默认为 `4`。 | | `--recursive-depth` | 查找子项目 / 嵌套项目的深度。默认为 `5`。 | | `--trivy-only` | 跳过 Maven / Gradle / Node / .NET 生成器,仅使用 `trivy fs`。 | | `--skip-maven-prebuild` | 跳过扫描前针对内部 Maven lib 的 `mvn clean install` 步骤。仅建议在快速调试时使用。 | | `--dry-run` | 仅检测项目,不运行 Trivy 或任何外部工具。 | | `--output` | 更改默认输出文件夹 (`/scan-results`)。 | | `--no-dashboard` | 在终端中关闭进度面板。 | | `--hide-commands` | 不在终端中打印每一条命令。 | | `--no-color` | 关闭终端颜色。 | ### PowerShell 包装器 —— 对应选项 ``` .\run_scan.ps1 -Path "D:\Projects" -MaxWorkers 6 -RecursiveDepth 4 .\run_scan.ps1 -Path "D:\Projects" -TrivyOnly .\run_scan.ps1 -Path "D:\Projects" -SkipMavenPrebuild .\run_scan.ps1 -Path "D:\Projects" -DryRun .\run_scan.ps1 -Path "D:\Projects" -NoDashboard .\run_scan.ps1 -Path "D:\Projects" -HideCommands -NoColor ``` ## 安全与源码保护注意事项 - **默认不修改源码。** 所有附属产出物 (`build/`, `target/`, `SBOM.cdx.json`, …) 都位于输出目录中。 - **Gradle:** 如果 task / plugin 已存在,则优先使用 `cyclonedxBom`。如果缺少插件,工具会在输出目录中创建**临时 init script** 以根据文档应用 CycloneDX 插件;**不修改** `build.gradle.kts`。 - **Node.js:** 如果存在 `package-lock.json` / `npm-shrinkwrap.json`,则使用 `cyclonedx-npm --package-lock-only` 以**不依赖** `node_modules`。如果是 yarn / pnpm / bun,则回退到 `trivy fs` 读取相应的 lock。如果既没有 lock file 也没有 `node_modules`,报告将仅依赖于 Trivy 从源码读取到的信息 —— 因此请提交 lock file 以扫描完整的 dependency。 - **Node.js 包含多个 lock file:** 根据 `package.json`、`package-lock.json`、`npm-shrinkwrap.json` 和 `yarn.lock` 中找到的**最高版本**核对 SBOM,避免旧 lock 导致报告输出的版本低于当前源码。 - **Frontend monorepo / workspace:** 会继续在 `apps/`、`packages/`、`frontend/` 等目录中寻找子项目,而不是在父级 `package.json` 处停止。 - **Flutter mobile:** 扫描 Flutter 根目录,并**跳过** `android`、`ios`、`web`、`windows`、`linux`、`macos` 等平台文件夹,不将其视为独立项目,以避免子目录导致报告版本重复 / 累加。如果 `packages/` 中的 Flutter package 包含 `pubspec.yaml`,仍会被单独检测。 - **Maven / Gradle / .NET:** 可能会根据原始工具的机制在 `target/`、`build/` 或 SBOM 输出中生成文件。 - **所有命令均通过参数列表执行**(使用 `subprocess.run([...])`),**不使用 shell 字符串拼接** —— 避免在 `path` 包含特殊字符时出现注入风险。 ## 常见问题 ### Frontend 扫描缺失 package 按顺序检查: 1. 运行 `--dry-run` 查看工具是否检测到了所有子应用 (`apps/web`, `packages/ui`, `frontend/admin`, …)。 2. **建议提交 lock file** (`package-lock.json`, `npm-shrinkwrap.json`, `yarn.lock`, `pnpm-lock.yaml`, `bun.lock`, `bun.lockb`)。如果仅有 `package.json`,工具无法获知完整的 transitive dependency / version。 3. 如果前端应用嵌套层级超过 5 层,请增加 `--recursive-depth`。 4. 如果使用 npm 并且存在 `package-lock.json`,工具将使用 `--package-lock-only` —— **不需要** `node_modules`。 5. 如果终端 / CI 设置了 `NODE_ENV=production`,Node SBOM 生成器仍会在取消设置 `NODE_ENV` 的情况下运行,以免自动忽略 `devDependencies`。 ### License 扫描缺失 package 按顺序检查: 1. 打开 `services\\license-normalize.log` —— `Components total` 和 `Components with licenses` 行显示了 SBOM 中包含的组件 / 许可证数量。 2. 如果 SBOM 包含许可证,但 Trivy 没有在 `license.json` 中全部返回,工具会**自动将** `SBOM.cdx-fix.json` 中缺失的行补充到 `report.json` 和 `license.json` 中。 3. 如果组件在 SBOM 中**没有许可证**,报告将显示带有 `UNKNOWN` 严重程度的 `LicenseRef-No-Declared-License`,以便审核人员手动处理。 4. 如果 `Components total` 已经缺少 package,原因在于生态系统的**生成 SBOM / 生成器**步骤 —— 而不是报告。 ### `trivy not found in PATH` 安装 Trivy 并打开新的终端: ``` trivy --version ``` 官方安装指南: ### 无法检测到项目 运行 dry-run: ``` python autoscan.py "D:/Projects" --dry-run --recursive-depth 5 ``` - 如果仍然没有发现,请检查文件夹中是否包含标记文件 (`pom.xml`, `package.json`, `.csproj`, `go.mod`, …)。 - 如果根目录是包含多个服务的父文件夹,则没有标记的一级文件夹将显示为 `[unknown]`,并且仍会通过 `trivy fs` 进行扫描。 ### Maven / Gradle / Node / .NET 生成器失败 如果可能,工具将回退到 `trivy fs`。详情请见: ``` scan-results\\services\\scan.log ``` ### Export Excel 按钮无效 HTML 报告正在从 CDN 加载 `xlsx-js-style` 库。计算机需要访问互联网,或者在内部环境中预先缓存 CDN。 ## 许可证 内部工具 —— 关于使用和分发方式,请参考您所在组织的政策。
标签:AI合规, SBOM, 依赖管理, 后台面板检测, 多人体追踪, 安全合规, 开源许可协议, 暗色界面, 硬件无关, 网络代理, 逆向工具