0
本文作者: 李勤 | 2017-08-23 14:30 |
几十年前,两颗原子弹爆炸,人们在可怕的蘑菇云中,被核武器的威力所震慑。
在看不见敌人的神秘网络世界里,有一种武器堪比核武器。
几个月前,“永恒之蓝”从美国国家安全局的军方军火库泄露,威力巨大的武器落到了一群毛贼手中,被利用做了一次低俗的敲诈勒索。但那一次,也许是全世界人民再一次深刻体会到这种武器的可怕。
它就是漏洞武器。
网络世界的暗黑力量瞅准了漏洞,安全守卫者也看到了漏洞的价值。不过,在安全研究人员看来,抢先一步发现漏洞,填上它,就是一种胜利。
不过,从开始渗透测试网站到发现漏洞,然后提交给厂商,整个过程会耗费安全研究人员大量的时间精力,甚至不得不连续几个日夜守在电脑面前反复测试。何况,漏洞挖掘技术有高低,天赋、时间、经验……都是一道道关卡。
最近,有人告诉雷锋网编辑,他们研发除了一款 Windows 漏洞自动化挖掘系统 Digtool,可捕获程序执行过程中触发的漏洞。
咦?Windows 系统的漏洞挖掘,由于微软没有提供源码,人工挖掘需要逆向分析。这个漏洞工具到底是怎么实现的?听说 Google project zero 也开发了类似工具,相比之下,效果几何?
该工具的开发人之一 、360 冰刃实验室负责人潘剑锋接受了雷锋网的采访。
在冰刃实验室提供的资料中,提到 Digtool 的工作流程就像挖沙淘金一样:首先,Digtool 可以记录内存访问等行为日志,这就实现了第一步挖沙的过程;进而,Digtool 的分析模块会进行分析,一旦符合主要的六种漏洞行为特征规则,便实现了一次“淘金”,也就意味着找到一个漏洞。
事实上, Digtool 并不是机器人,下达一声命令,它就勤勤恳恳地开始自动“淘金”。
至少,你得先开机。
曾有一计谋称为“以静制动”,也就是我们通常所说的:我就静静看你装逼,然后一切真相了然于胸。
只有在系统在任务执行的动态过程中,Digtool 才会像灵敏的猎犬,嗅出一切可疑的破绽。
此前介绍的 Digtool 的工作流程其实分为两个步骤。
第一部分是指路径探测模块。因为程序运行会有大量的路径产生,有些路径是正常的,只有某些路径才会出错。如果你探测不了这个路径,根本发现不了这个漏洞,因为其他路径跑出来的结果是正常的。
Digtool 在这个过程中产生的最大作用是,尽量引导执行更多的路径。
读万卷书,行万里路,找“一万条”路,才能获得人生真谛。Digtool 不断尝试从 A 点到 B 点的可能路径,就像那个把巨石一直推向山顶,巨石掉落,又往山顶推的人。只是,不走寻常路。
因为漏洞本身就是罕见的,很可能在一万条路里,才能找出一条通向成功,哦不,是漏洞的路。
从这个意义上来说,Digtool 深刻地领悟了人生(漏洞)哲学。
第二,错误捕获,跑到这条特殊的路径上算是成功了一半,捕获到错误是成功的另一半。
潘剑锋指出,软件漏洞是程序的与安全性相关的错误或缺陷,有漏洞的程序在动态运行时会产生各种异常行为,比如有UAF的程序执行时产生访问已释放内存的行为;再如有内核的信息泄露漏洞的内核程序段,会产生把应用层不应该知道的地址写到应用层地址空间的行为,Digtool 可以捕获这些异常行为从而发现背后的漏洞。
至此,Digtool 才算在一个漏洞的挖掘上功德圆满。
Digtool 目前擅长挖掘六类漏洞,而且针对的是 Windows系统。
第一类, OOB越界访问漏洞。
第二类,UAF释放后使用漏洞。
第三类,TOCTTOU即time-of-check-to-time-of-use漏洞,这里指来自用户的不可信参数在被系统(如内核)检查和使用之间,可被用户篡改的漏洞。它本也属于竞争条件型,但可由 Double Fetch检测方法高效发现,故单列出。
以一个程序为例,来了一个用户层的内存 A,系统访问了里面一个指针读出来,它确实是一个合法的指针,后来要使用这个指针时,却直接从用户内存取这个指针,前面取出来检查,后面又取出来使用,在这个过程中,别的用户可以修改指针,漏洞就产生了。
“以前,Windows 也出现过很多类似的漏洞,Project zero 的研究员就报了几十个这类漏洞给微软。”潘剑锋说。
第四类,参数未检查。
第五类,信息泄露。随着各OS平台漏洞缓解机制的加强,漏洞的成功利用越来越依赖于关键信息的泄露。比如对内核信息泄露,在最新的 Win10 上以前可供利用的各种信息泄露几乎都封杀了,个别漏网之鱼可以预计也会很快补掉。因此,原本看上去不重要这一类型的漏洞,正在变得越来越重要。
第六类,竞争条件型漏洞,这里指多线程访问共享内存,而最后的结果取决于线程运行的精确时序导致的错误。
不过,针对这六大类型的漏洞,Digtool 也会报“假警”。
潘剑锋解释道:“如 OOB 或 UAF 只要报出来就是漏洞,误报率是 0。对 TOCTTOU 和参数未检查是有不少误报的,因此,这种就需要人工来筛选,根据漏洞不同类型有不同的误报率。”
Digtool离全能的“人形漏洞挖掘机器”还有相当的距离,挖掘漏洞的白帽子完全不用担心“失业”问题。
比如,Digtool 暂时还无法处理逻辑类型的漏洞。程序逻辑是程序员自己的思考与设计,如果没有额外的信息,程序并不知道你的逻辑到底是 A 还是B,有可能在你看来 B 是错的,但程序并不知道,有可能认为你就是想写成 B。
雷锋网了解到,也不能说 Digtool 完全不能发现这类逻辑型的漏洞,程序难以直接了解程序员的思维逻辑(除非把思维逻辑直接写入错误检测工具,这样是完全不通用的),但是依然可以通过意外逻辑发生时的副作用发现它,比如,错误的逻辑导致程序访问非法内存,工具可以捕获访问非法内存的错误,通过人工反推出真正逻辑错误的地点。
这意味着,Digtool 在一定程度上暂时干不掉挖掘逻辑漏洞的大神,但能成为大神挖洞的亲密小助手。
【我指的亲密助手不是图上这种,不要误会】
准确地说,在一定条件下,Digtool 有希望让没培训或简单培训的人在短时间内比经过严格培训的人还能挖到更多特定类型的漏洞,潘剑锋相信,这也是自动化挖掘的意义。
雷锋网了解到,目前,与 Digtool 类似的工具还有 Project Zero 制造出来的 bochspwn。
bochspwn 可以检测两种类型的漏洞,一种是信息泄露,一种是 TOCTTOU,但 bochspwn 跑得非常慢,是解释型的模拟器。
与 bochspwn 相比, Digtool 可仅在需要关注的线程或系统调用开启检测,在不检测的情况几乎不影响系统的运行,当然检测的时候也会比真实系统慢不少,但还是比 bochspwn 快很多。
“跑一局游戏,十几个漏洞就挖到了”——在 360 提供的背景资料中,是这样写的。
但是,潘剑锋表示,这是第一次运行游戏所经过的执行路径上,捕获的内核信息泄露漏洞,第二次运行自然不会有这么好的效果,因为绝大多数路径已经跑过了,只有探索到新路径才可能捕获新的漏洞;另外不同类型的漏洞存在的概率也差别很大。
接下来,Digtool 将朝着优化漏洞挖掘率,扩大漏洞挖掘类型等进行提升,不排除将增加挖掘其他系统的功能。
注:冰刃实验室的该研究成果《Digtool:A Virtualization-Based Framework for Detecting Kernel Vulnerabilities》被 USENIX Security 收录。
雷峰网原创文章,未经授权禁止转载。详情见转载须知。