快捷搜索:   nginx

做自己的救世主——系统安全保卫战

一. 谁是救世主

  相信看过《黑客帝国》系列的朋友都不会对主人公尼奥感到陌生,这位闯入虚拟世界的程序员一次又一次演绎了“救世主”的角色,保护了城市居民,其形象早已深入人心。而离开电影后,我们广大的计算机用户要面对的又是另一种亦真亦假的数字虚拟世界——网络,这里同样潜伏着许多危险,同样存在“黑客帝国”,但这里却没有尼奥这个人的存在,我们能看到的,只有形形色色的安全厂商和他们所提供的安全工具,除此之外,似乎已经没有别的选择。

  于是乎,许多用户把各种安全工具看成了这个世界中的“救世主”,我们看到许多关于安全工具的广告,我们购买市面上流行的防病毒软件,我们在听闻每周一次的“新病毒预警”时赶紧升级病毒特征库,我们每周都对电脑进行一次漫长的病毒扫描……许多人都这样做,许多人不得不这样做,因为我们把一切都交给杀毒工具了,我们什么都不需要做了,我们只管肆无忌弹的上网聊天看电影下软件,因为我们有杀毒工具,这些工具都具备一个“实时监测”的功能,它每时每刻都会检查我们刚下载的文件,我们感到自己很安全,我们以为这就是网络中的防御。

  然而,事实真的如此美好吗?依稀记得有一句话好像是这么说的,“无论你做什么事情,你都不可避免要付出一定的代价”,在我们安然自得的享受由杀毒工具带来的安全防御的同时,我们也在付出相应的代价。为什么呢?因为杀毒工具是一套在系统启动的时候就开始运行直到关机或者用户退出它的时候才会停止运行的程序,它们的检测和防御机制的效率是不能和尼奥相比的。举个简单例子,学过编程的人大概都知道,象棋程序是最难写得完美的,因为象棋的走法从来都没有一个固定的模式,我们能创造出许多花样,但是程序不能,它只能按照有限的判断机制去决定每一步棋怎么走,这就是为什么如今的许多象棋程序看起来像个傻瓜的原因。有人也许会说,做一个强大的象棋程序把尽可能遇到的走法都写进去就可以了,这个象棋程序必然无敌。这样是可行的,但是由此带来的代价就是每个和它下棋的人可能都要花一辈子的时间了,因为程序在每走一步棋之前都要把所有尽可能遇到的情况都“思考”一遍,这样是要付出时间作为代价的,如果要缩短时间,就要让程序在同一时刻思考多种走法,但着时候,代价就变成庞大的系统资源消耗了——你能忍受么?

  同样的缺陷正在杀毒软件身上发生,我们知道,大部分杀毒软件是采用“特征码”技术去搜索病毒的,就是说,杀毒软件引擎读取一个程序或文件内容,并与自身数据库里储存的已被确认为病毒程序体内某段特定代码进行匹配,一旦两者相同,杀毒软件就“确认”此文件为病毒。随着病毒家族的庞大,这个数据库体积的增长也到了不可忽视的地步,加载的速度也就慢了。而且数据库每增加一个病毒特征码,杀毒引擎的判断分支就要增多一条,相应的时间也会延长,为了避免出现扫描一个文件需要半小时的尴尬情况,杀毒软件会采用各种提高匹配速度的方案,但这些方案无一例外都要疯狂剥削用户的系统资源,如果一台电脑的配置并不是很高,那么在用户查毒的时候,他基本上已经不能正常做其他工作了,找个电视台慢慢看连续剧吧,这就是尼奥的代价。

  那么,谁才是我们的救世主?答案就是——你自己。能信任的人永远只有自己,只要肯努力,每个人都可以做尼奥,不过这也是有代价的,因为它把系统资源的消耗转变为脑子的消耗,把判断分支和经验写入脑子里,在处理分支的效率上,人永远比程序要灵活,而且这样一来就不会出现依赖的恶性循环了,离开了杀毒软件,我们要学会靠自己来保护自己不被这个虚拟世界伤害到。现在,就让我们来做自己的救世主吧。

  二. 做自己的救世主

  小时候曾经看过一个故事《另一种侵略》,被人类打败的宇宙侵略者送给人类一种水晶,只要人类拿起它想一种物品,这个物品就会出现在自己面前,于是每个人都开始沉浸于无尽的享受中,再也没人去钻研科技国防了,几十年后,人类开始出现退化现象。这时候,宇宙侵略者又来访问地球了,这次它们只用了一条条鞭子就征服了地球,在最后一个人类被驱逐进囚笼之前,他回头含糊不清的说了句什么话——连他的舌头都退化得差不多了,也许他是说:“地球完了。”

  以上的故事或许只是虚无的幻想,但类似的行为却正在当代发生,如果一个用户怀疑自己的电脑感染了后门,他的第一个反应大概会是打开杀毒工具。故事里的人类太依赖水晶的魔力,现实中的我们太依赖杀毒软件的方便快捷!也许有人会反对,既然能使用工具方便快捷的保护计算机安全,我又何必自寻烦恼学习安全防御?会这样想的用户没有想到网络的复杂,能闯进计算机的“客人”并非就是在各大安全工具厂商通缉名单上的成员,因为网络中还流传着一部分小规模使用而且没有被公开的“私人后门”(例如大部分DDoS后门工具其实都是自己写自己用的),有能力的人都可以自己写“私人后门”,然后通过多种途径放到别人的计算机上执行。这时候,“病毒库特征码”技术的局限性就开始显露了,被感染了“私人后门”的用户偶尔会察觉到计算机异常,然后他会开始查毒,结果因为渗透进系统的后门程序并没有在病毒特征库里“登记”过,杀毒软件就认不出它了,用户只能在浪费大量时间后看着杀毒软件报告的“没有发现病毒”消息继续“享受”被入侵的感觉。这个事实可笑吗?我们只能在自己信赖的尼奥面前被敌人杀死——甚至这个尼奥也不复存在了,如果后门能把它踢出内存并删除掉的话。

  还是那句话,能信任的人只有自己,更何况这是网络。所以,我们不能再战战兢兢的躲在掩体里等待救世主消灭所有敌人了,我们要做自己的救世主!

  三. 捕获不请自来的“客人”

  “600型机器人包裹的是橡胶外皮,很容易被认出来,但现在的101型机器人是生化技术制造的,有真实皮肤,会呼吸、流血、甚至口臭,一切都和人类一样,直到它开始攻击,你才能知道它不是人类。”

  “那你们怎么办?”

  “我们用狗识别终结者。”

  ——《终结者》

  在《终结者》里,狗是唯一可以区分敌我的工具,因为它判断对方的方式并不仅仅靠眼睛——眼睛是可以被欺骗的,但是气息不能,一个机器人无论伪装得再怎么逼真,都不能具备生命体的气息,但是它能欺骗人类的视觉和听觉,这就足够了。

  后门技术从诞生到现在,已经发展了好几代,对自身的伪装技术也越来越成熟了,从最初的启动项结合隐藏进程方式,到最新的Ring0驱动方式,我们越来越难发现这些“客人”的痕迹,当它开始破坏的时候,已经来不及做补救措施了,所以,我们需要一种可以嗅出后门气息的“狗”。

  1.准备工作

  在进行一切工作之前,用户需要对系统有点了解,例如注册表、启动项、服务、常见的程序和进程名等,这是学习手工查毒最基本的要求,在初期可以多参考一些介绍系统概念的文章如到处都流传的“系统进程详解”、“WinXP系统服务简介及优化措施”等,并做一点笔记,力求日积月累尽快记住一些最常见的系统程序和相关工具的使用方法,如果过不了这个门槛,后面的工作也就无从谈起。

  首先,我们必须了解Windows系统的三大知识点:注册表(Registry)、进程(Process)和权限(Privilege)。

  “注册表”是出现在Windows 95及以后版本的一种数据库。在这之前,用户要对软硬件工作环境进行配置,就要修改一种被称为“配置设置”(INI)的文件来完成,但是由于每种设备或应用程序都得有自己的INI文件,无形中增加了管理难度,为了解决这个问题,微软开始统一标准并将各种信息资源集中起来存储,最终形成了将应用程序和计算机系统配置信息容纳在一起的“注册表”,用来管理应用程序和文件的关联、硬件设备说明、状态属性以及各种状态信息和数据等,注册表维持着整个系统的正常运作。

  注册表采用一种类似文件目录的结构树来描述配置信息,最顶端的5个项目称为“根键”(ROOT_KEY),系统能识别的所有的数据都是从它们这里展开的,这5个根键分别是:

  HKEY_CLASSES_ROOT(负责各种组件注册类别和文件并联信息)

  HKEY_CURRENT_USER(当前登录用户的环境信息)

  HKEY_LOCAL_MACHINE(整个系统的公共环境信息)

  HKEY_USERS(所有用户的环境配置信息)

  HKEY_CURRENT_CONFIG(当前的配置信息)

  其中,我们主要关注的是前面三个根键里的数据,它们是后门最爱篡改的地方,分别是三个启动项目“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run”、“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”和“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices”,一般的后门都要通过修改这里加入自己的配置信息以达到跟随系统启动的目的;除此之外就是文件并联信息“HKEY_CLASSES_ROOT”,并联型后门最爱更改这里的.exe、.bat、.scr、.com等可执行文件的注册信息,让自己抢先一步运行。更多涉及到的注册表内容以后会提到,现在让我们来看看进程是什么。

  “进程”,是指一个可执行文件在运行期间请求系统在内存里开辟给它的数据信息块,系统通过控制这个数据块为运行中的程序提供数据交换和决定程序生存期限,任何程序都必须拥有至少一个进程,否则它不被系统承认。进程从某一方面而言就是可执行文件把自身从存储介质复制在内存中的映像,它通常和某个在磁盘上的文件保持着对应关系,一个完整的进程信息包括很多方面的数据,我们使用进程查看工具看到的“应用程序”选项卡包含的是进程的标题,而“进程”选项卡包含的是进程文件名、进程标识符、占用内存等,其中“进程文件名”和“进程标识符”是必须掌握的关键,“进程标识符”是系统分配给进程内存空间时指定的唯一数字,进程从载入内存到结束运行的期间里这个数字都是保持不变的,而“进程文件名”则是对应着的介质存储文件名称,根据“进程文件名”我们就可以找到最初的可执行文件位置。

  最后是“权限”,这里涉及的权限是指80386模式的Ring权限。操作系统是由内核(Kernel)和外壳(Shell)两部分组成的,内核负责一切实际的工作,包括CPU任务调度、内存分配管理、设备管理、文件操作等,外壳是基于内核提供的交互功能而存在的界面,它负责指令传递和解释。由于内核和外壳负责的任务不同,它们的处理环境也不同,因此处理器提供了多个不同的处理环境,把它们称为运行级别(Ring),Ring让程序指令能访问的计算机资源依次逐级递减,目的在于保护计算机遭受意外损害——内核运行于Ring 0级别,拥有最完全最底层的管理功能,而到了外壳部分,它只能拥有Ring 3级别,这个级别能操作的功能极少,几乎所有指令都需要传递给内核来决定能否执行,一旦发现有可能对系统造成破坏的指令传递(例如超越指定范围的内存读写),内核便返回一个“非法越权”标志,发送这个指令的程序就有可能被终止运行,这就是大部分常见的“非法操作”的由来,这样做的目的是为了保护计算机免遭破坏,如果外壳和内核的运行级别一样,用户一个不经意的点击都有可能破坏整个系统。但是现在,Ring已经屡屡被后门木马利用成为一个令人头痛的凶器。

  2.进程伪装型后门的歼灭

  最初的后门靠注册“系统服务”的方法在Win9x系统里隐藏自己的运行信息,到了NT架构里,这个方法失效了——NT家族自带的任务管理器(Task Manager,TaskMgr.exe)把所有普通进程都一视同仁的显示出来,连初级用户都能轻易发现后门运行的痕迹,于是后门制造者开始攻克心理学和障眼法,让后门进程在任务管理器里把自己标榜为“系统关键进程”,达到欺骗用户的目的。

  我们都知道,任务管理器列出的众多进程里包含着一部分“关键进程”,它们是无法通过任务管理器中止的,而且许多文章也会提到相关进程名,久而久之,我们又养成一个习惯:查看进程信息时,只要看到熟悉甚至类似的进程名就忽略不计了,仅仅去寻找不熟悉的进程名,于是后门制造者就直接利用这个心理暗角配合路径遍历法则,让后门进程显示为“smss.exe”、“svchost.exe”、“lsass.exe”、“csrss.exe”、“winlogon.exe”等关键进程名就欺骗了用户和任务管理器。

  在这种情况下,系统自己的任务管理器已经不能信任了,因为它遗漏了最重要的路径信息,后门就利用了这一点——它可以把自己伪装成svchost.exe放到Windows目录下,然后在注册表启动项里加上不带路径信息的“svchost.exe”信息,系统在根据目录遍历法则一层层深入寻找svchost.exe时会在Windows目录里发现并执行它,而真正的关键进程svchost.exe是在SYSTEM32里的,而且它也必须通过“服务管理器”(Service Control Manager,SCM)加载,于是任务管理器会显示多个svchost.exe进程,但是由于缺乏路径指示,我们根本不知道系统已经多了一个假的svchost.exe。即使我们发现了它是假的,也无法用任务管理器终止它的运行,因为任务管理器只是简单的判断了文件名就认为它是“关键进程”了,自然不会让你终止。类似的后门伪装文件名还有“SYSTEM\rundll32.exe”、“SYSTEM32\rundll.exe”(NT架构里根本没有rundll.exe这个程序)、“SYSTEM\services.exe”等,要发现并歼灭这些后门,除了要求我们对常见的系统关键进程有所了解以外,还需要第三方提供的扩展任务管理器协助,例如Windows优化大师携带的进程查看器,用它便可迅速发现路径不对的“假兄弟”。

  其实最迅速的查找方法是运行“系统配置实用程序”(MSCONFIG.EXE),切换到“启动项”,如果在这里发现了“系统关键程序”的信息,那它一定是假的。

  3.服务欺骗型后门的战役  

  Windows的任务管理器不可终止两种程序的运行:一种是关键进程,另一种是通过服务管理器SCM启动的系统服务程序(NT-Service),所以一部分后门制造者设法把后门做成服务形式,让SCM直接帮助启动服务进程,不再借用注册表启动项加载,这样即使是对注册表启动项有一定了解的用户也难以发现异常,而且就算他想终止任务管理器里显示的奇怪进程,也会被拒绝,如果用户对服务管理器的了解不深,那他将会在眼花缭乱的服务面前变得束手无策。

  这时候,我们又需要请“系统配置实用程序”出山了,切换到“服务”选项卡,把“隐藏所有Microsoft服务”,这里就只显示非微软开发的普通服务程序列表了,包括服务欺骗型后门的服务项,一般它会包含欺骗性质的字符或者伪装成某厂商的服务名,如“Rising Virus Monitor”(瑞星监控)、“Macromedia License”等,记住这里显示的列表名称,接着运行“服务管理器”(Services.msc)找到对应的项目,看看属性里的文件和路径是不是真的,如果你并没有安装KAV、MCAFEE这些杀毒软件而SCM里却找到对应项目的话,它就是狡猾的后门没错了。一些间谍软件还会自作主张的把自己命名为“Windows Print Controller”,简直就是无视系统自身的“Print Spooler”服务。

  找到这类后门后,不要急着终止它的运行,既然后门作者知道SCM能直接停止它们,就必然会做一些复活措施,所以我们必须先把后门服务的“启动类型”设置为“禁止”,然后重启一次确保后门程序无法跟随系统启动,这时候才能开始清理后门。其中文件的路径信息SCM已经提供给我们了,直接在磁盘上找到删除即可,但是服务项目不能直接用SCM删除,要删除这个残留的服务项,首先要对系统服务有个最初的概念。

  官方对系统服务的定义如下:

  在NT架构系统中,服务是指执行指定系统功能的程序、例程或进程,以便支持其他程序,尤其是底层(接近硬件)程序。通过网络提供服务时,服务可以在Active Directory中发布,从而促进了以服务为中心的管理和使用。服务是一种应用程序类型,它在后台运行。服务应用程序通常可以在本地和通过网络为用户提供一些功能,例如客户端/服务器应用程序、Web服务器、数据库服务器以及其他基于服务器的应用程序。 既然服务自身也是独立出来的程序,它就必须有一个加载的入口,我们可以把这个入口理解为第二个启动项,这个入口是由SCM负责的,无论是什么身份的用户进入系统,SCM启动服务的位置都固定在注册表的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services分支里,所以只要找这个分支就可以发现所有服务——也许你会说,这里显示的名字似乎都毫无意义,我怎么知道哪个是我正在找的?其实很简单,我们回到SCM,查看一个服务的属性,例如“DNS Client”服务,它的属性里写着“显示名称:DNS Client 服务名称:Dnscache”,现在回到注册表分支,查找“Dnscache”,就会看到它是CurrentControlSet \Services\Dnscache,这就是我们在SCM里看到的“DNS Client”服务,如果你删除掉“Dnscache”项目,那么整个“DNS Client”服务也就消失了。以此类推,很快就可以清理掉服务欺骗型后门。

  4.最艰难的寻找:Ring 0后门

  随着安全技术的发展和计算机用户群的技术提高,一般的木马后门越来越难生存,于是一部分有能力的后门作者把眼光投向了系统底层——Ring 0。位于Ring 0层的是系统核心模块和各种驱动程序模块,所以位于这一层的木马也是以驱动的形式生存的,而不是一般的EXE。后门作者把后门写成符合WDM规范(Windows Driver Model)的驱动程序模块,把自身添加进注册表的驱动程序加载入口,便实现了“无启动项”运行。一般的进程查看器都只能枚举可执行文件EXE的信息,所以通过驱动模块和执行文件结合的后门程序便得以生存下来,由于它运行在Ring 0级别,拥有与系统核心同等级的权限,因此它可以更轻易的把自己隐藏起来,无论是进程信息还是文件体,甚至通讯的端口和流量也能被隐藏起来,在如此强大的隐藏技术面前,无论是任务管理器还是系统配置实用程序,甚至系统自带的注册表工具都失去了效果,我们不得不借助于更强大的第三方工具。幸好,一部分持有编写Ring 0程序能力的人并没有加入Ring 0木马的阵营,而是把技术用到了安全检查方面,于是我们有了IceSword、RootkitRevealer、knlsc等优秀的检测工具。

  一般的进程工具是运行在Ring 3级别的,它们读取的依据来自Ring 0层,这些数据是可以被运行于Ring 0级别的木马修改的,所以它们根本无法得知木马程序信息,而IceSword等检测工具不同,它们和Ring 0木马一样,也是通过驱动的模式进入Ring 0层工作的,不再需要从Ring 0层获取信息,所以它们能得到未被木马篡改的原始链表数据,例如最原始的进程信息,它是不能被更改的,如果木马把它自身从原始进程信息里删除,就意味着它要自我终结了。所以一旦有进程工具从 Ring 0层直接读取了原始数据,再把这个数据和Ring 3层获取到的进程列表比较一下,就能迅速发现哪个是拼命隐藏自身的木马程序了。很巧合的是,驱动程序和系统服务共享同一个加载入口,即HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,只要查找相应的Ring 0木马文件名,就会发现它,删除掉注册表的加载数据后重新启动计算机,再删除掉木马文件就可以解决了。
顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论