CVE-2016-0844,这串毫不性感的代码是一个漏洞的名字。
通过这个漏洞,黑客可以拿到 Android 手机内核权限,在主人不知情的情况下翻看查看聊天记录、银行卡密码、随时静默拍照、向任意号码发信息、打电话。
为此,谷歌向这个漏洞的发现者——冰刃实验室——发去了一封致谢函。如果你是网络安全爱好者,冰刃(IceSword)这个字眼一定在你心中占据着一席神坛。2004年,这款几乎可以查杀所有木马的软件在圈子里声名鹊起,引起了各大网络安全公司的注意。而它的作者,竟然是一位在校的学生。他就是潘剑锋。
冰刃的简洁和灵性散发出一种出只有黑客们才可以欣赏的美。如今在各大论坛上,还依然有诸多仰慕者追随着潘神的名号,传扬着他的传说。而潘神却低调地走出光环之外,修炼至今。
冰刃实验室,正是他的回归。
【IceSword 冰刃软件截图】
{潘神的迷宫}
潘剑锋坐在记者对面,一脸平静地说,其实这个漏洞并没有太多可说的,只是一个新的“系统提权漏洞”而已。
事实上,“系统提权漏洞”是拿到Root权限的后也是难的一跃,在谷歌的评价体系里毫无争议地属于高危级别漏洞。根据谷歌的致谢数据,每年这一级别的漏洞致谢仍是屈指可数。但在潘神眼里,这种形式的漏洞是一个经典形式,他只是为这个漏洞家族又添了一个新丁而已。这大概像一个学霸,看到大家都考95分,自己又有什么可高兴的呢?
对于这个曾经把对X86操作手册倒背如流,对系统内核技术如痴如醉的“技术宅”来说,他的目标并不是找到那个坚固的攻城武器,而是制造出无人可破的防御系统——一个让图谋不轨的黑客永远迷失的迷宫。
对系统底层技术的了解,增加了他制定这个目标的底气。他把操作系统被拆分为逻辑背后的一组组代码。就好像一位建筑家,可以把摩天大厦拆分成钢筋水泥肌理下的每一条砖。
既然如此,他必须解释一个终极问题——漏洞因何而存在?
世界上存在没有漏洞的手机吗?
【Android 系统内核,一般指底层的 Linux Kernel】
{漏洞的本质}
任何程序都是交互的过程:输入信息,得到反馈。而从本质上来说,这些交互可以被拆分为“一问一答”,也就是“输入输出”的单元。
黑客往往通过构建一些异常的输入。只要程序处理不正确,就会产生相应的问题,例如造成程序的崩溃。而通过精心构造提问的方式,可以实现意想不到的效果,甚至让程序走入你制定的逻辑。
这是漏洞的基本逻辑。
当然,现在越来越完善的系统对于绝大多数的“问题”都能够给出毫厘不差的“答案”。只有在极其特殊的情况中,才会出现漏洞。例如:
某次会议规定,与会者必须喝光面前的水才能离开,而偏偏有一个迟到的童鞋没有听到这个规矩,在杯中留了半杯水。当会议结束后,有机器人自动把所有杯子重新填满。这时,在原本没有喝光的水上面再加一杯水,就会造成溢出。整个桌子都会因此被打湿,设定好的程序就会发生错乱,漏洞出现。
某个电梯规定,不能同时容纳两个人。所以每当一个人进去之后,应当首先锁好电梯的门。但是如果一个人忙得晕头转向,忘记锁门,就可能出现第二个人突然闯进来的结果。这样一来电梯就会发生坠落。漏洞又出现了。
虽然没有锁门、没有喝水,这样的“失误”发生概率非常小,然而它们发生的条件却是确定的,只不过这种条件相当苛刻,在正常的运行过程中几乎不会发生。所以,寻找漏洞变得很简单:只要把一个程序运行过程中的所有“偏执”的可能性都一一尝试,就可以排查掉所有意外发生的条件。这种情况下,这套系统不就成为了一个没有漏洞的完美系统吗?
{世界上所有的回答}
好了,接下来我们要做一件浪漫的事,问出“这个世界上所有的问题”。
面对一个系统,我们原则上可以画出它的“控制流图”。也就是说,假设我们的计算能力无限,对于每一个逻辑,我们输入不同的值,计算出在怎样的值下面,系统会给出怎样的回答,把这些回答归纳为所有的可能性,再进一步对每一种可能性重复如上的操作。
如此一来,我们就可以画出巨幅的逻辑树,见到一个分叉路口就尝试每一个可能,终我们的足迹会遍及逻辑树的所有枝杈,把从一个原点开始的所有可能都囊括进去。
世界上存在没有漏洞的手机吗?
【逻辑树示意图】
潘神解释,这种方法被称为“约束求解下的具体执行”,在这种情况下,会把所有的情况——哪怕是概率极小的事件——都进行预演。从而排查是否存在程序错乱的情况,进而发现漏洞所在。
然而,这样的计算远不像说起来这么简单。潘神说:
看到岔路,计算什么情况下往左跑,什么情况下往右跑。是一个特别难于解决的问题。而且如果完全计算所有逻辑上的可能性,对于数十万行代码的操作系统来说,时间要求过大。纵然在理论上成立,在现实中也没有可能实现。
所以,潘神实际上给出了一个悲伤的答案:
我们没办法穷尽世界上所有的问题,也就没办法验证世界上所有的答案。
在现实世界里,安全仍然必须有所取舍。用有限的资源去对抗无限的可能。而正因为安全是一个无法抵达,只能无限接近的顶峰,它才变得无比迷人。