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
※安全驅動下的數字新生活,第四屆CSS互聯網安全領袖峰會隨筆
※一加6手機的Bootloader漏洞可讓攻擊者控制設備
TAG:FreeBuf |