0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

这样运行Python命令会给电脑带来极大的隐患

人工智能与大数据技术 来源:AI新媒体量子位 作者:AI新媒体量子位 2020-12-07 14:35 次阅读

Python已经成为全球最受欢迎的编程语言之一。原因当然是Python简明易用的脚本语法,只需把一段程序放入.py文件中,就能快速运行。

而且Python语言很容易上手模块。比如你编写了一个模块my_lib.py,只需在调用这个模块的程序中加入一行import my_lib即可。

这样设计的好处是,初学者能够非常方便地执行命令。但是对攻击者来说,这等于是为恶意程序大开后门。

尤其是一些初学者将网上的Python软件包、代码下载的到本地~/Downloads文件夹后,就直接在此路径下运行python命令,这样做会给电脑带来极大的隐患。

别再图方便了

为何这样做会有危险?首先,我们要了解Python程序安全运行需要满足的三个条件:

系统路径上的每个条目都处于安全的位置;

“主脚本”所在的目录始终位于系统路径中;

若python命令使用-c和-m选项,调用程序的目录也必须是安全的。

如果你运行的是正确安装的Python,那么Python安装目录和virtualenv之外唯一会自动添加到系统路径的位置,就是当前主程序的安装目录。

这就是安全隐患的来源,下面用一个实例告诉你为什么。

如果你把pip安装在/usr/bin文件夹下,并运行pip命令。由于/usr/bin是系统路径,因此这是一个非常安全的地方。

但是,有些人并不喜欢直接使用pip,而是更喜欢调用/path/to/python -m pip。

这样做的好处是可以避免环境变量$PATH设置的复杂性,而且对于Windows用户来说,也可以避免处理安装各种exe脚本和文档。

所以问题就来了,如果你的下载文件中有一个叫做pip.py的文件,那么你将它将取代系统自带的pip,接管你的程序。

下载文件夹并不安全

比如你不是从PyPI,而是直接从网上直接下载了一个Python wheel文件。你很自然地输入以下命令来安装它:

~$ cd Downloads ~/Downloads$ python -m pip install 。/totally-legit-package.whl

这似乎是一件很合理的事情。但你不知道的是,这么操作很有可能访问带有XSS JavaScript的站点,并将带有恶意软件的的pip.py到下载文件夹中。

下面是一个恶意攻击软件的演示实例:

~$ mkdir attacker_dir ~$ cd attacker_dir ~/attacker_dir$ echo ‘print(“lol ur pwnt”)’ 》 pip.py ~/attacker_dir$ python -m pip install requests lol ur pwnt

看到了吗?这段代码生成了一个pip.py,并且代替系统的pip接管了程序。

设置$PYTHONPATH也不安全

前面已经说过,Python只会调用系统路径、virtualenv虚拟环境路径以及当前主程序路径

你也许会说,那我手动设置一下 $PYTHONPATH 环境变量,不把当前目录放在环境变量里,这样不就安全了吗?

非也!不幸的是,你可能会遭遇另一种攻击方式。下面让我们模拟一个“脆弱的”Python程序:

# tool.py try: import optional_extra except ImportError: print(“extra not found, that‘s fine”)

然后创建2个目录:install_dir和attacker_dir。将上面的程序放在install_dir中。然后cd attacker_dir将复杂的恶意软件放在这里,并把它的名字改成tool.py调用的optional_extra模块:

# optional_extra.py print(“lol ur pwnt”)

我们运行一下它:

~/attacker_dir$ python 。./install_dir/tool.py extra not found, that’s fine

到这里还很好,没有出现任何问题。

但是这个习惯用法有一个严重的缺陷:第一次调用它时,如果$PYTHONPATH以前是空的或者未设置,那么它会包含一个空字符串,该字符串被解析为当前目录。

让我们再尝试一下:

~/attacker_dir$ export PYTHONPATH=“/a/perfectly/safe/place:$PYTHONPATH”; ~/attacker_dir$ python 。./install_dir/tool.py lol ur pwnt

看到了吗?恶意脚本接管了程序。

为了安全起见,你可能会认为,清空$PYTHONPATH总该没问题了吧?Naive!还是不安全!

~/attacker_dir$ export PYTHONPATH=“”; ~/attacker_dir$ python 。./install_dir/tool.py lol ur pwnt

这里发生的事情是,$PYTHONPATH变成空的了,这和unset是不一样的。

因为在Python里,os.environ.get(“PYTHONPATH”) == “”和os.environ.get(“PYTHONPATH”) == None是不一样的。

如果要确保$PYTHONPATH已从shell中清除,则需要使用unset命令处理一遍,然后就正常了。

设置$PYTHONPATH曾经是设置Python开发环境的最常用方法。但你以后最好别再用它了,virtualenv可以更好地满足开发者需求。如果你过去设置了一个$PYTHONPATH,现在是很好的机会,把它删除了吧。

如果你确实需要在shell中使用PYTHONPATH,请用以下方法:

export PYTHONPATH=“${PYTHONPATH:+${PYTHONPATH}:}new_entry_1” export PYTHONPATH=“${PYTHONPATH:+${PYTHONPATH}:}new_entry_2”

在bash和zsh中,$PYTHONPATH变量的值会变成:

$ echo “${PYTHONPATH}” new_entry_1:new_entry_2

如此便保证了环境变量$PYTHONPATH中没有空格和多余的冒号。

如果你仍在使用$PYTHONPATH,请确保始终使用绝对路径!

