依赖安全设计
范围:npm manifest 和 lockfile,并共享记录并行的 Python 依赖工作。源码与已安装 App 的边界分别记录。
当前实现与已验证缺口
仓库使用 npm workspaces 管理 apps/web, apps/desktop以及 apps/cli。Web 应用使用 App Router,配置为 output: "export";生成文件由 Python worker 提供。桌面使用 Electron 和 electron-builder。根 lockfile 包含所有 workspace 的运行、构建及可选依赖图。
位于以下路径的规范 Dependabot 清单 /tmp/openprogram-completion-audit/dependabot-open.json 在基线记录了 194 个未关闭警报:18 个包名对应 154 个 npm 警报,以及以下文件中的 40 个 pip 警报: uv.lock。npm 基线含 6 个 critical、54 个 high、78 个 medium 和 16 个 low 警报;55 条为直接依赖,99 条为传递依赖。被忽略的报告 reports/content-security/npm-dependency-security-baseline.md 记录精确公告、范围、版本与命令。范围核对将 GitHub 逗号分隔的范围作为 semver 合取处理,解析错误时失败。
参考资料与框架比较
修复版本来自 GitHub 公告和包注册表。修改 lockfile 前通过 npm view 检查注册表元数据。所选框架版本要求 Node 22.12 或更新,因此根 engine 合同、CI 启动和开发环境设置必须使用相同最低版本。
| 领域 | 现有能力 | 缺失能力或风险 | 决策 |
|---|---|---|---|
| Next.js | App Router、静态导出、客户端运行时 API;打包路径没有 Next 服务端。 | 已安装的 14.2.35 符合当前 Next 公告的受影响范围,Next 16 移除了 next lint. | 使用 Next 16.3.5,配合 eslint 9 和直接 lint 脚本。manifest 路由通过 dynamic = "force-static" 以及现有 webpack 构建保持静态导出。 |
| Electron | 原生外壳、preload 隔离、打包运行时和 loopback worker URL。 | Electron 37.10.3 符合 lockfile/直接依赖记录中的受影响范围。 | 使用 Electron 44.4.3。其包和解包 App 声明最低 macOS 13;desktop 检查覆盖源码 API。进行本地 App 验收前,打包必须替换已安装的 Electron bundle。 |
| 位图标注 | 图片裁剪、旋转、绘制、文本、形状、保存、撤销、重做,以及选择/拖动编辑。 | tui-image-editor 包含有漏洞的 Fabric 4 依赖链,替代方案必须保留标注交互。 | 移除 tui-image-editor ,直接使用维护中的 Fabric 7.4.0 作为原生 canvas 上的透明标注层。裁剪和旋转将标注合成到图像;导出前仍支持选择、移动、调整大小和文本编辑。 |
| npm 传递依赖图 | 一个 npm lockfile 固定可复现的 workspace 依赖。 | 旧的嵌套 tar, form-data, postcss, extract-zip及遗留 HTTP 包仍在依赖图中。 | 更新兼容的传递依赖路径;若没有修复版本则移除不再维护的依赖链。最终 lockfile 逐一核对全部公告范围,包括包已不存在的记录。 |
| Python 依赖图 | uv.lock 由 Python 依赖工作独立管理。 | AnyIO、torch、setuptools 和其他 pip 公告必须依据精确修复范围核对。 | 保留相同清单、证据和完整门禁合同;并行负责人在整合前提供 Python 版本变更与证据。 |
官方参考: Next.js 16 升级指南, Next.js 16.3.5 发布, Electron 44 发布, Fabric 公告 GHSA-hfvx-25r5-qc3w, Fabric 公告 GHSA-w22m-hvvm-xmwx,以及被忽略的基线和核对报告中逐项记录的公告链接。
采用、调整与拒绝的选择
- 采用公告中的首个修复版本或更高的兼容稳定版本。用以下工具及规范清单范围验证实际安装依赖图:
npm audit --json。 - 调整直接框架升级以保留静态导出。Web 和根 React 保持现有 React 18 合同;CLI 保持 React 19 合同。只修改 Next 兼容文件和 Node engine 合同。
- 拒绝
npm audit fix --force作为实现方式,因为它可能在没有兼容证据时选择无关的大版本。 - 不因 Web 静态导出或依赖标为开发用途而忽略警报。审计完整声明依赖图;适用性作为证据记录,不用于阻止升级。
- 对于
extract-zip和遗留request,部分清单记录没有可用修复版本。跟踪每个上级依赖,尽可能删除受影响依赖链;对剩余的包不存在记录,列出上级链和测试过的替代方案。
目标架构与边界
所有包解析通过根 npm lockfile。直接 workspace manifest 声明支持的框架与外壳版本;只有上级包需要时才接受嵌套包。构建边界为 npm ci --ignore-scripts ,随后执行 workspace 检查。运行边界包括导出的 Web 资产、Electron main/preload 和提供资产的 Python worker。未经产品既有验证,不得将不可信输入传入包 CLI 或归档解压器。
Electron 包解析本身不会更新现有的 /Applications/OpenProgram.app 。支持的本地流程是用可信运行时基底打包当前 checkout,覆盖安装唯一默认 App,随后运行 scripts/refresh-local-app.sh 一次。验证必须检查已安装 App 实际的 process.versions.electron;源码检查不能证明已安装运行时版本。
Python 依赖工作负责 uv.lock ,并在共享报告中记录主机策略:Intel macOS 支持 BM25,Intel 上没有可选 embedding wheel,macOS arm64 embedding wheel 要求 Python 3.14 或更新。当前验证主机为 macOS 15.7.3。
安全失败按依赖解析失败处理:干净安装、审计、类型检查、构建或受影响测试失败均阻止完成,并记录精确命令。兼容失败时,旧 manifest 保留在 Git,直到最小源码调整通过受影响检查。本项工作不含远程写入、发布、已安装 App 刷新或 Python 源码修改。
验收条件
- 最终 commit 中,每个直接 npm manifest 版本和每个 lockfile 实例均不在规范清单中适用公告的受影响范围内;不忽略或隐藏警报。
npm ci --ignore-scripts在支持的 Node/npm engine 上成功,npm audit --json报告零漏洞,规范范围核对没有受影响 npm 版本。若上游仍有无补丁公告,报告必须列出其上级依赖链、原因和测试过的替代方案。npm run build --workspace apps/web,npm run typecheck --workspace apps/cli,npm test --workspace apps/web,npm run check:web,npm run check:desktop以及npm run check:cli均从干净安装运行。最终报告区分既有源码失败和依赖引入的失败。- 最终 diff 仅包含依赖 manifest/lockfile、必要的 Next/Electron 兼容源码、规范设计和忽略证据的规则。限定范围提交后工作树干净。
完整门禁清单
npm ci --ignore-scriptsnpm audit --json以及针对最终 lockfile 的规范核对脚本npm run build --workspace apps/webnpm run typecheck --workspace apps/cli和npm test --workspace apps/clinpm test --workspace apps/web和npm run check:webnpm run check:desktopgit diff --check、manifest/lockfile 一致性及干净工作树验证
实现状态
npm 候选使用 Next 16.3.5、Electron 44.4.3、Fabric 7.4.0,以及 lockfile 记录的修复后传递依赖图。源码检查覆盖静态导出、直接 lint 调用、原生桌面功能和位图编辑器的裁剪、旋转、绘制、标注、保存、撤销、重做及销毁路径。Python 部分仍是独立 uv.lock 变更的协调边界。最终审计计数、核对输出和残留源码测试失败记录在被忽略的最终记录中。