过去一年 npm 生态系统遭受攻击的激增,揭示了软件供应链威胁格局的显著变化。早期粗制滥造的仿冒包攻击已演变为针对维护者、CI 流水线和现代开发所依赖的自动化系统的凭证驱动型入侵。对安全负责人而言,这些已非边缘性的开发事故,而是直通生产系统、云基础设施和数百万下游应用的捷径。

npm 基础设施的结构性缺陷

几乎所有企业都直接或间接依赖 npm。IDC 数据显示,93% 的组织使用开源软件,npm 仍是 JavaScript 生态中最大的包注册中心。"攻陷一个热门软件包可立即影响数百万下游用户和应用",IDC DevSecOps 研究经理 Katie Norton 表示,失窃凭证由此转化为她所称的分发"万能钥匙"。

风险不仅源于规模。Norton 指出:"现代开发流水线的安全防护存在结构性缺陷,开源维护者通常缺乏企业级安全资源,易受社会工程攻击。CI/CD 运行器和开发机器长期处理存储在环境变量或配置文件中的密钥,极易被恶意软件窃取。构建系统往往优先考虑速度和可靠性而非安全可见性,导致监控不足,攻击者初始入侵后的驻留时间延长。"

安全专家建议将 CI 运行器视同生产资产、严格轮换发布令牌、禁用非必要的生命周期脚本、固定依赖版本至不可变版本。Enterprise Security Group 网络安全实践总监 Melinda Marks 强调:"这些攻击针对软件依赖的预安装阶段,传统代码扫描方法无法应对,需依赖运行时分析和异常检测。"

从拼写陷阱到合法后门

长期以来,仿冒包攻击主导着 npm 威胁模型。攻击者发布与热门库名称近似的包(如 "lodsash"、"expres"、"reacts"),等待自动化流程或人为失误触发。这类攻击影响有限且易于修复。

2025 年模式开始转变。攻击者不再仿冒热门包,而是直接入侵真实项目。通过伪装 npm 官方的钓鱼攻击获取维护者凭证,利用窃取的令牌发布看似合法的木马化更新。"沙虫行动"波及数万代码库,通过失窃凭证在生态系统中自我传播。

Socket.dev 网络安全研究员 Kush Pandya 指出:"npm 生态系统已成为现代开发的皇冠明珠。当高产维护者被攻陷,影响范围将波及数百下游项目。"攻击者不再需要伪造软件包,而是通过受信任渠道分发恶意软件,这些更新带有正常签名和版本号。

瞄准开发环境而非开发设备

现代 npm 攻击更多在 CI/CD 环境中激活。安装后脚本(长期被视为无害的设置工具)成为在 GitHub Actions 或 GitLab CI 中自动执行的载体。恶意包可读取环境变量、窃取发布令牌、篡改构建产物,甚至以受害者身份发布更多恶意版本。

Pandya 表示:"开发环境和 CI 运行器价值已超越终端用户设备,它们通常拥有更广泛权限、密钥访问权及代码投产能力。"2025 年中观察到的多个攻击专门针对 CI 环境,仅在检测到自动化构建时触发,部分采用延迟执行或自毁载荷设计,最大化凭证窃取的同时最小化取证可见性。

企业面临根本性风险转变。CI 系统通常以高于任何个体的权限运行,却缺乏严格监控。IDC 研究显示,组织仅将约 14% 的应用安全预算用于供应链安全,仅 12% 将 CI/CD 流水线安全列为首要风险。

规避检测成为标配功能

随着防御者检测可疑包能力提升,攻击者同步进化。近期攻击采用不可见 Unicode 字符隐藏依赖关系、通过环境检查后才会获取真实载荷的多阶段加载器、基于区块链的抗删除 C2 服务器引用。部分攻击具备蠕虫特性,利用失窃凭证大规模发布附加恶意包。

Pandya 坦言:"粗略查看 index.js 就能发现恶意 eval() 的时代已经终结。现代恶意包通过多层编码、延迟执行和环境指纹识别隐藏恶意逻辑。"Norton 补充指出:"混淆技术使恶意逻辑在大型 JavaScript 项目中难以辨别,针对 CI 环境的载荷和安装后脚本仅在特定条件下才会触发恶意行为。"

参考来源:

From typos to takeovers: Inside the industrialization of npm supply chain attacks

转载地址: https://www.freebuf.com/articles/development/466635.html