近期,MalwareBenchmark漏洞分析团队已报出众多CVE,并均已公开。前面几个CVE是kay的杰作,这次来看看作为核心团队的一员,Joe的亮剑。

Joel近一个月已拿下众多CVE,本期将选取其中的一个CVE作为介绍。

近期,小编在使用python处理文本时,用到一些序列化相关的函数,常见的python序列化漏洞都是由pickle()模块造成:

通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储,也可以简单的将字符进行序列化。

通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象,也可以将字符进行反序列化。

而小编这次遇到的是一种叫做yaml的标记语言,其和xml、json相似,有着自己的语法格式。各个支持yaml格式的语言都会有自己的实现来进行yaml格式的解析(即序列化与反序列化)。

序列化: 将数据结构或对象转换成二进制串(字节序列)的过程

反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

鉴此,小编想到写GitHub博客时的markdown文件头,就是使用yaml的解析,如将下面内容保存到joel.yml

layout: posttitle: "CVE-2017-16615: Critical RESTful Web Applications Vulnerability"date: 2017-11-08comments: truecategories: vulnerability

通过下列代码可以实现对yaml文本的反序列化

import yamla = open('joel.yml','r')print(yaml.load(a))

结果如下:

{'layout': 'post', 'title': 'CVE-2017-16615: Critical RESTful Web Applications Vulnerability', 'date': datetime.date(2017, 11, 8), 'comments': True, 'categories': 'vulnerability'}

其中date:2017-11-08转换为datetime.date(2017, 11, 8),这是由于在转换的过程中,没有相应的类型可供转换,因此只需要找到可以自动执行的处理函数,构造相应的类的对象,在反序列化的过程中,会自动执行处理函数即可实现攻击。

小编这次要介绍的就是与此相关的CVE-2017-16615,其细节如下:

python package:    MLAlchemy

Version:          < 0.2.2

Published:       Nov. 7th. 2017

Reported by:        Joel

CVE:        CVE-2017-16615

MLAlchemy是一个基于Python的实用程序库,旨在允许从YAML / JSON到SQLAlchemy只读查询进行相对安全的转换。 例如允许RESTful 的web程序从一个基于Java程序的前端接收一个yaml/json的数据查询。该程序库即含有该漏洞,具体的POC如下:

from mlalchemy import parse_yaml_queryparse_yaml_query('!!python/object/apply:os.system ["calc.exe"]')

该POC仅以calc.exe(记事本程序)为例,该漏洞可以执行任意代码。

POC Video 如下: