首页 > 编程语言 >供应链安全情报 | 恶意py包伪装代理SDK进行后门攻击,目标锁定python开发者

供应链安全情报 | 恶意py包伪装代理SDK进行后门攻击,目标锁定python开发者

时间:2023-12-01 17:37:46浏览次数:39  
标签:python 代码 py 投毒 攻击 组件 恶意 shellcode SDK

概述

2023年11月28号,悬镜供应链安全实验室在Pypi官方仓库(https://pypi.org)监测到两起伪装成http和socks5代理SDK的开源组件投毒事件。python开发者一旦下载安装这些投毒Py包(libproxy、libsocks5),会触发执行Py包中的恶意代码,最终将导致开发者系统被投毒者植入恶意后门。

这些恶意Py包在官方仓库上的本周下载量大约500多次。

 

目前恶意Py包已从官方仓库下架,但国内部分主流Pypi镜像源依旧可访问下载这些恶意包,实际的受害者数量将会更多,尤其对于国内广大开发者来说仍存在被投毒攻击的风险。

 

国内Python开发者们可自行排查是否安装或引用以下恶意py组件包。

投毒组件分析

本次py投毒组件在安装包setup.py脚本中自定义install命令类执行恶意操作,通过从远程服务器上拉取加密的恶意代码进行解密释放出第二阶段攻击使用的shellcode代码,shellcode代码直接在系统内存中执行,无恶意文件落盘行为,具备较高的攻击隐蔽性。

 

Part 1 加载远程攻击载荷

以`libsocks5`为例,该组件包setup.py的cmdclass::install被定义为VerifyInstallationChecksum类。

 

当开发者通过pip install libsocks5 安装py包时,VerifyInstallationChecksum的run函数将被调用执行第一阶段攻击代码。Run函数先将base64编码的url进行解码后通过urllib远程下载加密的恶意代码,最后会对恶意代码进行解密并调用eval执行进入第二阶段攻击代码。

 

base64编码的恶意代码url为:

aHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZXJpay1hcnRlbW92L2I1ZGUyNTE5NWJkMGU5NjFhNTIxYjAzNDU2NjE0ZDRjL3Jhdy8xY2MyMzYzMTBkYTdmM2UwNWI2NTcxZWFhOWRiNGI2NjM2ZmI0Njg0L2d6TGpnT3VqOHkwYmF2VG12Z2tDd1IzaDFrdkVDMUJNLmI2NAo=

解码后的url为:

https://gist.github.com/erik-artemov/b5de25195bd0e961a521b03456614d4c/raw/1cc236310da7f3e05b6571eaa9db4b6636fb4684/gzLjgOuj8y0bavTmvgkCwR3h1kvEC1BM.b64

 

Part 2 shellcode解密执行

解密后的第二阶段攻击代码(如下图所示)被混淆处理,其大致逻辑是通过调用python ctypes库动态分配一段可读可写可执行的RWX系统内存,并将内置加密压缩后的shellcode代码解密释放到RWX内存上,最后直接控制PC寄存器跳转到RWX内存中执行shellcode进入第三阶段攻击代码。

 

第二阶段攻击代码去除混淆后的伪代码如下如图所示:

 

Part 3 后门植入

通过IDA逆向第三阶段shellcode攻击代码(shellcode_stage1),伪代码如下所示,shellcode先调用系统接口分配一块可读可写可执行的RWX内存,接着将内置的异或编码后的shellcode解码释放到RWX内存中执行下一阶段攻击。

 

 

通过逆向分析,我们发现在第三阶段攻击代码shellcode_stage1执行后,需要持续经过16轮 shellcode解码释放操作,最终才会释放出真实的攻击代码shellcode_stage17。

从shellcode_stage1到shellcode_stage17阶段的代码都是直接在系统内存上执行,不在文件系统中生成恶意代码。通过IDA自动化脚本,我们可以从shellcode_stage1中将后续16轮的shellcode代码全部还原提取(如下图所示)。

 

shellcode_stage17的攻击代码最终会从投毒者控制的服务器下载后门程序RuntimeBroker.exe并植入到受害者系统中。

3478.qt-api-worker-threads.workers.dev

 

Part 4 IoC数据

此次投毒组件包涉及的IoC数据如下所示:

总结

截至目前,这些恶意组件包仍可从国内主流Pypi镜像源正常下载安装,国内Python开发者仍面临被投毒攻击的安全风险,开发者需提高安全防护意识,可自行根据以上IoC和组件信息排查是否安装或引用恶意组件包。除此之外,也可使用悬镜开源的OpenSCA安全治理工具进行扫描检测。

 

快速排查

使用OpenSCA-cli,将受影响的组件包按如下示例保存为db.json文件(可参考总结中提到的组件包信息按格式增减),直接执行扫描命令(opensca-cli -db db.json -path ${project_path}),即可快速获知您的项目是否受到投毒包影响。

[  {   
     "product": "libproxy",   
     "version": "[1.1.4, 1.1.5]",    
    "language": "python",   
     "id": "XMIRROR-2023-113001",   
     "description": "恶意Pypi组件包投毒。",   
     "release_date": "2023-11-30" 
 },  {   
     "product": "libsocks5",    
    "version": "[1.1.1, 1.1.1]",   
     "language": "python",   
     "id": "XMIRROR-2023-113002",    
    "description": "恶意Pypi组件包投毒。",   
     "release_date": "2023-11-30" 
 }]

  

悬镜供应链安全情报中心将持续监测全网主流开源软件仓库,对潜在风险的开源组件包进行动态跟踪和溯源,实现快速捕获开源组件投毒攻击事件并第一时间提供精准安全预警。

标签:python,代码,py,投毒,攻击,组件,恶意,shellcode,SDK
From: https://www.cnblogs.com/openscacommunity/p/17870550.html

相关文章

  • python开发之个微机器人的二次开发
    简要描述:登录E云平台请求URL:http://域名地址/member/login域名地址+开发者账号密码:后台系统自助开通请求方式:POST请求头Headers:Content-Type:application/json参数:参数名必选类型说明account是string开发者账号password是string开发者密码返......
  • python开发之个微机器人开发
    简要描述:取消消息接收请求URL:http://域名地址/cancelHttpCallbackUrl请求方式:POST请求头Headers:Authorization:login接口返回Content-Type:application/json无参数返回数据:参数名类型说明codestring1000成功,1001失败msgstring反馈信息成功返回示例{"message":"成功","code......
  • Python中的惰性导入/懒导入/动态导入(Lazy Import)
    参考资料:https://cloud.tencent.com/developer/article/2204701https://github.com/huggingface/diffusers想研究这个lazyimport的起因是:我想学习一下高级的算法工程师是如何构建一个pip包的,然后我发现在diffusers这个广泛使用的huggingface包的组织方式中出......
  • pytorch 学习记录——计算图
    1.pytorch的计算图是动态更新的(tensorflow是静态计算图),数据流向可以是双向的。2.pytorchvariable(用于封装tensor,便于自动求导的变量类型,在pytorch0.4.0之后版本已被并入tensor)基本属性:data,dtype,shape,device,requires_grad,is_leaf,grad,grad_fn3.is_leaf是否为叶子节点:用户创......
  • python--循环和字符串
    Task5和6循环和字符串for循环和循环范围for循环的特点基于特定的范围,重复执行规定次数的操作deff(m,n):total=0foriinrange(m,n+1):total+=ireturntotalf(5,10)计算机会计算5+6+7+8+9+10最后输出计算结果range()函数需要注意的是这个范围是......
  • Python日志库Loguru教程
    标题Python日志库Loguru教程(最人性化的Python日志模块)1.What:我们需要一个什么样的日志库可以区分不同类型的日志:正常,警告,错误,严重。可以配置指定的日志文件名称。可以配置指定的日志格式。可以把不同的日志类型写到不同的文件中。可以配置按照时间,文件大小等条件对日志文......
  • 代码随想训练营第五十二天(Python)| 300.最长递增子序列、674. 最长连续递增序列、718.
    300.最长递增子序列classSolution:deflengthOfLIS(self,nums:List[int])->int:iflen(nums)<=1:returnlen(nums)#dp数组代表以nums[i]结尾的最长递增子序列长度为dp[i]dp=[1]*len(nums)res=1......
  • 聪明办法学 Python 2nd Edition
    聪明办法学Python2ndEditionChapter5循环Loopfor循环和循环范围for循环的特点基于提供的范围,重复执行特定次数的操作In[1]defsumFromMToN(m,n):total=0#注意:range(x,y)是左闭右开区间,包含x,不包含yforxinrange(m,n+1):total......
  • 软件测试/人工智能|Python函数与调用:解放编程力量的关键
    简介Python作为一门强大而灵活的编程语言,其函数机制为我们提供了一个重要的工具,使得代码更为模块化、可重用。在本文中,我们将深入探讨Python中函数的各个方面,包括什么是函数、内置函数、函数的定义和函数的调用,以及通过示例展示函数在实际编程中的应用。什么是函数?在Python中,......
  • python06
    二:元组(不能修改)注意:元组是不可变类型,元组中的元素不能修改,不能添加或者删除等操作格式:tuple() #使用tuple内置函数创建元组a=()#空元组 1"""2元组:不能修改3()表示4"""5t1=()6t2=(1,4)7t3=(1,2,3)8t4=('pyt......