cve - 2020 - 1362之如何处理漏洞

  介绍

本篇文章给大家分享的是有关cve - 2020 - 1362之如何处理漏洞,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

漏洞背景

WalletService服务是窗户上用来持有钱包客户端所使用的对象的一个服务,只存在windows 10中。

cve - 2020 - 1362是WalletService在处理CustomProperty对象的过程中出现了越界读写,此漏洞可以导致攻击者获得管理员权限,漏洞评级为高危。

微软在2020年7月更新对漏洞发布补丁。

环境搭建

1。复现环境:windows 10专业版1909(内部版本号18363.815)

2。设置WalletService服务启动类型为自动

 cve - 2020 - 1362之如何处理漏洞

3。调试环境:windbg psn WalletService即可。

漏洞原理与分析

漏洞点是设置CustomProperty对象的群体的方法和集方法没有检查边界。

1。让方法的a2参数没有检查边界导致可以泄露堆上的一些地址。 cve - 2020 - 1362之如何处理漏洞

2。集方法的a2参数没有检查边界,可以覆盖到对象的虚表指针,从而控制程序流。 cve - 2020 - 1362之如何处理漏洞

漏洞利用过程

创建CustomProperty对象

WalletService服务由WalletService。WalletService dll提供。dll实际上是一个动态链接库形式的Com组件,由svchost。exe加载。我们可以在自己写的程序(下面称为客户端)中使用CoCreateInstance()或者CoGetClassObject()等函数来创建对象,通过调用获得的对象的类方法来使用服务提供的功能。

如何创建出漏洞函数对应的对象呢?最简单的办法是下载msdn的符号表,然后看函数名。

我们想要创建出CustomProperty对象,ida搜索一下,发现有两个创建该对象的函数:钱包:WalletItem: CreateCustomProperty()和钱包::WalletXItem: CreateCustomProperty ()。

 cve - 2020 - 1362之如何处理漏洞

所以我们创建一个CustomProperty需要一个WalletXItem对象或者WalletItem对象,那么使用哪个呢?继续用艾达搜索CreateWalletItem或者CreateWalletXItem,会发现只有CreateWalletItem。

 cve - 2020 - 1362之如何处理漏洞

那到这里我们需要一个WalletX对象,继续用艾达搜索会发现找不到CreateWalletX,但是如果搜索WalletX,会发现有个WalletXFactory::调用CreateInstance(),如果有过Com组件开发经验的同学就会知道,这个是个工厂类创建接口类的函数,上面提到的CoCreateInstance()函数会使WalletService调用这个函数来创建出接口类返回给客户端。

 cve - 2020 - 1362之如何处理漏洞

那么如何调用WalletXFactory::调用CreateInstance()并创建出WalletX对象呢?我们需要在客户端使用CoCreateInstance ()。

 HRESULT  CoCreateInstance (
  ,,,REFCLSID  rclsid,,//, CLSID,用于找到工厂类
  ,,,LPUNKNOWN  pUnkOuter,,//,设置为,NULL 即可
  ,,,DWORD  dwClsContext,,//,设置为,CLSCTX_LOCAL_SERVER,一个宏
  ,,,REFIID  riid,,//, IID,,提供给工程类,用于创建接口类实例
  ,,,LPVOID  * ppv //,接口类实例指针的地址
  );

1。首先,我们需要WalletXFactory的CLSID,可以使用OLEViewDotNet这个工具查看。

 cve - 2020 - 1362之如何处理漏洞

2。其次,我们需要一个WalletX的IID,这个可以用ida直接看WalletXFactory::调用CreateInstance()这个函数。

 cve - 2020 - 1362之如何处理漏洞

有了WalletXFactory的CLSID和WalletX的IID,然后在客户端调用CoCreateInstance (), WalletService就会调用CLSID对应的工厂类WalletXFactory这里的CreateInstance(),创建出IID对应的WalletX对象,并返回对象给客户端。

然后按照上面的分析,使用WalletX:: CreateWalletItem()创建出WalletItem对象,然后使用WalletItem:: CreateCustomProperty()创建出CustomProperty对象。

对于上面的步骤有疑问的同学可以去学一学Com组件开发,尤其是进程外组件开发。

cve - 2020 - 1362之如何处理漏洞