Numpy反序列化命令执行(CVE-2019-6446)浅析

2019 年 2 月 4 日 FreeBuf

0x01 前言

NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。NumPy提供了大量的库函数和操作,可以帮助程序员轻松地进行数值计算。这类数值计算广泛用于以下任务:

机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。

图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同样情况下最自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。

数学任务:NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。

0x02 影响范围及利用条件

NumPy <=1.16.0

用户加载恶意数据源造成命令执行。

0x03 漏洞分析

我们以ubuntu最新版pip源下载的numpy 1.16.0版本为例进行分析。漏洞点位于npyio.py的第268行,file字符串对象经过格式验证,如果不满足默认的numpy以及zip格式,将会尝试使用序列化的方式进行读取文件。如果是老司机的话,估计大概知道是什么问题了。

我们顺着pickle.load函数继续跟进看看。最终会发现他会逐字节的去读取命令。

如下图,pickle默认支持很多命令语句。

有了这些数据,我们就开始构造命令执行了。在构造命令执行之前,我们得先导入我们所需要的包,以及一个可以执行反射的函数。通过代码检索,发现pickle的操作符号“c”和操作符“R”,分别代表着导入和调用两个操作。

那接下来我们开始构造执行“ls”的命令函数了。

通过上面的操作符号,我们编写出对应的命令,熟悉汇编的同学就看出来了,左边是命令符号,右边是数据。

然后我们把这个数据转化成pickle能够理解的语言。

cposixsystemp0(S'ls'p1tp2Rp3.

然后我们把这个payload文件,用numpy.load函数读取一下。

就看到对应的效果了。

0x04 修复方案

2019年1月15日,官方在issue中确认了该漏洞,并准备在下一个小版本中修复

暂时缓解措施,将默认支持allow_pickle函数去掉。

参考链接

https://github.com/numpy/numpy/commit/a2bd3a7eabfe053d6d16a2130fdcad9e5211f6bb

https://bugzilla.suse.com/show_bug.cgi?id=1122208

*本文原创作者:nancyy,本文属FreeBuf原创奖励计划,未经许可禁止转载

登录查看更多
0

相关内容

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
258+阅读 · 2020年6月10日
Python导论,476页pdf,现代Python计算
专知会员服务
254+阅读 · 2020年5月17日
【2020新书】如何认真写好的代码和软件,318页pdf
专知会员服务
63+阅读 · 2020年3月26日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
漏洞预警丨Xstream远程代码执行漏洞
FreeBuf
4+阅读 · 2019年7月25日
DiscuzX 3.4 Phar反序列化漏洞
黑客工具箱
8+阅读 · 2019年1月4日
用深度学习keras的cnn做图像识别分类,准确率达97%
数据挖掘入门与实战
4+阅读 · 2017年12月17日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
用 Scikit-Learn 和 Pandas 学习线性回归
Python开发者
9+阅读 · 2017年9月26日
Arxiv
4+阅读 · 2019年8月7日
Neural Image Captioning
Arxiv
5+阅读 · 2019年7月2日
Area Attention
Arxiv
5+阅读 · 2019年5月23日
Arxiv
18+阅读 · 2019年4月5日
Arxiv
4+阅读 · 2018年10月31日
Relational recurrent neural networks
Arxiv
8+阅读 · 2018年6月28日
Arxiv
10+阅读 · 2018年2月4日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
258+阅读 · 2020年6月10日
Python导论,476页pdf,现代Python计算
专知会员服务
254+阅读 · 2020年5月17日
【2020新书】如何认真写好的代码和软件,318页pdf
专知会员服务
63+阅读 · 2020年3月26日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
相关资讯
漏洞预警丨Xstream远程代码执行漏洞
FreeBuf
4+阅读 · 2019年7月25日
DiscuzX 3.4 Phar反序列化漏洞
黑客工具箱
8+阅读 · 2019年1月4日
用深度学习keras的cnn做图像识别分类,准确率达97%
数据挖掘入门与实战
4+阅读 · 2017年12月17日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
用 Scikit-Learn 和 Pandas 学习线性回归
Python开发者
9+阅读 · 2017年9月26日
相关论文
Arxiv
4+阅读 · 2019年8月7日
Neural Image Captioning
Arxiv
5+阅读 · 2019年7月2日
Area Attention
Arxiv
5+阅读 · 2019年5月23日
Arxiv
18+阅读 · 2019年4月5日
Arxiv
4+阅读 · 2018年10月31日
Relational recurrent neural networks
Arxiv
8+阅读 · 2018年6月28日
Arxiv
10+阅读 · 2018年2月4日
Top
微信扫码咨询专知VIP会员