亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么分析Python代碼審計中的反序列化和命令執行

發布時間:2021-12-04 16:27:02 來源:億速云 閱讀:154 作者:柒染 欄目:安全技術

這篇文章給大家介紹怎么分析Python代碼審計中的反序列化和命令執行,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

一、介紹

Python代碼審計方法多種多樣,但是總而言之是根據前人思路的遷移融合擴展而形成。目前Python代碼審計思路,呈現分散和多樣的趨勢。Python微薄研發經驗以及結合實際遇到的思路和技巧進行總結,以便于朋友們的學習和參考。

二、反序列化審計實戰

反序列化漏洞在Python代碼審計中屬于常見高危漏洞之一,它的危害性根據執行環境略有不同,本地和遠程分別為7.2和10的評分。通過評分也可得知漏洞危害是顯而易見。那么咱們應該如何發現這個漏洞?關于發現此種漏洞要從反序列化的模塊說起,Python的反序列化模塊主要為pickle、cPickle、yaml等等。有關反序列化漏洞問題在多年前就被人們所發現,目前所看到的大多數反序列化漏洞是由于應用調用了存在問題的反序列化模塊。那么咱們抓住尋找反序列化模塊則有可能會發現反序列化漏洞。

1. dask 命令執行漏洞(CNVD-2019-16789)

關于這個漏洞是筆者在2019年審計anaconda環境模塊時候發現,提交CNVD通過驗證,雖然是本地觸發漏洞,但絕對是關于反序列化漏洞很好的案例,漏洞利用yaml模塊問題進行反序列化。

(1) 漏洞分析

漏洞影響的版本 1.1.4  ,漏洞出現于dask模塊中config.py文件,第139行。源于程序通過coolect_yaml方法中使用了yaml所導致的問題,方法用途從yaml文件收集配置。

怎么分析Python代碼審計中的反序列化和命令執行

其中第148行會判斷是否為目錄,傳入文件就能繼續執行。漏洞觸發在第168行,使用了yaml.load執行了反序列化。

怎么分析Python代碼審計中的反序列化和命令執行

到此咱們通過POC觸發存在反序列化的方法,即可造成代碼執行問題。

(2) 漏洞POC

漏洞驗證截圖:

怎么分析Python代碼審計中的反序列化和命令執行

(3) 修復方法

yaml  在對于反序列化問題上,已經提供了安全反序列化的解決方法,程序使用yaml.safe_load可以進行安全的反序列化。咱們對于審計問題的修復建議根據實際情況使用。

2. NumPy 命令執行漏洞(CVE-2019-6446)

在NumPy  1.16.0版本之前存在反序列化命令執行漏洞,用戶加載惡意的數據源造成代碼執行。按照慣例在講這個反序列化之前要說明Python的pickle的反序列化原理和棧指令。但不是本篇重點,故暫不討論。

(1) 漏洞分析

咱們直接從代碼層說起,漏洞的入口,lib/npyio.py  第288行附近。在這里存在使用反序列化模塊的方法,并且allow_pickle值為True。allow_pickle 允許使用 Python pickles  保存對象數組,Python 中的 pickle 用于在保存到磁盤文件或從磁盤文件讀取之前,對對象進行序列化和反序列化。通俗講是個開關,并默認開啟。

怎么分析Python代碼審計中的反序列化和命令執行

漏洞觸發位置,位置在lib/npyio.py,第418行。這里有反序列化加載的方法。筆者將一些代碼省略,直觀看重點。默認格式要求ZIP文件前綴PK\x03\x04后綴PK\x05\x06,如果不滿足默認的格式,則會執行pickle.load()反序列化方法。

到此執行流程為 NumPy.lib.npyio.py:load()=>pickle.py:load()。

try:     # Code to distinguish from NumPy binary files and pickles.     _ZIP_PREFIX = b'PK\x03\x04'     _ZIP_SUFFIX = b'PK\x05\x06' # empty zip files start with this     ……      if magic.startswith(_ZIP_PREFIX) or magic.startswith(_ZIP_SUFFIX):     ……     elif magic == format.MAGIC_PREFIX:     ……     else:         # Try a pickle         if not allow_pickle:             raise ValueError("Cannot load file containing pickled data "                              "when allow_pickle=False")         try:             return pickle.load(fid, **pickle_kwargs)         except Exception:             raise IOError(                 "Failed to interpret file %s as a pickle" % repr(file)) finally:      ……

(2) 漏洞POC

綜上所述,編寫POC如下:

from numpy.lib import npyio from numpy import __version__ print(__version__) import os import pickle class Test(object):     def __init__(self):         self.a = 1     def __reduce__(self):         return (os.system,('whoami',)) tmpdaa = Test() with open("test-file.pickle",'wb') as f:     pickle.dump(tmpdaa,f) npyio.load("test-file.pickle")

測試結果如圖:

怎么分析Python代碼審計中的反序列化和命令執行

三、命令執行審計實戰

在Python模塊中命令執行漏洞同樣較為常見、危害較大。在審計命令執行時,大多時候程序可能會在滿足特定條件下才能執行命令,也可能需要在不同的系統中才會執行命令,所以需要關注代碼邏輯和某些特性。

1. numexpr 命令執行漏洞(CNVD-2019-17298)

Numexpr是機器學習模塊NumPy的一個加速包,主要用于提高NumPy的性能。

(1) 漏洞分析

在該模塊/numexpr/cpuinfo.py 第37行,存在執行命令的方法。

怎么分析Python代碼審計中的反序列化和命令執行

getoutput  就是存在問題的方法,通過邏輯在.popen中進行命令執行,但是由于os.WIFEXITED(status)和os.WEXITSTATUS(status)只在linux下支持所以在windows下面執行會報錯。linux  下當status  為全局變量并且賦值為0的時候,os.WIFEXITED(status)結果為True,os.WEXITSTATUS(status)結果為0。根據代碼邏輯:if  os.WIFEXITED(status) and os.WEXITSTATUS(status) in  successful_status:所以successful_status =(True,0),并通過形參傳入,最終導致命令執行問題。

(2) 漏洞POC

漏洞POC和執行結果:

怎么分析Python代碼審計中的反序列化和命令執行

2. dotenv 命令執行漏洞(CNVD-2019-17299)

dotenv是一個使Node.js從文件中加載環境變量的庫。

(1) 漏洞分析

漏洞存在于dotenv  0.10.1版本中的main.py文件之中,第317行,可見該方法形參傳入命令和環境變量。但是由于未對可用命令進行過濾導致任意命令執行問題。

怎么分析Python代碼審計中的反序列化和命令執行

(2) 漏洞POC

漏洞POC和執行結果:

怎么分析Python代碼審計中的反序列化和命令執行

通過以上案例和總結,相信咱們能夠進一步提高Python審計的功力。

關于怎么分析Python代碼審計中的反序列化和命令執行就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

易门县| 托克逊县| 洛宁县| 航空| 辽宁省| 湖州市| 寿阳县| 海城市| 信阳市| 黑河市| 岑巩县| 郴州市| 社会| 永福县| 凤阳县| 海原县| 谷城县| 岚皋县| 岳西县| 堆龙德庆县| 长汀县| 晋中市| 大宁县| 阳新县| 深圳市| 贡嘎县| 丰原市| 敖汉旗| 涿州市| 新民市| 抚远县| 隆尧县| 洛扎县| 奎屯市| 哈巴河县| 普兰店市| 泰宁县| 方正县| 三穗县| 东阿县| 鄯善县|