Hotdry.
ai-security

safe-npm:90天包龄过滤防npm供应链攻击

Node.js项目安全安装npm包,强制最小90天发布年龄,配置阈值、忽略列表与严格模式,抵御突发恶意版本发布。

在 Node.js 生态中,npm 供应链攻击已成为严重威胁。攻击者通过窃取维护者凭证、接管废弃包或发布恶意更新,突然注入恶意代码。传统 npm install 无法区分安全版本与新鲜陷阱,导致项目瞬间中招。safe-npm 工具应运而生,它通过强制包版本最小发布年龄(默认 90 天)过滤安装,确保只有经时间检验的版本进入项目,提供宝贵的安全缓冲期。

safe-npm 的核心原理简单高效:解析 package.json 依赖或命令行参数,查询 npm registry 所有可用版本,按 semver 约束筛选出最新且满足年龄阈值的版本,再用 npm install 部署。例如,指定 react@^18,若昨日发布的 18.5.0 含恶意代码,工具将回退至 90 天前最新版,避免风险。“safe-npm protects you by only installing package versions that have been publicly available for a minimum amount of time (90 days by default).” 这种时间沙箱机制,给安全社区发现并报告问题留足窗口。

安装极简:全局 npm install -g @dendronhq/safe-npm,即可在任意目录运行 safe-npm install。新项目初始化后,直接 safe-npm install express@^4 lodash,确保 lockfile 锁定老版本。现有项目审计用 --dry-run 预览:“safe-npm install --dry-run”,输出拟安装版本列表,便于人工审阅后确认。

配置参数高度可落地,覆盖多种场景。核心 --min-age-days ,默认 90,可调至 120(4 个月)用于生产,或 30 接受微风险换新功能。高安全环境推荐 180 天。忽略列表 --ignore pkg1,pkg2,绕过阈值适用于可信快速迭代包,如 typescript 或内部工具:“--ignore typescript,@types/node”。严格模式 --strict,若任一依赖无合格版本则退出错误码 1,完美适配 CI/CD:“safe-npm install --strict --min-age-days 120”。

策略选项 --strategy direct(默认,直接 npm install pkg@ver)或 overrides(写入 package.json overrides 后 npm install,目前实验)。--dev 仅 devDependencies,--prod-only 限生产依赖,便于分层政策。私服用 --registry url。完整 CLI 清单:

参数 默认 用途 示例
--min-age-days 90 最小发布天数 --min-age-days 120
--ignore 绕过包列表 --ignore react,webpack
--strict 失败即退出 --strict
--dry-run 预览不安装 --dry-run
--dev 仅 devDep --dev
--prod-only 仅 prodDep --prod-only
--strategy direct 安装策略 --strategy overrides
--registry npm 默认 自定义 registry --registry company.com

CI/CD 集成脚本示例(GitHub Actions):

- name: Safe NPM Install
  run: |
    safe-npm install --strict --min-age-days 120 --prod-only
    if [ $? -ne 0 ]; then echo "Unsafe deps detected"; exit 1; fi

生产部署预热:dry-run + 人工签发后 install。监控点包括:日志解析安装版本与跳过原因,Prometheus 指标暴露 “skipped_versions_total { pkg, reason}”,阈值告警 > 5% 依赖跳过。回滚策略:overrides 模式下,git revert package.json,或维护 overrides.npmrc 侧车文件:“overrides={ "react": "18.3.1" }”,npm config set userconfig .npmrc 覆盖。

应急更新:临时 --ignore critical-pkg,事后审计恢复阈值。结合 npm audit 定期扫描、socket.dev 依赖图分析、多签发布流程,形成纵深防御。

局限需知:不防先天恶意包,延迟合法修复(权衡增 --min-age 或 --ignore)。依赖老版本无隐忧假设计,但现实中 CVE 常在旧版潜伏,故辅以 Snyk 或 Dependabot 监控。测试用 SAFE_NPM_FIXTURES=/path/fixtures.json 模拟 registry。

落地清单(5 步):

  1. 全局安装:npm i -g @dendronhq/safe-npm
  2. 项目根 dry-run 基准:safe-npm install --dry-run > audit.md
  3. 配置.npmrc 锚定:echo "min-age-days=90" >> .npmrc(自定义)
  4. CI 脚本注入 --strict,fail-fast
  5. 周巡监控:grep skipped install.log,审视跳过包

实际收益:在 2024 多起 npm 攻击浪潮中,此策略已救多家企业于未觉。Hacker News 讨论印证其热度。

资料来源:https://github.com/kevinslin/safe-npm,Hacker News 相关线程。

(正文约 1250 字)

查看归档