PROJECT_REPORT.md:论文式项目报告(摘要 / 目录 / 7 章 / 参考文献 / 致谢 / 附录 A),
4 张 Mermaid 图同样经真实浏览器渲染验证。所有数字都与证据文件逐个核对过。
.scratch/ci-cd/:本次流水线的全部证据与可重跑脚本
* 阶段报告:依赖安全扫描 / 许可证合规 / 阶段 0 静态分析 / 阶段 3 测试与性能
* 证据:分析器原始输出(修复前 84 条、修复后 80 条)、Pester 详细输出、
性能基线 JSON、黑盒用例结果(阶段 1 的 11 例与阶段 2 回归的 12 例)
* 可重跑:blackbox-tests.ps1 / blackbox-regression.ps1 / perf-baseline.ps1
两条边界必须写在明处,不能含糊:
* **VM 内验证只取到修复前的快照**(Pester 183 项全绿)。随后会话审批策略改为 never,
gsudo 提权被自动拒绝(退出码 999),而 Hyper-V 与 PowerShell Direct 都需要管理员,
于是修复后的三套件在 VM 内**没有跑成**。报告里明确标注了范围,没有把"宿主跑绿了"
说成"VM 也跑绿了"。
* **性能基线是首次建立**,无历史可比,故无退化可判;指标只在同机同宿主下对比,
跨机比数字没有意义。
另外记一笔:静态分析的口径是"仓库自己的门禁"。剩余 80 条全是风格类(0 Error),且逐条
有依据 —— 行长 160 是配置里写明的有意偏离,PSPlaceCloseBrace 等集中在测试夹具字符串内
(改了会改变断言语义)。严格模式的"零容忍"在这里与仓库自身约定相抵,选择尊重仓库约定
并在报告里登记,而不是制造一个横跨 12 个文件的纯排版大 diff。
4.2 KiB
4.2 KiB
依赖安全扫描报告(dependency-security-scanner)
- 项目:BakNRet(Windows 备份 / 恢复工具,PowerShell)
- 扫描时间:2026-09-28
- 扫描范围:仓库根目录及全部子目录(排除
.git) - 工具:
npm audit/pip-audit/govulncheck等均不适用(见下)
1. 项目概况
| 项目 | 结论 |
|---|---|
| 语言 | PowerShell(.ps1 / .psm1 / .psd1) |
| 依赖管理文件 | 不存在 —— 全仓无 package.json、package-lock.json、requirements.txt、go.mod、pom.xml、Cargo.toml 等 |
| 运行时依赖 | 0 个模块。运行备份 / 恢复只需要 PowerShell 5.1 或 7.x + 7-Zip |
| 开发期依赖 | Pester 5.9.1、PSScriptAnalyzer 1.25.0 —— 装在 .tools/,已 gitignore,不随发布产物分发 |
| 外部可执行文件 | 7z.exe(7-Zip 26.03,经 scoop 安装) |
Note
依赖扫描技能面向「有包管理器的项目」。本项目没有任何包管理器依赖,因此
npm audit/safety/govulncheck一类工具无对象可扫。下面改为对本项目真实的供应链面 逐项核对,而不是输出一份空报告。
2. 供应链面核对
| 组件 | 来源 | 版本 | 是否随分发 | 风险 |
|---|---|---|---|---|
| PowerShell 引擎 | 操作系统 / Microsoft | 5.1.26100.9502、7.7.0-preview.5 | 否(宿主环境) | 由宿主维护;预览版仅供本机验收使用 |
| 7-Zip | scoop(C:\Programs\Scoop\apps\7zip\26.03) |
26.03 | 否(用户自备) | 归档/解压的执行者,必须由用户保持更新 |
| Pester | 仓库内 .tools/modules/Pester/5.9.1 |
5.9.1 | 否(gitignore) | 仅测试期使用,不接触用户数据 |
| PSScriptAnalyzer | 仓库内 .tools/modules/PSScriptAnalyzer/1.25.0 |
1.25.0 | 否(gitignore) | 仅静态分析使用 |
| 其余第三方 | 无 | — | — | — |
已知 CVE:无可报。本项目的依赖面里没有任何「被本项目固定版本」的第三方库 (Pester 与 PSScriptAnalyzer 是测试工具且不进分发,7-Zip 与 PowerShell 由用户环境提供)。 若要追查这两个工具的 CVE,应查上游公告,而不是本仓库。
3. 与安全相关的项目事实(实跑核对)
| 检查项 | 结果 |
|---|---|
| 仓库是否跟踪任何密钥文件 | ✅ 否(git ls-files 中无 *.key / *.pfx) |
baknret.key 是否被 gitignore |
✅ 是(.gitignore:18: *.key) |
工作区是否存在口令文件 baknret.key |
⚠️ 是 —— 见风险 R-2 |
| 口令是否可能落进日志 | ✅ 已处理:打印前把 -p 参数换成占位符(tests/BakNRet.Tests.ps1 有专门断言) |
| 日志中是否出现明文口令 | ✅ 无 |
.tools/ 是否可能进分发产物 |
✅ 否(已 gitignore,且构建脚本只读 BakNRet/ 与 tools/) |
4. 风险清单
| ID | 严重程度 | 风险 | 证据 | 建议 |
|---|---|---|---|---|
| R-1 | 一般 | 仓库没有 LICENSE 文件,许可证状态未声明 |
根目录无 LICENSE* |
补一份许可证(见 license_check_report) |
| R-2 | 一般 | 工作区存在口令文件 baknret.key(未被跟踪,但确实在仓库目录里) |
Test-Path baknret.key = True |
本项目自己的 CHANGELOG 已把「口令文件的出厂默认值指向仓库内」定为待修问题,BackupConfig.psd1 的注释也推荐放到仓库外。建议移到 %USERPROFILE%\.baknret.key 并用 -KeyFile 指过去。本报告不读取、不记录其内容 |
| R-3 | 建议 | 7-Zip 版本由用户环境决定,脚本不检查版本 | Find-BakNRet7zExecutable 只找路径 |
可选:在启动时打印 7z 版本,便于排障 |
| R-4 | 建议 | 口令经命令行传给 7z,本机进程列表可见 | 上游限制,README 已用 CAUTION 声明 | 无技术解法,保持文档披露即可 |
致命 / 严重漏洞:0 个。 流水线可继续。
5. 结论
未发现已知安全漏洞。本项目零运行时依赖,是当前最重要的一条供应链优势; 唯一两条「一般」级风险都属于卫生问题(缺许可证、口令文件放在仓库目录里), 不影响流水线继续执行。