“这些植入代码仅存在于发布的压缩包中,在项目源代码里完全不可见。”这是安全公司StepSecurity在一份最新报告中的原话。7月28日,一场针对开源软件供应链的精准攻击浮出水面,两个广泛用于Web表单与布局的npm包@joyfill/components和@joyfill/layouts被植入恶意代码,任何导入其beta版本的应用都可能中招。
与传统恶意包依赖安装脚本不同,这次攻击的手法更狡猾。恶意代码直接藏在包本身的捆绑文件中,即便开发者执行npm install时特意加上--ignore-scripts参数也拦不住。StepSecurity的自动化扫描在标记@joyfill/layouts的一个构建时触发严重告警,随后深入分析发现,两个包里的混淆载荷一模一样,而且只存在于npm注册表上发布的tarball里,上游的干净源代码中没有任何痕迹。
![]()
沙盒执行和与早期安全版本的对比进一步坐实了结论:这是一起有预谋的供应链劫持,而非单独的开发失误。攻击链被拆解为五个阶段,从导入包的那一刻就开始运转——一个隐蔽的加载器先设置活动标签,把Node.js的关键模块暴露在简短的全局名称下,然后读取公开区块链数据,从中定位真正的控制服务器地址。这种“不在代码里硬编码C2”的设计,让它能灵活切换据点,躲避一次性的域名封锁。
定位到控制端后,恶意代码直接在内存里执行更多指令,通过Socket.IO建立持久连接。操控者能随时索要主机信息、偷取剪贴板内容、移动文件,甚至在受害者机器上运行任意脚本。更麻烦的是,这个后门还会把自己复制进开发者每天高频打开的工具里——VS Code的模块、Cursor编辑器、Discord、GitHub Desktop,以及全局npm命令行界面本身。
一旦感染,蠕虫特性会让它反复复活。补进npm CLI之后,后续的每一次npm命令都会重新触发加载器,等于在开发工作流里埋下了一颗永远踩不完的地雷。这种自我传播的思路,和此前几次利用开发者工具链扩大杀伤面的供应链蠕虫如出一辙。只要一台机器被控,它就可能通过本地共享的配置、钩子和临时文件,蔓延到同一团队的其他环境,甚至把恶意代码带进新打包的组件里。
攻击者为不同的投递通道设置了独立的活动标签,比如npm这条线使用A9-0135-3标记,流量会导向专用于Socket通信和文件上传的服务器。后续还有一个分阶段加载的Python辅助脚本,用来收集浏览器数据、钱包扩展等信息。这样一来,窃取的不只是当前项目的密钥,还包括浏览器里保存的登录态、云端账号的访问令牌,攻击半径从代码仓库悄悄扩大到整个开发者的数字身份。
这种“借真包作恶”的模式正在成为开源生态里的新常态。攻击者越来越倾向于劫持已有大量用户基础的真实项目,而不是创建一个没人用的假包去碰运气。一旦某个包的维护者凭证泄露、或者构建流水线被侵入,成千上万的依赖方就可能在毫不知情的情况下中招。那些引用了@joyfill/components或@joyfill/layouts的2773预发布版本的工作站,在彻底清理之前,都应该被视作已失陷。
StepSecurity在报告中反复提醒,仅仅检查源代码仓库已经不够了,构建产物与发布渠道的完整性校验才是关键。供应链的安全边界,正在从“信得过的人写的代码”快速退向“每一层依赖都必须验证”的零信任地带。而这次蠕虫式后门的设计,正好卡在开发者日常操作与系统底层的夹缝里,给整个行业的包管理安全模型敲了一次刺耳的警钟。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.