別這樣直接執行Python命令,否則電腦等於“裸奔”
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
所以問題就來了,如果你的下載檔案中有一個叫做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也有可能將惡意程式引入到程式碼中。
預防措施
最後總結一下要點。
- 如果要在下載資料夾~/Downloads中使用Python編寫的工具,請養成良好習慣,使用pip所在路徑/path/to/venv/bin/pip,而不是輸入/path/to/venv/bin/python -m pip。
- 避免將~/Downloads作為當前工作目錄,並在啟動之前將要使用的任何軟體移至更合適的位置。
瞭解Python從何處獲取執行程式碼非常重要。賦予其他人執行任意Python命令的能力等同於賦予他對你電腦的完全控制權!
希望以上文字對初學Python的你有所幫助。
注意:如果你是打算找python高薪工作的話。我建議你多寫點真實的企業專案積累經驗。不然工作都找不到,當然很多人沒進過企業,怎麼會存在專案經驗呢? 所以你得多找找企業專案實戰多練習下撒。如果你很懶不想找,也可以進我的Python交流圈:1156465813。群檔案裡面有我之前在做開發寫過的一些真實企業專案案例。你可以拿去學習,不懂都可以在裙裡找我,有空會耐心給你解答下。
以下內容無用,為本篇部落格被搜尋引擎抓取使用
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
python 是幹什麼的 零基礎學 python 要多久 python 為什麼叫爬蟲
python 爬蟲菜鳥教程 python 爬蟲萬能程式碼 python 爬蟲怎麼掙錢
python 基礎教程 網路爬蟲 python python 爬蟲經典例子
python 爬蟲
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
以上內容無用,為本篇部落格被搜尋引擎抓取使用