警惕!安装Python 软件包也能触发恶意代码
翻译:360代码卫士团队
在机器上执行代码听起来并无特别之处,但从安全角度而言,代码执行之时是一个重要的考虑点。
Python 能让用户安装程序中包含的软件包以扩展其功能。当程序执行时,软件包中的代码也会按预期执行。然而,少有人知道的是,代码也可作为软件包本身安装的一部分执行。
一位 GitHub 名称是 “mschwager” 的安全研究员展示了安装软件包时能滥用 Python 模块中 ‘setup.py’ 文件执行代码执行的攻击方法。攻击者能够通过这种方法将恶意代码放置到以根权限执行的软件包中,虽然并非所有的软件包都要求具有这种级别的权限。
为此,mschwager 创建了名为 “owned” 的 PoC 安装文件,详细说明了这种攻击方法。如下代码说明了当 ‘pip install’ 运行时如何触发自定义的 ‘PostInstallCommand’ 类。
from setuptools import setup
from setuptools.command.installimport install
classPostInstallCommand(install):
def run(self):
# Insert code here
install.run(self)
setup(
...
cmdclass={
'install': PostInstallCommand,
},
...
)
安装文件可部署恶意软件
Python 模块一般通过软件包管理器 ‘pip’ 安装,它会启动软件包开发人员开发的 ‘setup.py’ 文件。由于该软件包只是为了帮助用户将模块添加到机器上,因此它并不特别引人注意。
当提到模块或软件包时,人们倾向于开展彻底的检查,因为该代码将被导入并在程序中运行,因此人们会检查并找出其中的恶意代码。然而,人们却不会分析一个安装文件,而它恰恰能导致攻击者通过更简单的方法在无需篡改模块的情况下感染机器。另外,Tigzy 解释称,某 app 的Python 软件包的代码可能永远不会执行,因为该 app 无需这个指定的部分。
然而,将恶意代码放置在 ‘setup.py’ 中将导致恶意软件被安装且无人知晓,即使这个软件包或 Python 本身并未使用。
官方 Python 仓库中的恶意模块
恶意库在软件包仓库中并不少见。去年,研究人员从 Python 的第三方库 PyPi 中发现了10个恶意库。恶意开发人员将名称类似于合法模块的库上传,之后诱骗用户下载。
显然,这种攻击方法奏效了,因为用户认为这个软件包的名称正确,因此不去查看代码或检查拼写。由于缺乏对仓库的安全检查以及对添加到检索中的内容屏蔽,因此恶意内容很有可能遭上传。
安全措施
Mschwager 建议开发人员时刻对安装在系统中的 Python 模块保持警惕,尤其是该模块要求根权限的情况下。在其它情况下,他建议使用 –user 标记设置本地权限,并在哈希检测模式下安装软件包以确保软件包未遭攻陷。
花点时间检查模块的名称是否正确也是防御风险的一种方法,以防止用户掉入蓄意输入错误的陷阱中。
关联阅读
原文链接
https://www.bleepingcomputer.com/news/security/python-package-installation-can-trigger-malicious-code/
本文由360代码卫士编译,不代表360观点,转载请注明 “转自360代码卫士www.codesafe.cn”。