Python 初學者請注意!別這樣直接運行 python 命令,否則電腦等於「裸奔」

2021-02-23 AI有道
曉查 編譯整理 
量子位 報導 | 公眾號 QbitAI

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的你有所幫助。

原文連結:
https://glyph.twistedmatrix.com/2020/08/never-run-python-in-your-downloads-folder.html

重磅

AI有道年度技術文章電子版PDF來啦!

掃描下方二維碼,添加 AI有道小助手微信,可申請入群,並獲得2020完整技術文章合集PDF(一定要備註:入群 + 地點 + 學校/公司。例如:入群+上海+復旦。 

長按掃碼,申請入群

(添加人數較多,請耐心等待)

感謝你的分享,點讚,在看三連↓

相關焦點

  • 別這樣直接運行python命令,否則電腦等於「裸奔」
    原因當然是Python簡明易用的腳本語法,只需把一段程序放入.py文件中,就能快速運行。而且Python語言很容易上手模塊。比如你編寫了一個模塊my_lib.py,只需在調用這個模塊的程序中加入一行import my_lib即可。這樣設計的好處是,初學者能夠非常方便地執行命令。但是對攻擊者來說,這等於是為惡意程序大開後門。
  • Python初學者請注意!別這樣直接運行python命令,否則電腦等於「裸奔」
    原因當然是Python簡明易用的腳本語法,只需把一段程序放入.py文件中,就能快速運行。而且Python語言很容易上手模塊。比如你編寫了一個模塊my_lib.py,只需在調用這個模塊的程序中加入一行import my_lib即可。這樣設計的好處是,初學者能夠非常方便地執行命令。但是對攻擊者來說,這等於是為惡意程序大開後門。
  • Python初學者注意了,別再讓你的命令「裸奔」了
    原因當然是Python簡明易用的腳本語法,只需把一段程序放入.py文件中,就能快速運行。而且Python語言很容易上手模塊。比如你編寫了一個模塊my_lib.py,只需在調用這個模塊的程序中加入一行import my_lib即可。這樣設計的好處是,初學者能夠非常方便地執行命令。但是對攻擊者來說,這等於是為惡意程序大開後門。
  • 致Python 初學者們! - CSDN
    基於這個觀點,我不建議初學者一開始就使用集成開發工具——至少,在開始第一個星期不要使用IDE。對於Python這樣一種解釋型的腳本語言,一款趁手的編輯器就足夠了。Linux平臺上,Vim或者Emacs都足夠好(如果你通曉二者或者其中之一的話,請接受我的敬意);Windows平臺上,我推薦使用notepad++。
  • 學python能找到女朋友嗎(python基礎教程)
    編者按:學習python近兩年,談談我對於python的一點小理解,也從一些方面談談自己微薄的想法,本文會介紹如何學習Python。實現一個微型的HTTP服務程序來說是很簡單的事情,在Python下,只需要一個命令行,為了提高大家的編程效率,那就趕快關注本文吧!
  • Python基礎篇-13 Python不是內部或外部命令的解決方法
    第一章 Python編程基礎----Python不是內部或外部命令的解決方法安裝 Python 環境沒有問題的讀者,可直接跳過本節,繼續閱讀後續文章。有些讀者,在命令行窗口(Linux 稱為終端)中輸出 python 命令後,卻顯示「『python』不是內部或外部命令,也不是可運行的程序或批處理文件」,如圖 1 所示:
  • Python初學者一定要掌握Jupyter神器,助你兩個星期入門
    Jupyter 是一款開放性的代碼編寫軟體,最大的特點是能夠實時運行代碼,查看輸出效果。同時該軟體集成了多種插件,能夠實現非常複雜的功能。對於初學者而言,因為Jupyter具有良好的交互性,方便看到每一行、每一個代碼塊的輸出結果,Jupyter成為眾多Python初學者的青睞。
  • 【手把手教python系列】80%初學者都會遇到的pip錯誤,你get到了嗎?
    本節主要是講一下python中比較重要的通過pip進行安裝時,遇到的問題和錯誤。安裝命令寫的位置不對有部分同學在安裝時,將安裝的命令寫入到代碼中,雖然也能安裝,但是這個一般不符合正常的規範。比如這樣的。那正常應該將命令寫在什麼地方呢,對於windows來說,一般寫在cmd命令的dos界面裡。
  • python執行系統命令
    在實際開發中,除了編寫python自身的代碼外,還經常需要執行作業系統的命令。
  • Python基礎篇-10 Windows安裝Python(圖解)
    我建議初學者直接使用 Python 3.x。截止到目前(2020-01-02),Python 的最新版本是 3.8.x,我們就以該版本為例演示 Windows 下的 Python 安裝過程。點擊上圖中的版本號或者「Download」按鈕進入對應版本的下載頁面,滾動到最後即可看到各個平臺的 Python 安裝包。
  • Python兩種基本數據類型:數值及字符串;python交互式運行環境
    嗯,對於學習編程的初學者來說。裡面用到很多python編程的知識點。筆者覺得有必要解釋一下。編程需要大量數據,為了編程方便,數據就分成了不同的類型,不同的數據類型有不同的特性。也可以用單引號表示『這個』、『字符』、『字符串類型』python交互式運行環境在pycharm中,可以直接調用python交互式運行環境,打開pycharm的界面,看到左下角有個python console(python控制臺)點擊python console即可進入python交互式運行環境
  • Python程序的編輯及運行,Pycharm的下載安裝
    Python程序的運行方式:在我這有三種:1、通過命令行(command.exe)運行Python。2、通過Python自帶的IDLE(集成開發環境 integrated development environment)3、PyCharm 一個強大的IDE(集成開發環境 integrated development environment)第一種 命令行運行Python開始菜單- 運行-cmd 按確認後進入命令行
  • 零基礎菜鳥如何快速上手Python
    pip的作用:安裝python插件時會使用pip,pip用來安裝軟體。注意:不要保留多個python版本,只保留一個python版本!!!!!!環境變量配置完成後,重啟電腦,再打開cmd終端進行驗證。注意:如果裝過loadrunning需要檢查是否有環境變量pip,否則會導致pip衝突。
  • python:kivy(apk打包工具)在Win10安裝步驟
    準備工作請確保你的電腦上,已經安裝了 Python 3.6版本以上, 並且已經設置好了 pip 國內源(國內鏡像)。(小編的 Python 3.7版本)一、Windows 下安裝 kivy1.安裝 kivy在 windows 命令行中,執行以下命令python -m pip install kivy4.
  • 如何編寫和運行Python程序
    Shell窗口,執行python命令,啟動Python交互式解釋器。第一種方式是進入Pyhton的安裝目錄,直接運行python.exe程序;第二種方式是進入Windows命令行窗口,在命令行窗口啟動python.exe。在Windows命令行窗口啟動Python交互式解釋器,首先需要將Python安裝目錄的路徑,添加到Path系統環境變量。否則,只能進入Python安裝目錄啟動交互式解釋器。
  • 如何編寫完美的 Python 命令行程序?
    作者 | Yannick Wolff譯者 | 彎月責編 | 屠敏作為 Python 開發者,我們經常要編寫命令行程序。比如在我的數據科學項目中,我要從命令行運行腳本來訓練模型,以及計算算法的準確率等。是個列表,包含用戶在運行腳本時輸入的所有參數(包括腳本名自身)。
  • python實戰演練2:python可執行文件運行不成功怎麼辦
    安裝pyinstaller的方法:在支持pip命令的目錄(一般只要安裝了python集成環境的都支持這個命令,我的python安裝的時候使用的是Anaconda,所以直接在windows的開始目錄裡面就有個專門用於pip命令的cmd界面)直接使用命令pip install PyInstaller即可。
  • 如何在windows下安裝Python(Python入門教程)
    中找到最新版本的Python安裝包,點擊進行下載,請注意,當你的電腦是32位的機器,請選擇32位的安裝包,如果是64位的,請選擇64位的安裝包;第二步:安裝A.雙擊下載好的安裝包,彈出如下界面:這裡要注意的是,將python加入到
  • 如何用iPad運行Python代碼?
    結果執行起來,你根本分不清運行的 Python, pip 命令來自哪一個套件,更搞不清楚軟體包究竟安裝到哪裡去了。再加上虛擬環境配置,你就要抓狂了。還有的,甚至是網絡擁塞問題。因為有時需要現場安裝調用體積龐大的軟體包,幾十臺電腦「預備——齊」一起爭搶有限的Wifi帶寬,後果可想而知。痛定思痛,我決定改變一下現狀。目前的教程只提供基礎原始碼。
  • 為初學者準備的15本免費Python電子書
    想學習Python,但沒辦法每天都泡在電腦上,想通過閱讀加強本文選擇14本高質量的Python書籍。Python編程藍圖:初學者入門Python的學習指南,書中涵蓋你學習Python所需的所有基礎知識:● 了解Python程序● 初學者需要了解的基本命令● 使用循環● 處理代碼中的異常● 條件陳述● .