导语:Python语言允许用户通过安装packages的形式来扩展功能。当程序执行的时候,package中的代码也会相应的执行。但在package安装的过程中,也有可能会有代码执行的情况。运行时代码执行没有问题,而安装时代码执行可能就会有问题了。

代码执行在计算机上是再正常不过的事情了,但从安全的角度来看,代码执行的时间不同,带来的结果可能就不同。

Python语言允许用户通过安装packages的形式来扩展功能。当程序执行的时候,package中的代码也会相应的执行。但在package安装的过程中,也有可能会有代码执行的情况。运行时代码执行没有问题,而安装时代码执行可能就会有问题了。

为了证明这种攻击的模式,研究人员mschwager在GitHub创建了POC。

GitHub地址:https://github.com/mschwager/0wned

注:整个过程是没有攻击行为的,只是POC。

首先,下载git库:

$ git clone https://github.com/mschwager/0wned.git

具体见setup.py代码:

https://github.com/mschwager/0wned/blob/master/setup.py

然后,安装下载的package 0wned:

$ sudo python -m pip install 0wned/
$ cat /0wned
Created '/0wned' with user 'root' at 1536011622

在pip安装的过程中是可以成功写入root目录的。也就是说0wned可以以root或管理员用户权限进行操作。

攻击细节

攻击者可以扩展setuptools模块来hook任意的pip命令。这里,0wned就利用了install类来完成这样的动作:

from setuptools import setup
from setuptools.command.install import install
 
class PostInstallCommand(install):
    def run(self):
        # Insert code here
        install.run(self)
 
setup(
    ...
    cmdclass={
        'install': PostInstallCommand,
    },
    ...
)

缓解措施

很多人会以为python package安装的过程是需要root或者管理员权限的,但事实并非如此。

第一,在安装package的过程中可以用–user标记来减小这个问题造成的影响:

$ python -m pip install --user 0wned/
$ cat ~/0wned
Created '/home/tempuser/0wned' with user 'tempuser' at 1536011624

第二,以哈希检查模式安装package,即使用–require-hashes标记。这可以防止安装的包被修改。

第三,检查package名是否正确。因为攻击者非常有可能使用typosquatting攻击,用恶意package来欺骗用户。

官方Python中存在恶意模块

Package库中存在恶意库是一种常见的现象。去年,研究人员再PyPi中就发现了10个恶意库。恶意开发者会上传一些与合法模块名相似的库来诱骗用户下载。

这种攻击存在的原因就是用户认为package的名是正确的,而且没有查看其中的代码或检查拼写。而且package库缺乏安全检查,因此上传恶意内容也是非常有可能的。

总结

Malwarebytes恶意软件分析师Tigzy说,使用IDE可以打开模块函数,查看是否有问题。攻击者也可以利用setup文件在不修改模块的情况下感染机器,这是一种非常简单的方法;而且package、python程序等不会意识到其中的恶意行为。但目前好像还没有发现有恶意软件这样做。但对用户来说分析setup文件有点难。Mschwager也建议用户在安装package之前至少先检查一些package名是否正确。

源链接

Hacking more

...