當前位置:
首頁 > 新聞 > Python Fake Package引發的任意代碼執行風險

Python Fake Package引發的任意代碼執行風險

前言


本文將結合一個實例講解安裝Fake Python Package時可能引起的任意代碼執行風險(原理同Package 釣魚,所以安裝Python Package 一定要小心哦)以及相應的緩解辦法。


一般來說,利用Python Package執行一些特定代碼有兩種途徑:



在Package 執行的時候,稱為運行時任意代碼執行;

在Package 安裝時就觸發任意代碼執行, 稱為安裝時任意代碼執行。


本文以後者為例進行演示與說明。


0x01 實驗與分析


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,},)

0x02 如何防範


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的說明(詳情點擊0x03中的參考鏈接):



簡單的講,通過wheels機制分發的軟體包,可以理解為在上傳package時將已經在本地執行過setup.py的結果,然後打包上傳了。


下載後再次安裝的時候就不會再執行setup.py了,故也就無法通過setup.py執行惡意代碼了。


pip 現在支持源碼包(.tar.gz後綴,裡面包含setup.py文件,安裝時會執行setup.py)安裝和whl二進位包安裝,所以得小心點。


校驗下軟體包的hash


—require-hashes ,加上這個安裝選項


擦亮雙眼,別被披著羊皮的狼給騙了(比如相似名字或者同形異議字的包給騙了)

3、建議Pypi 加大審核力度,儘可能減少惡意軟體包的上傳


0x03 參考資料



https://blog.zengrong.net/post/2169.html


https://packaging.python.org/discussions/wheel-vs-egg/


https://paper.seebug.org/326/


https://pythonwheels.com/


https://github.com/pypa/pip/issues/4735


https://cuyu.github.io/python/2017/08/07/%E4%BD%BF%E7%94%A8setuptools%E5%AE%9E%E7%8E%B0pip-install%E6%97%B6%E6%89%A7%E8%A1%8C%E6%8C%87%E5%AE%9A%E8%84%9A%E6%9C%AC


*本文作者:ForrestX386,轉載請註明來自FreeBuf.COM


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

安全驅動下的數字新生活,第四屆CSS互聯網安全領袖峰會隨筆
一加6手機的Bootloader漏洞可讓攻擊者控制設備

TAG:FreeBuf |