作者:houjingyi
年初的时候研究了一下怎么挖WPS的漏洞,虽然发现了漏洞不过能力有限,自己漏洞利用这块不太了解,没来得及跟厂商报后来厂商就修了,索性发出来分享一下。也带大家了解一下对一个大型软件进行漏洞挖掘是怎么做的。
含有漏洞的版本:W.P.S.10314.12012.2019.exe
已经修复的版本:W.P.S.10356.12012.2019.exe
1.历史漏洞研究
我一般开始挖一个新目标的漏洞第一步首先是查看历史漏洞,相信大部分人也都会这么做。我们可以通过安全客,玄武实验室的sec.today,cve.mitre.org和金山办公安全应急响应中心的公告等途径了解WPS过去都出了哪些漏洞。经过一番查找之后发现过去一两年主要出了一些公式编辑器的漏洞还有一个PNG图片解析的洞。
我当时考虑的是去挖图片解析的洞,原因很简单,公式编辑器应该已经有好几伙人挖过了,光是公开知道的就有GeekPwn 2020上被人用过,还有极光无限的人也挖过并在安全客上发了文章,所以我再去挖到漏洞的可能性不是那么大(当然这种事情其实很难说,因为我在挖其它厂商的洞的时候发生过好几次以为某个地方应该已经被其他人挖过不会有洞但是实际上有非常明显的洞的情况)。还有一个次要原因是我看极光无限的文章里面说和office不同的是打开构造好的样本WPS不会加载公式编辑器组件,还需要主动双击或者右键激活的方式来加载组件。意思就是说就算挖到洞成功利用了也不是0 click的,稍微有点不太完美。
在正式去尝试挖图片解析的洞之前我还想着能不能偷个懒,如果WPS有和office以前出过的类似的dll劫持可以直接RCE的问题就好办了(参考:CVE-2016-0018: DLL Planting Leads to a Remote Code Execution Vulnerability),结果是没有。
2.fuzz图片解析函数
我们来看看PNG图片解析那个洞:
CVE-2020-25291 – Kingsoft WPS Office Remote Heap Corruption Vulnerability。虽然作者没有给POC但是给了stack trace,有这个信息就够了。
通过调试分析可以确定图片解析相关逻辑在QtCore4.dll中,可以看到WPS调用的QtCore4.dll的第一个函数是QImageReader::read。代码逻辑大概就是下面这样。
有过fuzz经验的同学应该已经知道了怎么去用winafl之类的工具fuzz这里的代码逻辑。分享一下我当时写的代码。
用winafl跑了一段时间之后成功发现了crash,后来经过分析发现是因为用了版本非常老的libtiff库……
不知道这个库是qt4里面就有的还是wps加进去的,总之走了弯路了,早知道是这样还写什么fuzzer。后来我找了一下libtiff出过的POC,有一些是能成功在WPS里面触发的,基本都是堆溢出,因为我不太清楚WPS里面堆布局这些,也没有其它现成的EXP可以抄,本来还想留着以后慢慢想,没想到WPS发布的新版本不再使用qt4而是升级到了qt5,也没有用libtiff这个库了,所以只能不了了之。
3.winafl的注意事项
我只给出了代码没有具体解释怎么写的,我觉得这个应该比较简单。还有一个我没解决的问题是能不能实现利用,这些就留给感兴趣的童鞋当成练习吧。我想提一下使用winafl的一些注意事项,因为在我做这个事情之前也有好久没用过winafl了,算是踩了一些坑。虽然winafl最近几年没有怎么更新了,但是如果遇到问题一般都不是winafl的问题……基本上解决方案也都能在github的issue里面找到。
1.不要改变被fuzz的dll的名字
2.目标函数应该使用return 0不要exit(winafl无法catch到post_fuzz_handler了)
3.不要使用github上编译好的二进制文件(win 7下还可以),自己重新使用最新的DynamoRIO编译
4.在目标函数中打开并关闭文件句柄
正常的情况:
你可以看到我前面写的代码是关闭了qfile的,不去关闭文件句柄就会出现下面这样的情况:
5.先用drrun确认一切正常再运行winafl
一切正常的话log文件应该是像下面这样的。
最后一个我想提的注意事项跟winafl没什么关系。fuzz尽量在没有网络的虚拟机中进行,因为一些软件crash之后会生成dump文件发送回去,要是发现了漏洞都还没来得及研究结果因为厂商看到dump文件修复了就有点不划算了。
4.结语
说起来似乎有点难以置信,WPS居然还在使用几乎是十年前的libtiff库,我估计PNG那个洞有可能也是因为使用了很古老的libpng库。一方面厂商应该对使用的开源库做好管理,避免长期使用存在漏洞的开源库的情况;另一方面对于漏洞挖掘者来说这也是一个做审计时可以注意的点。大家如果有什么问题,也欢迎和我交流。