直接回答:典型手法:投毒热门包(event-stream 案)、typosquatting 抢注相似包名、dependency confusion(内网私有包名在公网仓库注册高版本号被优先拉取)、入侵 CI/CD(SolarWinds)、恶意 maintainer 接管、构建缓存或制品被篡改。防御是纵深体系:依赖锁定与审计、私有代理仓库、制品签名与来源验证(SLSA)、最小权限的 CI、以及 SBOM 驱动的漏洞响应。
展开解析:可落地的动作清单:lock 文件入库且 CI 用 npm ci/--frozen-lockfile 严格复现,新依赖走评审;搭建私有 registry 代理公网(Artifactory/Nexus),dependency confusion 用命名空间保留加禁用公网回落根治;CI Runner 与制品隔离,密钥用 OIDC 短期凭证替代长期 token;启用 Sigstore/cosign 给镜像签名,部署时验签;npm audit/Dependabot/Renovate 保持更新但注意新版本不等于安全——热门包的重大版本发布后观察几天再升级是务实的节奏。SBOM(SPDX/CycloneDX)的价值在漏洞爆发时(如 log4shell)能快速回答"我们哪些系统用了它"。评估依赖时看维护活跃度、下载量、是否有安全响应记录,小依赖自己 vendoring 也未尝不可。
追问方向:SLSA 等级怎么划分?sigstore 的无密钥签名原理?如何检测 lock 文件被篡改?
(约 460 字)