1. 程式人生 > 實用技巧 >別這樣直接執行Python命令,否則電腦等於“裸奔”

別這樣直接執行Python命令,否則電腦等於“裸奔”

Python已經成為全球最受歡迎的程式語言之一。原因當然是Python簡明易用的指令碼語法,只需把一段程式放入.py檔案中,就能快速執行。

而且Python語言很容易上手模組。比如你編寫了一個模組my_lib.py,只需在呼叫這個模組的程式中加入一行import my_lib即可。

這樣設計的好處是,初學者能夠非常方便地執行命令。但是對攻擊者來說,這等於是為惡意程式大開後門。

尤其是一些初學者將網上的Python軟體包、程式碼下載的到本地~/Downloads資料夾後,就直接在此路徑下執行python命令,這樣做會給電腦帶來極大的隱患。

別再圖方便了

為何這樣做會有危險?首先,我們要了解Python程式安全執行需要滿足的三個條件:

  1. 系統路徑上的每個條目都處於安全的位置;

  2. “主指令碼”所在的目錄始終位於系統路徑中;

  3. 若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
$ python -m pip install ./totally-legit-package.whl

這似乎是一件很合理的事情。但你不知道的是,這麼操作很有可能訪問帶有XSS JavaScript的站點,並將帶有惡意軟體的的pip.py到下載資料夾中。

下面是一個惡意攻擊軟體的演示例項:

~$mkdirattacker_dir
~$cdattacker_dir
 
$echo'print("lolurpwnt")'>pip.py
$python-mpipinstallrequests
lolurpwnt

看到了嗎?這段程式碼生成了一個pip.py,並且代替系統的pip接管了程式。

設定$PYTHONPATH也不安全

前面已經說過,Python只會呼叫系統路徑、virtualenv虛擬環境路徑以及當前主程式路徑

你也許會說,那我手動設定一下$PYTHONPATH環境變數,不把當前目錄放在環境變數裡,這樣不就安全了嗎?

非也!不幸的是,你可能會遭遇另一種攻擊方式。下面讓我們模擬一個“脆弱的”Python程式:

#tool.py
try:
importoptional_extra
exceptImportError:
print("extranotfound,that'sfine")

然後建立2個目錄:install_dir和attacker_dir。將上面的程式放在install_dir中。然後cd attacker_dir將複雜的惡意軟體放在這裡,並把它的名字改成tool.py呼叫的optional_extra模組:

#optional_extra.py
print("lolurpwnt")

我們執行一下它:

$cd~/attacker_dir
$python../install_dir/tool.py
extranotfound,that'sfine

到這裡還很好,沒有出現任何問題。

但是這個習慣用法有一個嚴重的缺陷:第一次呼叫它時,如果$PYTHONPATH以前是空的或者未設定,那麼它會包含一個空字串,該字串被解析為當前目錄。

讓我們再嘗試一下:

~/attacker_dir$exportPYTHONPATH="/a/perfectly/safe/place:$PYTHONPATH";
~/attacker_dir$python../install_dir/tool.py
lolurpwnt

看到了嗎?惡意指令碼接管了程式。

為了安全起見,你可能會認為,清空$PYTHONPATH總該沒問題了吧?Naive!還是不安全!

~/attacker_dir$exportPYTHONPATH="";
~/attacker_dir$python../install_dir/tool.py
lolurpwnt

這裡發生的事情是,$PYTHONPATH變成空的了,這和unset是不一樣的。

因為在Python裡,os.environ.get(“PYTHONPATH”) == “”和os.environ.get(“PYTHONPATH”) == None是不一樣的。

如果要確保$PYTHONPATH已從shell中清除,則需要使用unset命令處理一遍,然後就正常了。

設定$PYTHONPATH曾經是設定Python開發環境的最常用方法。但你以後最好別再用它了,virtualenv可以更好地滿足開發者需求。如果你過去設定了一個$PYTHONPATH,現在是很好的機會,把它刪除了吧。

如果你確實需要在shell中使用PYTHONPATH,請用以下方法:

exportPYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}new_entry_1"
exportPYTHONPATH="${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交流圈:1156465813。群檔案裡面有我之前在做開發寫過的一些真實企業專案案例。你可以拿去學習,不懂都可以在裙裡找我,有空會耐心給你解答下。

以下內容無用,為本篇部落格被搜尋引擎抓取使用
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
python 是幹什麼的 零基礎學 python 要多久 python 為什麼叫爬蟲
python 爬蟲菜鳥教程 python 爬蟲萬能程式碼 python 爬蟲怎麼掙錢
python 基礎教程 網路爬蟲 python python 爬蟲經典例子
python 爬蟲
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
以上內容無用,為本篇部落格被搜尋引擎抓取使用