解析npm依赖包攻击的来龙去脉和防御方法

更新日期: 2025-11-27 阅读: 31 标签: npm

恶意包如何混进npm

你可能会想,npm不是有安全扫描吗?为什么恶意包还能混进来?攻击者主要利用了以下几种高级手段:

  • 劫持可信的发布者账户:这是近期高影响攻击(如 Sha1-Hulud v2)的主要方式。攻击者通过钓鱼邮件等手段,诱骗高信誉度包的维护者交出账户凭证或令牌。一旦得手,他们就能以合法身份发布带毒的更新包,这种“信任背书”使得恶意代码能迅速通过依赖链扩散。

  • 利用远程动态依赖(RDD):在 PhantomRaven 攻击中,恶意包本身在npm上看起来非常“干净”,依赖项列表甚至显示为0。但其package.json中的脚本会在安装时,从一个远程URL(如packages.storeartifact.com)动态拉取并执行恶意代码。这种方法能有效绕过依赖静态分析的安全扫描工具

  • 精心设计的包名迷惑开发者:攻击者会使用一种称为 “slopsquatting” 的策略,即使用大型语言模型(LLM)生成一些听起来合理、但实际不存在的包名。这些名称看起来很正规,容易让开发者放松警惕,误以为是可信的包。


恶意代码如何被触发执行

你提到的npm生命周期脚本是问题的核心。攻击者正是利用了preinstall、postinstall这些在安装过程中自动执行且无明确提示的脚本钩子。

近期攻击的执行链条变得更加复杂和隐蔽:

  1. 注入脚本:在package.json中定义"preinstall": "node setup_bun.js"。

  2. 下载独立运行时:setup_bun.js脚本会自动检测系统并下载Bun运行时(一个JavaScript运行时)。这种“自带运行时”的手法,能让恶意代码在一个独立于Node.js主进程的环境中运行,从而规避许多针对Node.js的安全监控工具。

  3. 执行混淆载荷:最后,利用Bun执行一个经过高度混淆、体积庞大(约10MB)的恶意载荷(如bun_environment.js),该过程通常会抑制错误输出,在后台静默进行


攻击者的目标是什么

一旦恶意代码执行,其目标非常明确:窃取所有能窃取的敏感凭证和系统信息

  • 核心开发者凭证:包括环境变量中的GITHUB_TOKEN、NPM_TOKEN、AWS_ACCESS_KEY_ID等。

  • 全面系统扫描:恶意软件甚至会下载并运行专业的秘密扫描工具(如TruffleHog),对整个文件系统进行深度扫描,寻找任何硬编码的密钥、密码和配置文件。

  • 系统指纹信息:收集主机的公共IP地址、操作系统和架构等信息,用于后续攻击。

在Sha1-Hulud v2攻击中,如果恶意软件无法成功窃取信息或建立持久化通道,它甚至会启动破坏性模式,尝试删除用户主目录下的所有可写文件


失窃数据如何回传

为了确保能稳定地接收窃取的数据,攻击者构建了相当顽抗的通信和基础设施:

  • 自我修复的命令与控制(C2)服务器:以Sha1-Hulud v2为例,恶意软件在执行时会扫描公共GitHub仓库,寻找一个特定的“信标短语”(例如"Sha1-Hulud: The Second Coming")。找到后,它会从仓库中提取一个经过三重Base64编码的GitHub访问令牌,并用这个令牌作为新的数据外传通道。这意味着,即使攻击者原有的仓库被查封,他们也能通过创建新的仓库迅速“复活”整个攻击网络,抗打击能力非常强。


如何有效防御

面对这些不断演进的攻击,我们可以采取以下措施来加强防御:

