ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ClickHouse diff-review 的 vendor 目录:用本地化 ESM 依赖与 SHA-256 审计切断 diff 审查的 CDN 供应链风险

ClickHouse diff-review 的 vendor 目录:用本地化 ESM 依赖与 SHA-256 审计切断 diff 审查的 CDN 供应链风险 ClickHouse diff-review 的 vendor 目录用本地化 ESM 依赖与 SHA-256 审计切断 diff 审查的 CDN 供应链风险【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文以 ClickHouse 仓库中diff-review技能的 vendor 依赖清单.claude/skills/diff-review/vendor/README.md为主体完整解读这套本地化前端依赖的组成、每个文件的来源与 SHA-256 指纹、server.mjs的消费方式与固定白名单机制以及官方给出的再生产/升级流程。读完你可以掌握一种可复制的实践把一个含密钥级敏感数据未提交本地 diff的浏览器 UI 的第三方 JS 依赖完全离线化并用哈希指纹与导入审计建立可验证的供应链边界。背景diff-review 为什么把依赖全部 vendor 进仓库diff-review是 ClickHouse 仓库内置的一个 Claude 技能用于在提交或开 PR 之前让用户在浏览器里审查工作区变更它启动一个只绑定 loopback 的本地服务器默认http://localhost:3000用pierre/diffs的 CodeView 渲染工作树 diff收集用户按行写的评论最终回传 JSON 给会话完整工作流见 SKILL.md。关键在于被审查的数据敏感性diff 里包含尚未提交的本地改动——未推送的密钥、半成品凭据、内部路径都可能出现在里面。SKILL.md 对此有一句明确表述“pierre/diffsis vendored (seevendor/README.md), so no network access is needed and no third-party CDN ever sees the diff.” 而 vendor README 把风险讲得更具体一旦 UI 在运行时从 CDN 加载 JS一个被攻陷的 CDN 就能把正在被审查的 diff 外带出去。因此整套 UI 依赖被打包成自包含 ESM bundle 并 vendor 进仓库审查页面在运行时从不发起对任何第三方域名的请求。目录结构一览vendor/README.md —— 依赖清单与审计记录本文主体pierre-diffs-1.2.12.mjs.gz—— gzip 压缩的主 bundle未压缩约 10.4 MB压缩后约 1.71 MB5 个node_*.mjs—— Node 内置模块的浏览器 polyfill消费方server.mjs 与 ui.htmlpierre-diffs-1.2.12.mjs.gz自包含主 bundleREADME 对该文件给出的事实性描述如下它是pierre/diffs1.2.12的自包含 ESM bundle所有依赖均已内联inlined其中包括 shiki 所用的 base64 内嵌 oniguruma wasm语法高亮引擎——也就是说连 wasm 都编码进了 JS没有任何运行时外部资源加载来源是 esm.sh CDN 上pierre/diffs1.2.12的?bundle构建es2022 target精确的下载 URL 记录在 vendor README 中供升级时重新获取未压缩.mjs的 SHA-256为73d1514f14b64925ee47f8afbe885fabd104868c4e3f18e59c3d9a8acf24122a。这条指纹是审计锚点任何人重新解包验证哈希一致才能信任这份 bundle由server.mjs以路径/vendor/pierre-diffs.mjs对外提供。server.mjs如何消费这个 bundleserver.mjs 中有一个固定白名单VENDOR_FILESMap这是“vendor 之外任何东西都不提供”这一安全约束的落点// Vendored UI dependencies (see vendor/README.md). The pierre/diffs bundle was // built by esm.sh and imports its node polyfills by absolute path, so those are // served at the exact /node/*.mjs specifiers the bundle expects. Fixed // allowlist — nothing else under vendor/ or elsewhere is ever served. const VENDOR_FILES new Map([ [/vendor/pierre-diffs.mjs, { file: pierre-diffs-1.2.12.mjs.gz, gzipped: true }], [/node/process.mjs, { file: node_process.mjs }], [/node/buffer.mjs, { file: node_buffer.mjs }], [/node/events.mjs, { file: node_events.mjs }], [/node/tty.mjs, { file: node_tty.mjs }], [/node/async_hooks.mjs, { file: node_async_hooks.mjs }], ]);服务端路由server.mjs对GET /vendor/pierre-diffs.mjs的处理有两个细节值得注意若请求头Accept-Encoding含gzip直接透传.gz原始字节并打上Content-Encoding: gzip否则用gunzipSync内存解压后返回。磁盘上只存压缩版解压零落盘content-type固定为text/javascript; charsetutf-8白名单之外的路径一律 404。UI 端在 ui.html 顶部以 ES Module 方式引入只用到两个导出import { CodeView, parseDiffFromFile } from /vendor/pierre-diffs.mjs;parseDiffFromFile在浏览器侧对每个变更文件对old 内容 new 内容做本地 diff 解析CodeView负责 split/unified 两种视图、行选择与注释annotation渲染——整个过程无网络往返。node_*.mjspolyfill 的绝对路径契约与逐个审计主 bundle 由 esm.sh 构建它对 Node 内置模块的浏览器 polyfill用绝对路径引用/node/process.mjs、/node/buffer.mjs。README 交代了完整的传递依赖链bundle 直接 import/node/process.mjs与/node/buffer.mjsprocess的 polyfill 又传递性地 pull 入events、ttyevents再 pull 入async_hooks。因此server.mjs必须在这五个精确的 specifier上提供响应bundle 才能加载成功。README 对每个文件都记录了来源与 SHA-256并声明“已审计它们不 import、不 fetch、不向任何目标打开连接”。完整清单如下全部来自 vendor/README.mdSHA-256 均已对照仓库实际文件验证一致文件来源esm.sh 路径SHA-256未压缩文件node_process.mjs/node/process.mjs79e7646e87709989f575ea4ce02e0877bc9303081567b1c0d412527917ae9e91node_buffer.mjs/node/buffer.mjs64fb61aa5f48644d685f9ceabedba60ea6b5d6ce03dac1943e863d00d9e574f3node_events.mjs/node/events.mjs4c6150b88c1444aa1fe9331013e3f37eda9836206f629f7f3ae8f3743dd90fa8node_tty.mjs/node/tty.mjsc66ff4b406bad449bfb2ced355f15badf16f4d9e035d2d300e33b5aeee64e3benode_async_hooks.mjs/node/async_hooks.mjsb7862dbfba8bbbca956f19e4e08280b529e4b27468779775a9093aef8c92dc1d用仓库源码复核审计结论对当前仓库实际文件做静态复核README 的审计声明成立解包主 bundle 后计算 SHA-256与 README 记录的73d1514f…122a一致主 bundle 中对/node/*.mjs的直接 import 恰好只有/node/buffer.mjs与/node/process.mjs两条与 README 完全吻合逐文件 grep 五个 polyfillnode_process.mjsimportevents与tty、node_events.mjsimportasync_hooks构成 README 描述的传递链五个文件中fetch(、XMLHttpRequest、WebSocket、net.connect、dns.的命中数均为 0主 bundle 全文中唯一出现的https://字面量是一条注释里的外部 issue 引用属于代码注释文本非运行时请求目标可以推断 bundle 在浏览器运行时不存在任何对外网络调用路径。补充一个实现细节node_process.mjs的 polyfill 里带有一个未实现占位函数抛出[unenv] … is not implemented yet!错误——这说明这些 polyfill 只是 esm.sh 构建链的最小必要垫片功能面很窄审计成本低这也侧面印证了“逐个审计可行”这一设计前提。为什么“无网络”还需要 nonce 兜底离线 vendor 解决的是供应链问题而“本机上的其他进程向127.0.0.1:3000盲发 POST”属于本地攻击面。server.mjs 用每会话随机 16 字节 hexNONCErandomBytes(16).toString(hex)嵌入页面、并要求POST /submit在x-diff-review-nonce头中带回同时校验Origin只能是http://localhost:port或http://127.0.0.1:port否则返回 403。两层机制叠加只有本服务器发出去的那个页面能完成审查提交。这是 vendor 离线化之外、与“diff 含未提交改动”这一敏感性直接配套的防御。再生产与升级流程Regenerating or upgradingvendor README 给出了官方升级操作核心是“下载 → 记指纹 → 导入审计 → 压缩 → 同步服务端映射”五步。逐条继承并注释如下下载 URL 的完整形式见 vendor/README.md 原文# 1) 从 esm.sh 拉取目标版本的 es2022 bundle 构建?bundle 构建 curl -sL vendor README 中记录的 esm.sh pierre/diffsversion/es2022/diffs.bundle.mjs URL \ -o pierre-diffs-version.mjs # 2) 记录未压缩文件的 SHA-256 到 vendor/README.md sha256sum pierre-diffs-version.mjs # 3) 导入审计除了 /node/*.mjs polyfill 引用之外 # bundle 不得 import、fetch 或向任何外部目标打开连接 grep -o \(from\|import\) *[^]* pierre-diffs-version.mjs | sort -u # 4) 高压缩率压缩后入库 gzip -9 pierre-diffs-version.mjs # 5) 重新获取 bundle传递性import 的每个 polyfill重新审计 # 更新 README 中的文件表并同步 server.mjs 中的 VENDOR_FILES 映射其中第 3 步的grep命令就是上文“复核审计结论”所用的同一方法对解包后的 bundle 列出全部静态 import 目标sort -u去重后人工确认只剩下/node/*.mjs一类绝对路径引用。第 5 步的“同步VENDOR_FILES”对应 server.mjs 中版本号内嵌的文件名如pierre-diffs-1.2.12.mjs.gz——升级时必须同时改映射否则 404。这套流程体现的通用模式可以概括为版本钉死文件名内嵌版本号 哈希指纹README 即审计记录 静态导入审计只允许已知 specifier 服务端固定白名单其余路径 404四者缺一vendored 就只是下载了一份。小结diff-review的 vendor 目录体量不大6 个文件但它为 ClickHouse 的 PR 审查工作流解决了一个真实的安全命题浏览器端 diff 审查 UI 所处理的是未提交的本地改动任何运行时第三方 JS 加载点都是潜在的数据外带通道。该方案的全部约束——自包含 bundle、绝对路径 polyfill 契约、逐文件 SHA-256 记录、导入白名单审计、可重复的再生产流程——都在 vendor/README.md 中有文字依据且每一条都能从 server.mjs 的VENDOR_FILES与路由实现中找到对应的代码落点。对于任何需要在离线/隔离环境中运行含敏感数据的前端工具的仓库这套“vendor 指纹 审计”的清单值得直接套用。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表