另外,在下载文件夹中直接运行Jupyter Notebook也是一样危险的,比如jupyter notebook ~/Downloads/anything.ipynb也有可能将恶意程序引入到代码中。

预防措施

最后总结一下要点。

如果要在下载文件夹~/Downloads中使用Python编写的工具,请养成良好习惯,使用pip所在路径/path/to/venv/bin/pip,而不是输入/path/to/venv/bin/python -m pip。

避免将~/Downloads作为当前工作目录,并在启动之前将要使用的任何软件移至更合适的位置。

了解Python从何处获取执行代码非常重要。赋予其他人执行任意Python命令的能力等同于赋予他对你电脑的完全控制权!

希望以上文字对初学Python的你有所帮助。

原文标题:别这样直接运行Python命令,否则电脑等于“裸奔”

文章出处:【微信公众号:人工智能与大数据技术】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3597

    浏览量

    93616
  • python
    +关注

    关注

    56

    文章

    4784

    浏览量

    84482

原文标题:别这样直接运行Python命令,否则电脑等于“裸奔”

文章出处:【微信号:TheBigData1024,微信公众号:人工智能与大数据技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    电脑是已经安装了python2.7,为什么打开GUI的script window时,一直提示未找到python2.7?

    电脑是已经安装了python2.7,为什么打开GUI的script window时,一直提示未找到python2.7?
    发表于 11-14 07:50

    APM32F411板的python+pyocd命令行操作

    前段时间学习了一下如何使用pyocd配合APM32F411VCTINY板在命令行下给它进行各种骚操作,在使用一段时间后就想着:pyocd是基于python的,那是不是也可以使用python脚本+pyocd使用起来呢?
    的头像 发表于 10-18 16:21 178次阅读
    APM32F411板的<b class='flag-5'>python</b>+pyocd<b class='flag-5'>命令</b>行操作

    使用Python搭建简易本地http服务器,升级WIPI模组

    包,因此对于python来说,只需输入一行命令,就能轻松打开http服务。当然,要运行网页,就需要网页有显示内容。因此我们可以先建立一个用于存放网页文件的文件夹。例如在F盘创建一个httpserver
    的头像 发表于 09-29 15:38 277次阅读
    使用<b class='flag-5'>Python</b>搭建简易本地http服务器,升级WIPI模组

    使用labview调用python运行一段时间后,报错

    使用labview调用python运行一段时间后,报错。 labview版本:2018*64; python:3.6x64 怎么解决~
    发表于 08-26 10:16

    pytorch怎么在pycharm中运行

    PyTorch。以下是安装PyTorch的步骤: 打开终端或命令提示符。 根据你的系统和需求,选择适当的安装命令。例如,如果你使用的是Python 3.8和CUDA 10.2,可以使用以下命令
    的头像 发表于 08-01 16:22 1279次阅读

    工频电机低频运行有什么隐患

    工频电机在低频运行时,可能会存在一些隐患和问题。以下是对这些隐患的分析: 电机效率降低 工频电机在设计时,通常以50Hz或60Hz的频率运行。当电机在低于额定频率的条件下
    的头像 发表于 08-01 10:25 1463次阅读

    ubuntu下(python ver 2.7.6)运行python demo_server.py后无反应怎么解决?

    python ver 2.7.6)运行python demo_server.py后无反应 请问该如何正确运行此脚本?
    发表于 07-22 08:20

    编译ESP-AT工程,运行python build.py install命令提示符遇到的疑问求解

    你好,我按照“编译 ESP-AT 工程”步骤操作时候,走到第三步:安装环境,运行python build.py install命令提示符,显示 C
    发表于 06-27 06:05

    vscode esp-idf终端不能执行python命令怎么解决?

    vscode esp-idf终端不能执行python命令,先前重装win10系统,安装vscode,安装esp-idf插件,选择版本安装,就能在终端执行idf.py。现在重装系统,按照先前的方式安装也不行了,是官方源问题,还是怎么回事,弄了两天了,用了3台
    发表于 06-05 06:37

    请问晶振会不会给信号线IA带来干扰?

    不知道这样,晶振会不会给信号线IA带来干扰?
    发表于 05-13 07:53

    如何使用linux下gdb来调试python程序

    中,我们将介绍如何在Linux中使用GDB来调试Python程序。 一、安装GDB和Python调试符号 在使用GDB调试Python程序之前,需要安装GDB和Python调试符号。首
    的头像 发表于 01-31 10:41 2440次阅读

    如何减少35kV煤矿变电站运行中的安全隐患或事故

    电子发烧友网站提供《如何减少35kV煤矿变电站运行中的安全隐患或事故.docx》资料免费下载
    发表于 01-03 10:18 0次下载

    电脑闪屏是什么原因,怎么解决?

    电脑闪屏是什么原因,怎么解决? 电脑闪屏是指计算机屏幕在使用过程中出现频繁的黑屏、白屏或闪烁的现象。这种问题可能会给用户带来极大的困扰,影响
    的头像 发表于 12-25 11:21 6534次阅读

    【涂鸦T2-U开发板试用体验】+T2 Development Board V1.0.0 python环境搭建

    使用pip安装所需的库和工具。例如,如果您需要安装NumPy库,可以运行以下命令: ```pip3 install numpy``` 6. 现在,您可以在T2 Development Board V1.0.0上使用Python
    发表于 12-15 17:55

    eclipse怎么使用命令

    。JDK是运行Java程序所必需的环境,而Eclipse则是一个基于Java开发的IDE。在确保安装完毕后,我们可以通过以下步骤来在命令行中
    的头像 发表于 12-06 11:26 2500次阅读