防御策略具体措施与说明
强化账户与凭证安全为所有重要账户(尤其是npm、GitHub)启用双因素认证(2FA)。定期轮换GITHUB_TOKEN、NPM_TOKEN等敏感凭证。
限制脚本执行在安装依赖时使用 npm install --ignore-scripts 命令,可以阻止preinstall、postinstall等生命周期脚本自动运行。你也可以通过 npm config set ignore-scripts true 将其设为默认。
使用专业安全工具集成能进行深度依赖行为分析的工具,如 Socket,它可以检测到RDD、混淆代码等风险信号。同时,坚持使用 npm audit 进行基础漏洞扫描,并关注报告。
固化依赖与人工审查将 package-lock.json 文件提交到版本库,确保所有环境下的依赖版本完全一致,避免意外拉取到新的恶意版本。对于新引入的依赖,保持警惕,手动检查其package.json中的脚本和依赖项。


总结

总的来说,现代的npm供应链攻击已经变得高度专业化,通过劫持账户、利用生命周期脚本和远程动态依赖来植入恶意代码,并构建自我修复的基础设施来窃取凭证。因此,仅靠官方扫描或被动审计已不足以保证安全,开发者必须主动采取限制脚本执行、使用高级安全工具和强化账户安全等多层次防御策略。

希望这些信息能帮助你更好地理解风险并保护你的项目。如果你对特定安全工具的使用或具体工作流中的安全加固有更多疑问,我很乐意提供更深入的分析。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13213

在5分钟内搭建企业内部私有npm仓库

下面通过三种方法来搭建公司私有npm仓库,每种方式都有自己的优势。启动并配置服务、设置注册地址、登录cnpm、包上传到私有仓库、查看预览包、通过verdaccio搭建....

使用webpack开发npm插件

webpack:解析js文件,无法解析的文件需要借助loader,npm插件发布(vue&webpack&单页面):npm init =>package.json,创建.vue文件 =>插件界面及功能,index.js =>入口文件

npm命令大全_整理NPM常用命令

NPM是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载、安装、上传以及管理已经安装的包。这篇文章整理NPM常用的一些命令

npm 执行多个命令_如何用npm同时执行多条监听命令

直接通过&&连接多条命令,在npm run start的时候,发现只停留在第一个命令执行监听,后面的命令都没有执行。只能通过打开多个窗口分别执行多条命令,那么有没有办法实现一条npm命令执行多条监听呢?

npm和bower的关系和区别

npm和bower太像了,就像一对孪生兄弟…… npm的文件是package.json,包安装的目录是node_modules。 bower的文件是bower.json,包安装的目录是bower_components。使用命令也基本一致

npm run build根据不同参数打包不同环境url

这篇文章主要介绍了vue项目中Npm run build 根据环境传递参数方法来打包不同域名,使用npm run build --xxx,根据传递参数xxx来判定不同的环境,给出不同的域名配置,具体内容详情大家参考下:config文件夹下dev.env.js中修改代码、prod.env.js中修改代码 HOST为截取到的参数

npm安装模块时报错:no such file or directory

使用node.js和npm,在安装模块的时候报错npm WARN saveError ENOENT: no such file or directory, open ...的解决办法。这个原因就是因为项目没有进行初始化,缺少package.json文件造成的。需要package.json才能npm install。 可以npm init初始化生成一个package.json。

vue-cli 3.x 开发插件并发布到 npm

抽空写了一个 textarea,打算发布到 npm 的时候却遇到了问题,之前用 vue-cli 2.x 的时候,打包配置项非常透明,可以很容易的修改,但升级到 vue-cli 3.x 之后,反而一脸懵逼

前端npm 安装包,精选大全集合

如果您曾在 Node 或 JavaScript 前端开发中投入过时间和精力,那么您就知道 npm 中有数以十万计的模块可供您选择。挑选模块可能很难,但您只需要一些方法点来解决它。当您正在为如何抉择浪费时间,或者甚至不知道从哪里开始时,请使用本指南来帮助您。

关于 npm run eject 报错的问题

关于 npm run eject 报错的问题,昨天新开React的项目, 刚刚一上手就碰到问题,解决方法(前提你有git).出错的原因:应该是git没有安装好,或者代码没有提交上git

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!