供应链攻击防范,npm/pypi依赖锁文件锁定版本定期审计
供应链攻击通常不是直接攻击你的服务器,而是污染你引用的第三方依赖包。
只要某个上游包被植入恶意代码,npm install或pip install时就会悄悄带进生产环境。防范的关键是锁定依赖版本,并定期审计依赖安全。
本文面向使用Node.js和Python的维护者,以npm和pypi为例,讲清锁文件用法、审计命令和避坑点,按步骤操作可直接落地。
为什么锁文件能降低供应链攻击风险
锁文件记录的是项目依赖的精确版本号、下载地址和校验值。
常规package.json里的依赖常写成^1.2.3,安装时会拉取1.x最新版。
如果某天上游发布了恶意1.2.4,重新安装就会中招。
而锁文件强制使用已记录的版本,不会接受未经验证的更新。
因此把package-lock.json、Pipfile.lock这类文件提交进Git仓库,是防供应链攻击的第一道门。
npm项目:用package-lock.json锁定版本
在Node.js项目根目录执行npm install后,会自动生成package-lock.json。
它会在后续安装时锁定当时解析出的精确版本。
部署时不要用npm install,改用:
npm ci
npm ci直接按锁文件安装,忽略package.json中的版本范围,还能保证每次构建结果一致。
检查锁文件是否生效:
npm ls
如果某依赖版本和锁文件不一致,会显示错误信息。
pypi项目:锁定依赖版本并校验哈希
pypi项目的pip freeze并非严格锁文件,但也能锁定版本。
生成文件并提交:
pip freeze > requirements.txt
更好的做法是使用pipenv或poetry,它们会生成Pipfile.lock,同时记录哈希,安全性更高。
还原环境时执行:
pip install -r requirements.txt
团队中应约定:更新依赖必须显式执行pip install 包==版本,再重新生成锁文件,禁止手工改版本号。
定期审计:用npm audit和pip-audit排查漏洞
锁定版本只是防未知更新,已记录的版本如果存在漏洞,仍可能被利用。
需要定期审计依赖数据库。
npm项目:
npm audit
它会列出有已知漏洞的包、风险等级和修复建议。
严重问题可一键修复:
npm audit fix
注意:自动修复可能升级大版本,引发兼容问题,建议先跑测试。
Python项目,官方推荐使用pip-audit:
pip install pip-audit
pip-audit -r requirements.txt
它会比对OSV漏洞库,输出受影响包和版本建议。
把审计命令加入CI流水线,每次提交代码后自动扫描,可以尽早发现风险。
避坑提醒:锁文件别忽略,也别乱升级
- 不要把锁文件写进.gitignore,否则锁定形同虚设。
- 不要频繁执行
npm update或pip install --upgrade,升级前先查看审计报告和变更日志。 - 使用私有镜像源时,锁文件记录的下载地址可能不可用,需要统一维护源地址,或者使用相对可信的镜像并做好缓存校验。
- 如果审计报出漏洞,判断实际调用路径:不是所有漏洞都会被利用,但生产环境建议优先修复可远程触发的漏洞。
验证防范是否到位
完成配置后,在干净环境执行npm ci或pip install -r requirements.txt,再用npm ls、pip list --format=freeze对比版本,确保与锁文件一致。
定期运行审计命令,至少保留一次审计报告作为基线。如果发现锁文件被改动但未经过Code Review,应立即排查提交来源,避免恶意PR混入。
如果你正在处理npm/pypi依赖锁文件锁定版本与定期审计的问题,建议先按本文步骤完整执行,再根据自己的环境调整自动化方案。
遇到异常时优先检查锁文件是否提交、审计命令是否接入CI,这是供应链攻击防范中最容易出效果的两件事。