軟體供應鏈安全 | Python Fake Package引發的任意程式碼執行風險
前言
本文將結合一個例項講解安裝Fake Python Package時可能引起的任意程式碼執行風險(原理同Package 釣魚,所以安裝Python Package 一定要小心哦)以及相應的緩解辦法。
一般來說,利用Python Package執行一些特定程式碼有兩種途徑:
在Package 執行的時候,稱為執行時任意程式碼執行;
在Package 安裝時就觸發任意程式碼執行, 稱為安裝時任意程式碼執行。
本文以後者為例進行演示與說明。
0×01 實驗與分析
1、演示
惡意的Package構造如下:
非常簡單,就是一個安裝入口檔案setup.py (setup.cfg用於預先設定一些安裝選項)。
當我們執行python setup.py install 或者 更常用的命令 pip install freebuf/ (這裡freebuf後加上一個’/'表示安裝本地名為freebuf 檔案中的原始碼,如果freebuf這個包通過原始碼包形式上傳至Pypi的後,便可省略‘/’) 的時候便會觸發預先設定好的惡意程式碼,演示如下:
注意到上圖中的Running setup.py了嗎,這代表這時惡意程式碼已經開始執行,惡意程式碼會在/ 目錄下寫入一個明文Freebuf的檔案,內容為:“歡迎大家來Freebuf投稿!”
2、分析
這是怎麼實現的呢? 答案就是Hook setup.py install 過程 ,原理如下:
setuptools 包提供了一個安裝類 : setuptools.command.install.install,只要繼承這個類,然後重寫其run方法,那麼就可以達到hook pip install xxx/ 或 python setup.py install 行為的目的。
完整hook 需要2步。
第一步,重寫安裝類,即重寫原生install 類的ru 方法:
class CustomInstallCommand(install):
重寫setuptools.command.install.install 的run方法,可以實現呼叫自定義函式,在pip install 的時候觸發
def run(self): custom_function() install.run(self)
這裡的custom_function 就可以用來執行一些羞羞的操作(比如本例中的在/ 目錄下寫入一個Freebuf的檔案,內容為: 歡迎大家到Freebuf投稿!),你懂得。
第二步,在setuptools.setup 設定中指明重寫後的安裝類:
setuptools.setup( ... , cmdclass={ 'install': CustomInstallCommand, }, )
0×02 如何防範
1、對於習慣下載原始碼包,然後本地安裝的同學
在安裝前檢查一下setup.py中是否有惡意程式碼。 當然這可能難為一些同學了,那就建議你不要以root許可權進行安裝,比如普通使用者可使用pip –user 來避免使用root許可權安裝包,然後從靠譜的站點下載Python Package 原始碼包。
2、對於使用pip 進行Package安裝的同學
僅安裝二進位制的包,即採用wheels機制分發的原始碼包,字尾為.whl, 可以通過–only-binary 指定僅安裝二進位制軟體包,比如:
pip install --only-binary :all: Django
如果不加–only-binary,則下載的是原始碼包,如下:
這裡補充一下關於wheels的說明(詳情點選0×03中的參考連結):
簡單的講,通過wheels機制分發的軟體包,可以理解為在上傳package時將已經在本地執行過setup.py的結果,然後打包上傳了。
下載後再次安裝的時候就不會再執行setup.py了,故也就無法通過setup.py執行惡意程式碼了。
pip 現在支援原始碼包(.tar.gz字尾,裡面包含setup.py檔案,安裝時會執行setup.py)安裝和whl二進位制包安裝,所以得小心點。
校驗下軟體包的hash
–require-hashes ,加上這個安裝選項
擦亮雙眼,別被披著羊皮的狼給騙了(比如相似名字或者同形異議字的包給騙了)
3、建議Pypi 加大稽核力度,儘可能減少惡意軟體包的上傳
0×03 參考資料
ofollow" rel="nofollow,noindex" target="_blank">https://blog.zengrong.net/post/2169.html
https://packaging.python.org/discussions/wheel-vs-egg/
https://github.com/pypa/pip/issues/4735
*本文作者:ForrestX386,轉載請註明來自FreeBuf.COM