介绍
这篇文章主要讲述了由NCC Group研究人员所发现的两个通过COM本地服务进行非法提权的漏洞。第一个漏洞CVE-2019-1405是COM服务中的一个逻辑错误,可让本地普通用户以LOCAL SERVICE身份执行任意命令。第二个漏洞CVE-2019-1322是一个简单的服务配置错误,可让本地SERVICE组中的任何用户重新配置以SYSTEM权限运行的服务(此漏洞也被其他研究人员发现)。当以上两个漏洞结合在一起时,就允许本地普通用户以SYSTEM权限执行任意命令。
COM背景
为了帮助大家更好的理解漏洞,我们将从一些基础知识开始讲起,如果你熟悉Windows上COM的基本概念,可以跳过本节。
组件对象模型(COM)是微软于1993年推出的一套软件组件接口标准。一般来说,COM是一种让开发人员以与开发语言无关的方式使用某些软件组件的体系结构。COM的众所周知的用法包括ActiveX和OLE(例如,在Word文档中嵌入Excel电子表格)。此外COM在整个Windows生态系统中被微软官方和众多第三方应用所使用,它是真的无处不在!
COM对象是通过存储在Windows注册表中的称为CLSID的全局惟一标识符(GUID)来标识的(许多COM对象也在注册表中被命名,但是名字只是链接到相应的CLSID)。一个CLSID条目包含COM子系统在创建对象实例时使用的信息。
COM会对外公开一个或多个接口,隐藏对象的实现细节。本质上,一个接口定义了对象所支持的一系列方法,而没有规定实现方式。接口在调用方法的代码和实现方法的代码之间存在清晰的界线。每个COM对象都支持IUnknown接口,这个接口用于通过AddRef、Release和QueryInterface方法向其他受支持的接口提供引用计数和类型转换。接口通常通过Microsoft接口定义语言(MIDL)进行定义,并通过被称为IID的GUID进行标识。同样,这些都存储在Windows注册表中。但是请注意,一个COM对象所支持的特定接口并没有在注册表中列出。
一般来说,COM对象可以分为两类——一类是在调用进程内部创建的,另一类是在进程外部创建的。出于权限提升的目的,以本地服务身份所执行的进程外部COM对象就是我们的攻击点,Windows的默认安装中包括很多这样的对象。
有许多工具可用来检查在Windows实例上注册的COM对象和接口。也许其中最好的是由谷歌Project Zero的James Forshaw编写的OleViewDotNet。在这篇博客文章中,我们不会过多介绍这个工具的特性,如果你有兴趣了解更多关于COM的知识,可以从James编写的相关文章开始。
UPnP Device Host服务(CVE-2019-1405)
UPnP Device Host服务在Windows操作系统(从Windows XP到Windows 10)上默认启用,并以NT AUTHORITYLOCAL SERVICE权限运行(该服务在众多Windows版本上默认安装,但在某些版本上默认不启动)。本服务中的许多COM对象都以本地服务权限执行,如下图由OleViewDotNet所展示的: