之所以会写这篇文章是因为最近接触了看雪论坛Failwest写的Oday安全里的一章《解密Windows安全机制》和前些天看到IC卡其中的一种被破解造成上亿用户的安全危机。在加上兰知名美女黑客Joanna Rutkowska,她在博客上发表一篇论文,曝光了一个英特尔CPU的缓存漏洞。而另一位安全研究人员Loic Duflot将在加拿大温哥华举行的CanSecWest安全大会上介绍该漏洞和攻击代码。还有对英特尔AMD推行的 CPU安全机制NX置疑的文章。叫人突然感到了莫名的恐惧。记的10几年前计算机刚出现在大家视线内的时候恐怕除了专业人士很难有人会注意到这个大家伙会给我们带来什么变化。然而现在已经是地球人不可缺少的一部分了就是这个大块头带来了便利的同时也带来了意想不到的麻烦——漏洞。从之前的不在意到后来的CIH 冲击波 熊猫烧香等等病毒的出现并造成了重大损失后。大家才意识到安全专家们总喊的“狼”,这次真的来了。 难道黑客帝国中的场景真的会走下银幕成为现实?这还要从一个人说起没错这就是阿兰·麦席森·图灵。
伟大的阿兰·麦席森·图灵是这样描述一台图灵机的。一台图灵机包括4部分:一条无限长的纸,一个读写头,一个规则集合(程序),一个状态集合(数据)。当图灵机能够把规则集合当作状态集合来读写时,就会发生很多怪诞的现象,比如图灵机可以自己复制自己!
所谓的漏洞也好缺陷也好都是人们没有正确理解图灵对图灵机思想模型的描述。冯·诺依曼在实现电子计算机时,忽略了图灵机思想模型中对程序和数据的区分,将程序(规则集)和数据(状态集)放到了同一个物理设备——内存中。因为,现代电子计算机对图灵机模型的实现存在着天然的瑕疵。由于没有明确区分内存中的程序指令(规则)和普通数据(状态),当年对图灵机自我复制的预言频繁地被黑客攻击所验证,蠕虫地自我复制和传播就是一个典型地例子。可以说就是冯·诺依曼这个错误地判断。导致了现在漏洞频出地现象也可以说现在漏洞地本源就是来自冯·诺依曼地错误判断。好在微软的工程师们已经意识到了这个问题从2004年8月6日发布的Service Pack2这个著名的补丁发布。俗称SP2。这个有着超过200MB的大补丁里对安全方面主要有什么改进呢?
第一 使用了带安全选项(GS)的编译技术对整个操作系统进行了重新编译。
第二 向栈中加入了Securit Cookie,在函数返回前能够有效地测试出栈溢出,从而把针对操作系统的栈溢出变的非常困难。
第三 堆中也加入了Securit Cookie,用于检测堆溢出。
第四 Free list中表项在进行增删操作时,增加了对双向链表指针的安全验证,有效阻止了DWORD SHOOT发生。
第五 增加了对S.E.H的安全验证机制,能够有效的挫败绝大多数通过改写S.E.H而劫持进程的攻击。
虽然有了这些安全机制有效的减少了大部分系统漏洞。表面上看是占了上风。但是在根本上说还是治标不治本。因为问题的所在是硬件是整个现代计算机结构的彻底改变才能解决的问题。当然我们都知道在一个问题解决的同时很可能出现其他未知的新问题。所以SP2之后windows2003 Vista操作系统的退出当然还有现在不堪一击的IE8。虽然安全机制都有了提高。但是黑客们依然有办法攻击来迂回到敌后(安全机制)来发动高级漏洞攻击。因为在软件层面上是很难或者说基本不可能实现规矩集合(程序)与状态集合(数据)的分离。鉴于软件的防范很难避免攻击发生。所以几年前,英特尔与AMD推出了CPU安全机制NX。很可惜的是这个NX机制更多的是商业炒作,实际功效却没有那么有用。NX并不能够阻止所有那些意图制造缓冲区的溢出。目前最常用的入侵方法的攻击手段。例如,“返回库函数”攻击可以将堆栈中返回的地址替换成另一个函数的地址,这就能成为对非执行内存堆栈实施攻击的基本途径。此外,入侵者还可以通过创建伪造的堆栈帧来屏蔽掉NX所提供的内存保护措施。类似的办法并不算标新立异,因为这些方法一早就被那些活跃在Unix领域的黑客在其他支持非执行保护功能的处理器和操作系统上试验过了,例如Sun的SPARC和Solaris操作系统。NX的设计初衷并不是阻止一切攻击,在Unix上它已经被证明不能够减轻针对系统的安全威胁,而在像Windows这样的台式机操作系统上也一样做不到。
我个人的愚见是需要一次现代计算机的矩阵革命。从硬件上彻底的把规矩集合(程序)与状态集合(数据)的分离。来真正实现图灵对计算机的模式构想。虽然理论上是可行的,但是这个变革的成本太高了。虽然大家都不希望生活在一个没有安全感的信息社会里。但是矛与盾,安全专家与黑客们的智斗将永远持续下去。
2009年4月13日