漏洞背景
最近微软更新榜上RPC和COM类型的相关的内存破坏类漏洞比较多,目前也在研究,但是一直研究了一个多月也没挖到。然后想到不如先自己去补丁对比看看都有哪些类型的错误,后续自己也可以找找相似的点,可惜现在微软对于这类漏洞不给予赏金了,不过混个CVE也是极好的。
最终选取了CVE-2020-1394这个漏洞去研究下,这个漏洞由360的漏洞挖掘机Peng神发现。
漏洞分析
通过windows 7月补丁公告看到这个漏洞是 Windows Geolocation Framework这个服务造成的。
那么从什么地方入手呢?我们可以通过oleview去搜索local service相关的服务。可以搜索到相关的服务。
最终经过一系列排查发现LocationFramework.dll这个库里面的函数做了相应的修改,也比较符合最近RPC函数内存破坏类的一些特征。
通过IDA的补丁对比发现有6处函数修改,都是一些put和get类的函数,猜想这是一个竞争条件引起的漏洞。
由于函数不是很多,我们看下这些函数补丁前后对比的变化。
补丁前
补丁后
补丁前
补丁后
补丁前
补丁后
补丁前
补丁后
经过观察上面的那些函数虽然修补了,但是没发现存在什么问题,应该是顺手修补的。来看下最后关键的几个函数。具体补丁前后就不对比了,反正是加锁,防止竞争条件。
跟踪到ATL::AtlComPtrAssign函数里面,可以看到如下代码
CVisitInformation::get_PositionInfo函数代码
看到上面的release,基本上可以确定这是一个竞争条件导致的UAF漏洞了。由此可以确定这个问题所产生的原因了,因为put释放,然后get中引用而导致产生的UAF问题。由于这里面PoC构造有点问题,最终也没复现出漏洞。原因是这个接口无法直接调用,需要通过其他接口去调用,但是其他接口传入一个结构体,最终卡在结构体上面,问Peng神要PoC想复现下漏洞,但是Peng神也找不到了,就此作罢。
总结
这是一个竞争条件造成的UAF问题,最终没有构造出PoC真是一个小小的遗憾,如果有人能有PoC也发我一份,学习下。本人刚刚接触RPC和COM漏洞,能力有限,如有错误请斧正。