口述/唐青昊 应鑫磊 肖伟
文/史中 雷锋网
没有人喜欢孤独,黑客也一样。
我毫不讳言,曾经怀疑自己选择“虚拟化漏洞挖掘”这个方向究竟是不是正确。因为这几个字,如你所见,乍一看上去似乎不知所云。而直到今天,精专这个方向的安全团队,在全世界都不超过五个。
在2015年我组建 Marvel Team,也就是漫威团队的时候,安全世界的江湖似乎还被浏览器漏洞和系统漏洞统治。但我学到的知识总是提醒我:随着云计算的爆炸,这些坐落在云上的虚拟主机中,隐藏着巨大的风险。
而2016年,我们在全世界面前, 揭开了这些风险的面孔。
Pwn2Own,是世界上顶尖的黑客破解大赛。
之所以说顶尖,是因为全世界能有资格报名参赛的黑客寥寥无几。比赛的规则很简单,你需要用一条链接,从网络的另一端“百步穿杨”击溃目标系统,拿下控制权。这些目标是:Edge+Win10、Safari+MacOS、Chrome+Android、Adobe Flash 等等。
这些浏览器或者系统,几乎每一个都在全球拥有数十亿用户。任何一个可以拿下他们的致命漏洞,都价值十几万美元(黑市上的价格更高),这个数字,也恰好是 Pwn2Own 对于漏洞的奖金数。没有十足的把握,不会有黑客报名 Pwn2Own。因为在比赛的现场,每人只有三次攻击尝试机会。从台上走下来的时候,你要么带着无上的荣耀,要么带着无比的屈辱。
有点遗憾,这么多年来 Pwn2Own 和我都没什么关系。直到今年的 Pwn2Own,主办方做出了一些有趣的改动,悄悄增加了一个目标:VMware Workstation 虚拟机软件。
我在电脑屏幕前看到这个消息的时候,正是春节前两天。那时距离比赛还有三周,而报名截止是比赛前两周。虽然只有一周时间,但机会从天而降,我们没有任何理由不去试试。
之前,我们把主要的精力放在了对开源虚拟化软件(QEMU、Docker 等等)的安全研究上。而对于封闭的商业虚拟化软件,包括我们在内的国际所有安全团队经验都不多。
漫威团队的十多个小伙伴,瞬间把研究方向都转向了 Workstation。在我的逼迫下,新年假期都抱着电脑工作,连放炮的动作都像是敲键盘打代码。
虽然之前对 VMware 有所涉猎,但是那些零星的研究根本不足以挖掘出漏洞。我们试图用其他虚拟化软件的脆弱点来套用到 VMware 上,但是都没有成功。
一周的时间,要想从零开始攻破如此复杂的系统,确实不太公平。安全研究这件事,属于科学研究的范畴。如果没有过硬的代码,即使你的意志再坚决,也无论如何都无法发起攻击。这是简单而残酷的道理。
直到报名截止,我们的研究进度还可以用惨烈来形容。团队小伙伴们独立找到三四个 Bug,但是一个 Bug 需要有成熟的利用方法,才能成为漏洞。显然,我们距离目标还十分遥远。无奈,我和我的兄弟们说,这次不打了。
事实上,在三月份的比赛上,全世界范围内,甚至没有一个团队报名攻击 Workstations。
据此,也验证了我的想法:攻击 Workstation 难度不小,全球黑客的进度都不是太快。但从另一个方面来看,我隐约觉得,世界第一的位置仍然在等着我们。
【VMware Workstation】
和 VMware 的“梁子”就是这么结下的。
从四月到七月,团队的主要任务就是,全面摸清 VMware Workstation 的代码结构。我们用了四个月的时间,证明了之前“一周拿下 VMware”的想法有多么天真。
商业软件的代码质量之高,深深震撼了我。虽然虚拟化软件的代码逻辑是相似的。但是对比开源软件的“粗制滥造”,VMware的代码简直就是艺术品。
有多变态呢?让我来告诉你。我们之前在社区虚拟化软件中找到的漏洞模式,在 VMware 中统统不存在。
面对一个封闭软件,就像走进一幢漆黑的房子。我们必须一点点摸清结构,并且试图分析出哪些是承重墙,哪个墙上有可能存在裂缝。由于代码封闭,我们必须用逆向的方式来进行代码审计。面对几百万行代码,工程量可想而知。更可怕的在于,连续几个月没有突破,团队中弥漫出一些绝望的气息。
我没办法责怪那些在最艰难的时候离开团队的人。毕竟谁都没有办法预测未来。
说到这,有必要介绍两位童鞋:肖伟和应鑫磊,他们是漫威团队的重要成员。实际上,他们非常年轻,去年在团队实习,今年才正式从学校毕业。从学校忙完毕业正式入职,已经到了七月。
先来说说肖伟。
在今年四月,肖伟作为主力发现了开源架构 QEMU 中的致命漏洞:传送门。仅仅通过这一个漏洞就可以实现从虚拟机到宿主机的逃逸。这个漏洞也巩固了漫威团队在虚拟化漏洞挖掘领域的“江湖地位”。从七月开始,他加入了 VMware 研究大军。
虚拟机逃逸,是一种“隔山打牛”的气功。因为我们身处虚拟机中,却要对宿主机的内存数据施加影响。所以有很多参数的变化,经常超出我们的控制范围。为了最大程度上影响宿主机的内存数据,最好的入手点就是这些被虚拟化出来的硬件。传送门漏洞,就是坐落在虚拟显卡上的漏洞。
肖伟挽起袖子,准备大干一场。他从虚拟网卡下手,没过多久就发现了一些漏洞。但是,这些漏洞虽然跳出了以往的思路,却都是拒绝服务的漏洞,不能对 Workstation 施行“越界读写”,也就是不能造成致命的打击。功夫不负有心人,终于,一个越界读的漏洞被他揪出来了。但是,如何利用这个漏洞,又让大家犯愁。就在大家冥思苦想漏洞利用的那几天, VMware 放出了 Workstation 的最新版更新。在最新版中,他们居然丧心病狂地修复了漏洞!也就是说,远在千里之外,他们同样发现了同样的问题。
我再一次意识到:在临近的赛道上,不仅有其他黑客团队,还有一支强大的对手——VMware 自己的工程师团队。
事情似乎回到了原点。
这时,轮到应鑫磊登场了。他从哈尔滨工程大学毕业加入团队时,正是今年七月。他面对的,是一些同事们发现的零星漏洞。之前的童鞋们绞尽脑汁,都没有找到对这些漏洞的利用方法。
不能被利用的漏洞,放在我们手中的意义不大,还不如尽早交给 VMware 官方,让他们尽早修复。正当我准备安排报告这个漏洞的时候。事情出现了变化。
应鑫磊在大学期间是一个 CTF“赛棍”,而 CTF 比赛非常接近真实的攻击流程。入职不久,他突然发现了这个漏洞从另一个角度的利用方法,可以用来“控制程序流程”。
在攻击中,控制程序流程可以作为漏洞利用的第一步棋。如此说来,这个本来快被我们放弃的漏洞,居然成为了攻击的基石。就像一个扫地僧,突然成为了大和尚。
这个成果第一次给了我们几个月来久违的兴奋感,所有的成员都被打了一针鸡血,尤其是应鑫磊本人。
转眼到了九月,应鑫磊正在接受每个 360 新同事都要参加的“飞扬训练营”培训。这个培训接近一个月。应鑫磊白天参加培训,晚上还在不断地尝试调优漏洞代码。
他说,直觉告诉他第二个漏洞就隐藏在这一段代码中,但是无论如何总是摸不到。那段日子,他经常调代码到早晨七点,而九点钟训练营又开始了。训练营最后一天结束后,他终于顶不住了,向我申请休息一下。
而就在休假回来的第一天,一扇华丽的大门被应鑫磊“重炮轰开”!
利用这个漏洞,我们可以做到“越界读”宿主机的内存片段。这样,VMware Workstation 这个黑屋子的“墙缝”第一次清晰地展示在我们面前。
我们需要做的全部,就是构建一个足够特殊的内存布局,让核心的信息泄露出来。然后利用这些核心信息,完成致命一击。
这个时候,我们得知,在十一月初举办的 PwnFest 破解大赛上,Workstation 同样是目标项目之一。我似乎已经可以看到 VMware Workstation 被全球首次攻破的场景。站在机器后面的人,是我们。
这场比赛,我们决不能再次错过。
【唐青昊(左)和肖伟(右)】
一直到十月底,应鑫磊的全部任务都集中在攻击方法的尝试上。
正如我之前所说,虚拟机攻击是“气功”,需要隔着虚拟机软件精准地打击到背后的 Windows。由于我们的攻击方法和内存堆利用相关,而 Windows 的堆算法非常复杂,往往环境发生了微小的变化,结果就完全不同。这种情况下,泄露出来的信息就不是我们需要的核心信息。这就像面对一列快速驶过的列车,要在最精准的时间窗口跳上车门,哪怕差一点都会粉身碎骨。
十一假期刚过,应鑫磊一边开着调试器,一边调试代码。他突然发出惊呼,成了!
没错,我们击穿了 VMware 的所有防护,拿到了宿主机的权限。这是我们第一次攻击成功。这意味着,黑客可以从 VMware 营造的虚拟世界中觉醒,像上帝一样控制这台虚拟机中的一切。
但是,这种攻击方法的成功率只有 10%-20%,也就是说,十次跳上火车的尝试,有九次都会粉身碎骨。而真正的比赛中,我们只有三次尝试的机会。
事实上,这个时候肖伟也有新的进展,他发现了一个新的漏洞。以我们的直觉来看,这个漏洞质量极高,但是更容易被发现。而我知道在 PwnFest 上,除了我们还有一位黑客报名,那就是著名的韩国黑客神童 Lokihardt。如果我们使用了同样的漏洞,那么只有先登场的人才会被判定为成功。我们决定暂时不用这个漏洞,专心打磨应鑫磊的漏洞。
应鑫磊发疯一般地调优这套攻击方法,在回家的路上也拽着肖伟讨论如何提高攻击的成功率。
直到比赛前几天。我们的攻击程序在 Surface(比赛指定设备)上的试验成功率达到了40%,在 PC 上的成功率达到了30%。这个成绩我并不满意,但是当应鑫磊建议是否要加个新功能进去的时候,我还是拒绝了。
比赛时我们有三次机会,从数学的角度上来说,我们攻击的成功率接近 100%。我不准备再冒险了。
【唐青昊(左一)和应鑫磊(后排)】
11月10号,韩国首尔,PwnFest 大赛现场,我和应鑫磊站在了比赛台上。
这个项目,有两组黑客报名。我们和韩国黑客神童 Lokihardt。Loki 在韩国拥有众多粉丝,每次他站在台上的时候,台下都会有众多迷妹拍照欢呼。经过抽签,我们先来进行攻击。此刻我们站在台上,观众寥寥无几。
但我没工夫顾及这些。我内心十分清楚,每次攻击成功的概率只有不到一半。而比赛用的电脑环境一定和我们实验的环境有微小差别。这个微小的差别会对成功率造成多大的影响,我根本不知道。
就像一个并不是信心十足的走钢丝杂技演员,突然换了一个全新的舞台和钢索。你无法想象会发生什么。说到底,我们能做的已经都做了,现在看来成功与否是一个概率问题。不知为何,我反倒有种失败的坦然。
比赛全过程,我们不能碰这台电脑。我们的攻击程序需要自动完成一切。
裁判启动了我们的攻击程序,一行行命令闪现。十秒过后,信息返回。出现在我们眼前的,是我们构建的输入信息“313131...”,而不是我们期待的核心内存信息。
我对裁判说,失败了。让我们尝试第二次吧。
那时的心情,就是没有心情。我没办法设想后果,“尽人事听天命”是我们唯一的选择。
第二次攻击启动。时间一秒一秒过去。直到 Windows 系统弹出计算器的一瞬间。我知道:成了!我们通过一条指令拿下了系统的控制权。
团队整整一年的努力,在这十秒内凝聚成“洪荒之力”。这种感觉,大概就是幸福。
根据比赛规则,我们要到“小黑屋”里,把攻击代码和漏洞位置提交给 VMware 的工作人员。虽然在小黑屋里,复现这次攻击并不重要。但事实上我们试了十多次,甚至重启了一次电脑才成功复现这次攻击。我才意识到刚才的比赛中上帝确实非常眷顾我们。
【应鑫磊(左)和唐青昊(右)】
有关这次比赛,还有一个不大不小的故事。
后于我们登场的 Lokihardt,在第一次尝试中就顺利完成了攻击。而直到四天之后,我们已经回到了北京,几乎 WMware 全系列产品收到了来自官方的升级补丁。在这个补丁的描述中,我们才得知,Loki 居然和我们用了同样的漏洞。根据我的了解,他的攻击程序做得更稳定,攻击成功率超过 90%。
也就是说,很可能 Loki 也找到了那个更容易找到的漏洞,而为了防止“撞洞”,他也选择了使用难的这个。而所有的“越界读写”,Loki 全用一个漏洞完成,不得不说他做得更漂亮。
现在,也许我们彼此都知道对方的手上还有一些“存货”。2017年各路黑客在 VMware 上免不了有一场混战。
成为全球第一个攻破 VMware 的黑客,确实很让人骄傲。 但明年我们的最大目标不再是 VMware,而是微软的虚拟化神器“HyperV”。因为从明年开始,所有的Edge浏览器都将跑在 HyperV 虚拟机模块里。这为攻击 Edge 增加了巨大的难度。
当然从另一个角度来看,这意味着,“虚拟化漏洞”这个并不性感的名字,已经开始影响每一个普通人的生活。
2016年很快就过去了。整整一年,我们似乎都在和那几个漏洞死磕。我很庆幸我们的团队并不是一无所获。相反,我们得到的东西超过我的预期。我们用自己的好奇心接近了真相,说不准,这些真相有朝一日可以拯救世界。
【Marvel Team 全家福】
更多黑客故事,欢迎关注雷锋网宅客频道(微信搜索:宅客频道)。你想了解哪位黑客大神,欢迎在雷锋网宅客频道中留言。