为什么反病毒软件对比浏览器等软件反而更容易被获得漏洞并利用?
  这个问题可以简化成三个子问题:
  杀毒软件的哪些构造可能存在可利用的漏洞?
  为什么通过浏览器能入侵系统?
  为什么取道杀软比浏览器更容易获得漏洞并利用?
  我们先来分析杀毒软件中存在漏洞的潜在机会。
  杀毒软件不只要对抗病毒,还要能检测木马程序、间谍软件、具备反Rootkit能力,现代杀毒软件还要确保浏览器不被安装恶意插件、扫描你的邮箱中潜在的病毒、以及智能化地分析恶意软件的 行为等。其中杀毒软件检测病毒的方式有两种常用手段:特征码识别和启发式识别。特征码识别的原理是检测病毒文件中某种恶意代码的存在,但这种检测方式很笨拙,病毒制作者在病毒程序中随意加入一些无关代码能扰乱杀毒软件对齐识别的能力。并且不同语言、不同编译器、甚至32位和64位平台下编译出来的代码都不同,靠特征码识别只能亡羊补牢,先发现后补救。而这也是数十年前,电脑病毒甚是流行的原因之一。而启发式的识别则会在一个虚拟空间内检测病毒程序的行为,解剖病毒程序的结构,从而判定是否会对系统造成威胁。熊猫烧香病毒流行的时候,微点做到了不升级病毒库能查杀该病毒。
  杀毒软件会提供“实时防护”,也是当你打开程序、下载文件时,杀毒软件都会对当前操作的程序进行一次扫描,如果发现可以文件还可能进行一次启发式分析,当然这些都发生在从你双击程序到程序打开前的几秒空白时间里。短短几秒钟,从杀毒软件在后台默默运行的服务到正在被监视的explorer.exe进程,从双击操作的消息被转发到user32.dll,再从CreateProcess操作跳转到杀毒软件设下的SSDT HOOK中,再从鉴定病毒到删除、处理病毒程序,每个环节都涉及高权限的操作。进入内核态之后,无论是杀毒软件,还是系统代码、驱动程序,大家都在内核态中各自穿行,一点点的不稳定因素都可以导致蓝屏,内核态的代码被注入、篡改,都能导致丢掉整个系统的控制权。
  杀毒软件所安装的驱动程序、内核钩子,所启动的服务、守护进程,都可以视作对原系统的修改。如果它们自身存在缺陷而被替换的系统组件固若金汤,那么安装了杀毒软件的系统反而更容易遭到入侵。
  总结一下是杀毒软件本身具备高权限,如果被病毒附体,那看门人变成了大强盗。那么普普通通的浏览器为何也能被入侵呢?
  以Chrome为例,Chrome本身具备一些安全措施,保证恶意程序不会通过浏览器释放到系统环境中。这些技术包括ASLR、DEP和沙盒等。其中ASLR全程即Address Space Layout Randomization(地址空间布局随机化),每次打开Chrome时其核心组件都位于内存中不同的位置,基本消除了通过在特定位置注入恶意代码来入侵浏览器的可能。DEP即Data Execution Protection(数据执行保护),可以帮助避免Chrome在保留用于不可执行代码的内存区域中插入恶意代码。而Chrome的沙盒技术则利用了Windows所提供的安全机制来实现:
  受限的Token
  Job机制
  窗口站隔离
  桌面隔离
  一致性级别(Integrity Level)
  篇幅所限不在这里一一解释所有概念,大家可以自行查阅维基百科。
  除此之外,随着HTML5技术的发展,网页应用所能获取的本地权限也越来越多,此前Chrome出现过授权给网页应用一次以录音权限、该应用能持续监听用户声音的事件(Speech recognition hack turns Google Chrome into advanced bugging device)。本地缓存、硬件绘图等新组件也为浏览器带来了潜在的被入侵机会。
  现在我们可以讨论正题了,为什么说现如今取道杀软比浏览器更容易获取漏洞并利用?
  1、相比浏览器,杀毒软件本身具备的高权限,使病毒一旦侵入,可以获得更大的自由和活动空间,进行更大范围的监听或造成更大范围的破坏;
  2、现代浏览器提供了完善的机制来对网页应用进行限制,而系统对应用程序的限制主要靠UAC和杀毒软件来保证,对高权限应用程序的需求一直存在(QQ为了防止输入密码时按键被记录,需要部分代码运行在内核态)而网页应用理论上是不能获取高权限的;
  3、杀毒软件的更新频率要高于浏览器的更新频率,其中存在更多分析杀毒软件行为的机会。
  虽然Chrome的安全机制也有被攻破的时候(Google Chrome hacked with sophisticated exploit),但即便被攻破,也只能获得中等的执行权限,要想对系统造成破坏,仍然需要经过UAC和杀毒软件的关卡。费尽心机却不能获得高权限,作为病毒制造者,为什么不直接从杀毒软件下手呢?
  事实上,真正盯上卡巴斯基的人,不是盗号软件的作者们,也不是白帽黑帽黑客们,而是像NSA和英国GCHQ这样的情报集团。而卡巴斯基自曝的入侵事件,也被声明是“的入侵”。
  其实漏洞这种东西,你永远不知道正在被利用、没有被公开的有多少,因为建立在软件上的安全,是不存在的。