当前位置: 首页 > 后端技术 > Python

这样,直接运行Python命令,计算机就相当于“裸奔”

时间:2023-03-26 17:39:56 Python

Python已经成为世界上最流行的编程语言之一。原因当然是Python简洁易用的脚本语法,你只需要将一个程序放到一个.py文件中,它就可以快速运行。而且Python语言是易于使用的模块。比如你写了一个模块my_lib.py,只需要在调用这个模块的程序中加入一行importmy_lib即可。这样设计的好处是初学者可以很方便的执行命令。但是对于攻击者来说,这无异于为恶意程序打开了后门。尤其是一些初学者,将网上的Python软件包和代码下载到本地~/Downloads文件夹后,直接在这个路径下运行python命令,会给电脑带来很大的隐患。不要试图让它变得更容易。为什么这样做很危险?首先,我们需要了解Python程序安全运行需要满足的三个条件:系统路径上的每一个入口都在安全的位置;“主脚本”所在目录始终在系统路径中;如果python命令使用-c和-m选项,调用程序的目录也必须是安全的。如果您运行的是正确安装的Python,那么在Python安装目录和自动添加到系统路径的virtualenv之外的唯一位置是当前主程序的安装目录。这就是安全隐患的来源。让我用一个例子告诉你为什么。如果在/usr/bin文件夹下安装pip,运行pip命令。因为/usr/bin是一个系统路径,所以这是一个非常安全的地方。但是,有些人不喜欢直接使用pip,而是更喜欢调用/path/to/python-mpip。这样做的好处是可以避免设置环境变量$PATH的复杂性,对于Windows用户来说,也可以免去安装各种exe脚本和文件的麻烦。那么问题来了,如果你的下载文件中有一个叫pip.py的文件,那么你就会替换掉系统自带的pip,接管你的程序。下载文件夹不安全。例如,如果您直接从Internet下载Pythonwheel文件,而不是从PyPI下载。您自然会键入以下命令来安装它:~$cdDownloads~/Downloads$python-mpipinstall./totally-legit-package.whl这似乎是一件非常合理的事情。但你不知道的是,很有可能访问带有XSSJavaScript的站点并将带有恶意软件的pip.py放入下载文件夹中。下面是恶意攻击软件的演示示例:~$mkdirattacker_dir~$cdattacker_dir~/attacker_dir$echo'print("lolurpwnt")'>pip.py~/attacker_dir$python-mpipinstallrequestsslolurpwnt达到了吗?这段代码生成一个pip.py,接管程序而不是系统的pip。设置$PYTHONPATH是不安全的。前面说过,Python只会调用系统路径、virtualenv虚拟环境路径、当前主程序路径。你可能会说,那我手动设置$PYTHONPATH环境变量,不把当前目录放在环境变量里,不安全吗?不!不幸的是,您可能会遇到另一种类型的攻击。让我们模拟一个“脆弱”的Python程序:#tool.pytry:importoptional_extraexceptImportError:print("extranotfound,that'sfine")然后创建2个目录:install_dir和attacker_dir。将上述程序放在install_dir中。然后cdattacker_dir将复杂的恶意软件放在这里并将其名称更改为由tool.py调用的optional_extra模块:pyextra未找到,没关系到目前为止一切顺利,没有问题。但是这个习惯用法有一个严重的缺陷:第一次调用它时,如果$PYTHONPATH之前为空或未设置,它包含一个空字符串,它被解析到当前目录。让我们再试一次:~/attacker_dir$exportPYTHONPATH="/a/perfectly/safe/place:$PYTHONPATH";~/attacker_dir$python../install_dir/tool.pylol你看到了吗?恶意脚本接管了程序。为了安全起见,你可能认为清除$PYTHONPATH应该没问题吧?幼稚的!还是不安全!~/attacker_dir$exportPYTHONPATH="";~/attacker_dir$python../install_dir/tool.pylolurpwnt这里发生的是$PYTHONPATH变空了,这和unset不一样。因为在Python中,os.environ.get("PYTHONPATH")==""与os.environ.get("PYTHONPATH")==None是不一样的。如果要确保从shell中清除$PYTHONPATH,需要再次使用unset命令处理,然后就正常了。设置$PYTHONPATH曾经是设置Python开发环境的最常用方法。不过以后最好不要用了,virtualenv更能满足开发者的需求。如果您过去设置了$PYTHONPATH,现在是删除它的好机会。如果确实需要在shell中使用PYTHONPATH,请使用以下方法:在bash和zsh中,$PYTHONPATH变量的值会变成:$echo"${PYTHONPATH}"new_entry_1:new_entry_2这保证了环境变量$PYTHONPATH中没有空格和多余的冒号。如果您仍在使用$PYTHONPATH,请确保始终使用绝对路径!另外,直接在下载文件夹中运行JupyterNotebook同样危险,比如jupyternotebook~/Downloads/anything.ipynb也可能将恶意程序引入代码中。注意事项以要点摘要结尾。1.如果要使用下载文件夹~/Downloads下用Python编写的工具,请养成使用pip所在路径/path/to/venv/bin/pip的好习惯,不要输入/path/to/venv/bin/python-mpip.2.避免使用~/Downloads作为当前工作目录,在开始之前将任何你想使用的软件移动到更合适的位置。了解Python从何处获取其执行代码非常重要。给别人执行任意Python命令的能力,就等同于让他完全控制你的电脑!