delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

08 Aug 2007

为什么说基于ActiveX的「安全控件」一定是不安全的?

前几天听 bugs 说,国内某C2C网站打算这个月开始禁止Firefox用户登录其网站,而说到原因,又是「出于用户安全考虑」,「Firefox无法支持其‘安全控件’」云云。

我没用过这家公司的服务,因此我也不想就这家公司发表什么评论。我觉得很有意思的一件事是,似乎大家都很信任所谓「安全控件」。

那么,什么是「安全」控件呢?简单地说,这类控件是由特定商家发布的,基于ActiveX技术实现的一种Internet Explorer插件。尽管不同的公司会以不同的方式进行实现,但这类插件通常会实现的功能,不外乎以下几种:

  • 替代输入框,防止其他程序通过hook的方式得到输入框中的内容。
  • 以更直接的方式从键盘读取数据,防止非本机键盘输入数据和其他程序监听键盘输入。
  • 确保内存中没有某些应用程序正在运行。

很遗憾,「安全控件」往往并不能理想地达到上述目的。更有甚者,事实上这些控件几乎一定会破坏系统的安全性。

为什么这么说呢?我们人类有历史以来,从正确的假设或前提出发,都有可能会得出错误的结论;那么,从错误的假设出发,能够到达正确结论的可能性有多大呢?可想而知。

那么,回到我们刚才的话题,为什么说基于ActiveX的「安全」控件几乎一定会破坏你的系统安全呢?错误的假设又是什么呢?

首先,在我们讨论安全系统的时候,人们往往会忽略这类系统中最重要的那个环节——用户。用户之所以是安全系统中最重要,同时也是最薄弱的环节的原因是,尽管我们能够精确地预计机器的行为,却无法精确的估计人类的行为;我们见到抢劫银行的罪犯用枪指着工作人员或人质,却很少有人用枪指着银行使用的计算机系统——因为人,在一个安全系统中,也只有人是机器的最终主宰。

给用户一个保险柜,却完全不给他或她机会去了解这个保险柜的工作原理,谁又能保证,这个用户不会把保险柜放在楼顶,任由风吹日晒雨淋,令其失去作用?这是所谓‘安全’控件的头号问题,即,它既没有真正加强用户的安全意识,也不给用户了解它的工作原理的机会。对于用户来说,这个保险柜是个黑箱,它安全不安全,只有老天知道(为什么说它的作者也不知道呢?且看下文分解)。

「安全」控件危害安全的另一个原因是,它在鼓励不安全的用户习惯。

熟悉Windows操作系统的朋友都知道,在Windows Vista之前,安装Active X控件是需要管理员权限的。也就是说,想要安装所谓的「安全」控件,其前提便是用户至少要以管理员身份打开1次用于安装该控件的软件,或者下载一个安装程序,并以管理员的身份运行它。

有多少非专业用户会以非管理员身份上网呢?这个数字接近0,说接近0的原因是,有一些被他们认为很「变态」的IT人员「挟持」的用户真的不是用管理员身份浏览网页的,为什么不能安装这个Active X控件?他们恨恨的想。随后,他们以各种方式得到了管理员权限,并安装了「安全」控件。

到现在为止,用户的安全还没有受到非常明显的伤害。但是,用户很快会发现,以管理员身份使用计算机很「方便」——没有了磁盘配额的限制,没有了各种各样让人讨厌的限制——凭什么不让我安装Active X?这个系统管理员真讨厌!

又过了一段时间,用户发现计算机越来越「好用」了。各种各样的工具条在系统中如雨后春笋一般出现,之后,打开浏览器时的首页也变得越来越「好看」,一些网页上还十分「贴心」地将关键词增加了连接指向不同的地方。「真不错」,用户想,「这才是我想要的电脑的样子」。

这并不可笑。

ActiveX无非是在诱惑用户使用管理员权限。它在破坏安全,而不是改进安全——因为写ActiveX「安全」控件的人,并不真的理解安全。

那么,话说回来,当用户改变了其良好的安全习惯之后,他得到的是什么呢?

表面上看,「安全」控件能够防止使用hook的程序获得用户输入的敏感数据,但是事实上这个没有任何作用。在用户的安全习惯改掉之后,最简单的办法,就是让他访问不到真正的网站,并诱使其输入那些敏感数据。举个更通俗一些的例子,把家里大门上了三道防盗门,但是没关窗户,窃贼仍然可以进来。

很遗憾,这很浅显的道理,应用到计算机上,往往就被人们遗忘。做安全的人,就像是人民警察,需要关注每一个细节;而想要破坏安全的人,就如同小偷,可能从任何一个没有被看到的地方进来。安全是一件困难的工作,因为防守的一方,不应该采用任何可能导致问题的办法去防御;而攻击的一方,则可以采用任何手段。

安全靠的是智慧、汗水,向公众普及安全知识,以及与用户的合作,而不是ActiveX。我不相信缺少智慧的做法会改善安全,也不相信从错误的假设能够到达正确的彼岸。