Python 初学者请注意!别这样直接运行 Python 命令,否则电脑等于“裸奔”

Stella981
• 阅读 313

点击上方“ 杰哥的IT之旅 ”,选择“ 星标 ”公众号

重磅干货,第一时间送达

Python 初学者请注意!别这样直接运行 Python 命令,否则电脑等于“裸奔”

晓查 编译整理

量子位 报道 | 公众号 QbitAI

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

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

Python 初学者请注意!别这样直接运行 Python 命令,否则电脑等于“裸奔”

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

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

别再图方便了

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

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

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

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

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

Python 初学者请注意!别这样直接运行 Python 命令,否则电脑等于“裸奔”

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

如果你把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_也有可能将恶意程序引入到代码中。

预防措施

最后总结一下要点。

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

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

Python 初学者请注意!别这样直接运行 Python 命令,否则电脑等于“裸奔”

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

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

_原文链接:
_https://glyph.twistedmatrix.com/2020/08/never-run-python-in-your-downloads-folder.html

**\- End -**










  


















本公众号全部博文已整理成一个目录,请在公众号后台回复「


`m`


」获取!


  














 

推荐阅读:

                                1、 
                               [利用 Python 爬取了 37483 条上海二手房信息,我得出的结论是?](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwMjg1NjY3Nw%3D%3D%26mid%3D2247496339%26idx%3D1%26sn%3De5e1bd267616e2f90e2c90870fb8929b%26scene%3D21%23wechat_redirect) 
                                 

2、 7 张思维导图带你掌握 “Python学习路线”

3、 一款基于 Python 语言的 Linux 资源监视器!

4、 利用 Python 爬取了 13966 条运维招聘信息,我得出了哪些结论?

5、 数据分析之AB testing实战(附Python代码)

6、 不懂送女朋友什么牌子的口红?没关系!Python 数据分析告诉你。

Python 初学者请注意!别这样直接运行 Python 命令,否则电脑等于“裸奔”

                       ![](https://oscimg.oschina.net/oscnet/d153a468-d064-4142-9ec9-e570a37861e6.png) 
                      


                      


                       点分享 
                      


                     


                     


                      


                       


                        ![](https://oscimg.oschina.net/oscnet/1e467074-4a1c-4b0d-a6bc-76f775f4544c.png) 
                       


                       


                        点点赞 
                       


                      


                      


                       


                        ![](https://oscimg.oschina.net/oscnet/c9ac922f-f9a2-4264-942d-ea22ac4a17d9.png) 
                       


                       


                        点在看 
                       


                      


                     


                    


                   


                  


                 


                


               


              


             


            


           


          


         


        


       


      


     


    


   

  
  
  

 
 
 

本文分享自微信公众号 - 杰哥的IT之旅(Jake_Internet)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
GitHub 上有哪些适合新手跟进的优质项目?
!(https://oscimg.oschina.net/oscnet/011f28e3bc332010e1442e6c00ed344805d.jpg)点击上方“迈微电子研发社”,选择“星标★”公众号重磅干货,第一时间送达!(https://oscimg.oschina.net/oscnet/cd44ba75f
Stella981 Stella981
2年前
Docker 架构原理、功能及使用
点击上方“杰哥的IT之旅”,选择“星标”公众号重磅干货,第一时间送达!(https://oscimg.oschina.net/oscnet/55595944998b405e9f939d9f9aa947d3.jpg)!(https://oscimg.oschina.net/oscnet/7f35f7e51704
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Stella981 Stella981
2年前
200的大额人民币即将面世?央行:Yes!
点击上方蓝字关注我们!(https://oscimg.oschina.net/oscnet/2a1c2ac00bf54458a78c48a6c2e547d5.png)点击上方“印象python”,选择“星标”公众号重磅干货,第一时间送达!!(
可莉 可莉
2年前
200的大额人民币即将面世?央行:Yes!
点击上方蓝字关注我们!(https://oscimg.oschina.net/oscnet/2a1c2ac00bf54458a78c48a6c2e547d5.png)点击上方“印象python”,选择“星标”公众号重磅干货,第一时间送达!!(
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这