概述

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"
}]

  

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

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

  1. py 包和模块,软件开发目录规范

    目录 py 包和模块,软件开发目录规范 什么是包? 什么是模块? 软件开发目录规范 py 包和模块,软件开发目录规范 什么是包? 包指的是内部包__init__.py的文件夹 包的作用: 存放模块,包 ...

  2. python开发者框架套件总结: package 包 frameworks

    python开发者的package 包 框架套件总结: frameworks     开发环境: anaconda pycharm django awesome-django : 介绍 django ...

  3. Mobile 抓包,代理

    Mobile代理,抓包工具 Fiddler 下载链接, 适用于Win平台.免费: Charles, 下载链接, 使用与MAC平台,收费,有30天的免费使用期,重新下载安装可以再次获得30天的免费使用时 ...

  4. aop的概念以及 cglib-nodep-2.1_3.jar第三方jia包动态代理使用

    引入 cglib-nodep-2.1_3.ja包 cglib产生的代理类是目标类的子类 定义接口,让切面都继承它,方便加入到动态代理方法 的那个类中使用 在SalaryInterceptor类中使用  ...

  5. npm下载包时代理配置

    主要有两种方式,1通过命令行临时配置,2通过配置文件进行永久配置. 1.命令行: npm install --proxy http://localhost:1080 如果有账号密码等验证的,需要在后面 ...

  6. fiddler实现手机端抓包(代理)

    一.fiddler设置代理 1.打开Fiddler->Tools->Fiddler Options在Connection面板里将 Allow remote computers to con ...

  7. Fiddler抓包手机代理配置

    参考链接:https://i.wanz.im/2013/04/30/debugging_http_request_with_fiddler/ http://www.hangge.com/blog/ca ...

  8. 下载恶意pcap包的网站汇总

    说几个我经常用的,免费的:1.  Malware  Traffic  Analysis:  http://www.malware-traffic-analysis.net/2018/index.htm ...

  9. 下载恶意pcap包的网站

    说几个我经常用的,免费的:1.  Malware  Traffic  Analysis:  http://www.malware-traffic-analysis.net/2018/index.htm ...

  10. 使用国内镜像通过pip安装python的一些包 Cannot fetch index base URL http://pypi.python.org/simple/

    原文地址:http://www.xuebuyuan.com/1157602.html 学习flask,安装virtualenv环境,这些带都ok,但是一安装包总是出错无法安装, 比如这样超时的问题: ...

随机推荐

  1. JAVAweek4

    本周学习: 1.JAVA环境的搭建,包括JDK的下载,和classpath环境设置 2.*.java和*.class程序的运行 class Demo {public static void main( ...

  2. 构建一个语音转文字的WebApi服务

    构建一个语音转文字的WebApi服务 简介 由于业务需要,我们需要提供一个语音输入功能,以便更方便用户的使用,所以我们需要提供语音转文本的功能,下面我们将讲解使用Whisper将语音转换文本,并且封装 ...

  3. JXNU acm选拔赛 最小的数

    最小的数 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submissi ...

  4. pytest框架学习-测试用例发现机制以及用例执行命令

    pytest是什么 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高. Pytest安装 安装命令: ...

  5. WeLM微信自研NLP大规模语言模型

    2022年9月份微信AI推出自研NLP大规模语言模型WeLM ,该模型是一个尺寸合理的中文模型,能够在零样本以及少样本的情境下完成包多语言任务在内的多种NLP任务.openai的chatgpt是在20 ...

  6. Havoc C2d的初次使用

    Havoc C2 简介 Havoc是一款现代化的.可扩展的后渗透命令控制框架 当前的Havoc版本还处于早期开发版,随着框架的不断成熟,可能会对Havoc的API和核心结构进行大量更改 以下的配置部分 ...

  7. Python——第二章:字典(dictionary)以及 添、删、改、查

    首先, 字典是以键值对的形式进行存储数据的,必须有键[key],有值[value] 字典的表示方式: {key:value, key2:value, key3:value} 举例: dic = {&q ...

  8. 永久免费!国产操作系统 Deepin V20 Beta版发布(附安装教程)

    深度操作系统(DEEPIN)是武汉深之度科技有限公司致力于为全球用户提供美观易用.安全可靠的Linux发行版.经过一段时间的测试,这款操作系统的Beta版终于今天和大家见面了.这次Deepin v20 ...

  9. NoClassDefFoundError: javax/el/ELManager

    Caused by: java.lang.NoClassDefFoundError: javax/el/ELManager at org.hibernate.validator.messageinte ...

  10. Vue源码学习(十九):router基本原理

    好家伙,   0.什么是路由? 路由就是匹配到对应路径显示对应的组件! 那么我们要如何去实现? 我们来回忆一下这router怎么用的 1. 声明式路由配置:在路由配置对象中,定义路径与组件的映射关系. ...