的排查、风险评估与防护实践)
Shields 供应链安全实录CVE-2025-54313eslint-config-prettier 投毒事件的排查、风险评估与防护实践【免费下载链接】shieldsConcise, consistent, and legible badges in SVG and raster format项目地址: https://gitcode.com/gh_mirrors/sh/shields本篇技术指南以 Shields 项目官方安全公告 frontend/blog/2025-07-26-CVE-2025-54313.md 为主体完整还原该次上游 npm 包投毒事件的处置思路包括漏洞影响的依赖链分析、项目代码库受影响面的排查结论、Windows 用户的实际风险边界以及基于仓库真实 CI 配置npm ci与npm install的区别给出的可复现防护验证。读完本文你将掌握针对上游供应链包被投毒这一类事件的标准响应流程并能用同样的方法审计自己的 npm 项目。事件背景CVE-2025-54313 是什么2025 年 7 月Shields 团队在官方博客发布安全说明披露了一个涉及eslint-config-prettier包的供应链漏洞编号为CVE-2025-54313。该漏洞的核心要点如下漏洞类型供应链投毒supply chain compromise存在潜在的**远程代码执行RCE**风险影响范围仅影响 Windows 用户这一点决定了整个风险面评估的边界严重程度官方评级为High高危。eslint-config-prettier是 Prettier 官方生态中用于关闭与 ESLint 规则冲突的共享配置包被绝大多数 ESLint 工程作为devDependencies引入属于开发期依赖。正因如此这类包一旦被投毒恶意代码会在开发者执行npm install时依赖安装阶段触发postinstall/install脚本于本地机器上执行——这正是其被称为供应链攻击的原因攻击者不直接攻击目标项目而是攻击目标项目所信任的上游依赖。受影响依赖链投毒波及的包族Shields 在公告中明确列出了本次事件中同样受影响的包。值得注意的是这些包并非互不相关的孤立包而是围绕 Prettier/ESLint 生态形成的一条依赖链eslint-config-prettier漏洞的直接载体eslint-plugin-prettiersynckiteslint-plugin-prettier的运行时依赖负责跨线程执行同步任务pkgr/coresynckit的底层依赖napi-postinstall用于原生模块安装辅助的包这条链在仓库的锁文件中可以得到印证查看 package-lock.json 可以看到synckit0.11.13对pkgr/core的依赖声明为^0.3.6锁文件中解析并固定为0.3.6package-lock.json。也就是说eslint-config-prettier→eslint-plugin-prettier→synckit→pkgr/core构成了完整的传递依赖路径任何一个上游环节被投毒理论上都会沿着这条链传导到所有依赖方。项目实际受影响面版本排查结论针对这次事件Shields 团队在仓库中逐一核对了这些包的实际声明版本与解析版本结论是项目代码库中未使用任何受影响版本。根目录 package.json 中eslint-config-prettier声明为^10.1.8eslint-plugin-prettier声明为精确版本5.5.6结合package-lock.json锁定的解析结果均未落入 CVE 波及的版本区间上游已采取行动截至公告发布时npm 上已移除受影响版本从源头上切断了新安装的可能生产环境未发现相关问题公告明确目前未在生产环境中发现与该漏洞相关的任何问题。需要特别强调的是这一未受影响结论针对的是仓库本身及其正常运行流程但风险并未完全归零——原因在于版本声明中的^前缀详见下一节。残余风险^前缀、Windows 与npm install的组合虽然仓库锁定版本是安全的但 Shields 在公告中诚实指出了一处残余风险面项目在package.json中对eslint-config-prettier使用了^前缀^10.1.8对于不读取package-lock.json、直接以package.json为准执行npm install的场景npm 会按^语义拉取最新的兼容版本10.1.8 11.0.0如果该操作发生在上游尚未移除受影响版本的时间窗口内且执行机器是Windows就可能装到被投毒的版本并触发恶意代码执行。这个风险的实际受害者画像非常具体fork 仓库的贡献者、以及在自己 Windows 开发机上直接npm install的开发者——他们并不一定使用与主仓库一致的锁文件。因此公告给出的明确建议是任何曾在 Windows 机器上对这些包执行过npm install的人都应检查自己的系统是否存在被入侵的迹象如异常的进程、计划任务、启动项、可疑的 shell 历史等。CI 为何幸免npm ci与npm install的安全差异公告中提到该问题似乎未影响我们的 CI 环境这是一个可以用仓库配置直接验证的结论。首先确认 Windows CI 的存在查看 .github/workflows/test-main.ymltest-main是仓库中唯一的 Windows 任务其策略矩阵为test-main: strategy: matrix: os: [ubuntu-latest, windows-latest] runs-on: ${{ matrix.os }}也就是说test-main确实会在windows-latest上运行CI 面覆盖了 Windows。关键在于依赖安装方式——所有 CI 任务都通过统一的 setup action 安装依赖见 .github/actions/setup/action.yml- name: Install dependencies if: ${{ inputs.cypress false }} run: | echo skipping cypress binary npm ci shell: bash这里使用的是npm ci而非npm install两者的核心差异决定了安全结果对比维度npm cinpm install依赖解析依据严格按package-lock.json安装^前缀不生效按package.json的^/~语义解析可能浮动到新版本锁文件处理要求锁文件与package.json一致否则直接报错会更新锁文件是否执行 install 脚本执行但只装锁定的版本执行供应链风险锁定版本可审计、可复现被投毒窗口极小安装时刻可能拉到刚被投毒的新版本因此CI 的 Windows 任务虽然存在但由于npm ci严格使用锁文件即便上游投毒版本恰好处于可安装状态CI 也只会安装锁文件中明确记录的安全版本投毒版本根本没有进入 CI 的机会。另一个细节同样值得注意仓库中确实存在使用npm install的流程即 badge-maker 包的冒烟测试 .github/workflows/test-package-cli.yml但它运行在ubuntu-latest上不涉及 Windows 攻击面与本次漏洞的触发条件Windows不匹配因而不在风险范围内。从本次事件提炼的供应链防护清单综合 Shields 此次处置的全过程可以沉淀出一套可复用的 npm 项目供应链防护实践以锁文件为唯一事实来源CI 与本地开发统一使用npm ci杜绝^浮动版本进入安装流程区分运行平台审计风险面漏洞常带有平台特异性本次仅 Windows风险评估需按OS × 依赖安装方式 × 版本解析方式组合逐一排查而非一刀切关注postinstall/install脚本类依赖投毒代码通常在安装阶段执行对带脚本的原生/工具类包如napi-postinstall应提高警惕及时核对上游处置状态投毒事件发生后上游往往会在短时间内移除问题版本应确认自身的锁定版本与声明区间并关注上游的后续发布持续监控Shields 表示会持续跟进该漏洞对自建 CI/生产环境同样建议将此类供应链告警纳入常规巡检。结语CVE-2025-54313 事件是一次典型的开发期依赖投毒攻击Shields 的应对为同类项目提供了一个完整范本先定位受影响依赖链再以锁文件核验版本接着按平台与安装方式界定风险面最后明确 CI 与生产环境的实际暴露情况。对于任何维护 npm 项目的团队而言将npm ci、精确版本审计与供应链监控固化为默认实践是抵御此类攻击最直接、成本最低的手段。【免费下载链接】shieldsConcise, consistent, and legible badges in SVG and raster format项目地址: https://gitcode.com/gh_mirrors/sh/shields创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考