恶意软件隐藏技术的帮助下,尽管有最佳实践,企业依然是黑客的首选目标。
侵入系统或网络的恶意软件形式多样,有病毒、蠕虫、间谍软件、木马、广告软件、勒索软件等等。任何可能冲击企业隐私和安全的恶意程序都是恶意软件。最近新闻热议焦点之一是约翰·波德斯塔,美国民主党总统候选人希拉里·克林顿的竞选主管。此人很倒霉地点进了钓鱼网站,让自己的电脑被种上了恶意软件,全部私人邮件被黑客读取。这些电子邮件最终落到了维基解密的手中,出于政治原因,每天放出几千封。
不幸的是,高端网络罪犯一直在改进他们的策略,部署能绕过传统安全解决方案的恶意软件,静悄悄地潜入到企业网络中。有报告显示,每81秒就有恶意软件被下载到企业环境中。这让安全人员必须充分注意到用于隐藏恶意软件的那些技术,以下是七个恶意软件容易藏身的位置。
1. Windows注册表
Windows注册表又大又复杂,很多地方都可以供恶意软件藏身用。其中一个很好的例子就是Poweliks。Windows内置API——ZwSetValueKey,可在注册表中创建带编码数据块键值的注册表键。免文件型恶意软件Poweliks,就是利用该API将自身代码编码隐藏在注册表中。这是恶意软件利用Windows注册表实现隐藏、自启动和长期驻留的诸多方法当中的一种。
2. 进程注入
如名字所示,进程注入就是将代码注入到正在运行的进程中。恶意软件利用进程注入技术将代码执行隐藏到已知“正常”的进程中,比如svchost.exe或explorer.exe,实现检测规避。为将恶意软件注入到已知正常进程,恶意软件作者会利用内置 Windows API,比如说,设置调试权限的那些。进程若被设置为调试模式,就能调用很多调试API,实现附着到其他进程并命令进程分配额外内存等功能。目标进程分配了更多内存后,恶意进程就能往该进程中注入任意代码。
进程注入实例:
Poison Ivy 是利用进程注入的一大恶意软件实例,它通过数据库分表给系统带来伤害。该恶意软件不占用一整块内存,而是在多个不同进程中分配小小的内存块,让对 Poison Ivy 的分析更为痛苦,逆向工程也更难更耗时。
3. 进程挖空
另一个与进程注入相关的技术叫做进程挖空。挖空指的是已知良好进程以挂起状态启动。当代码加载完毕准备执行时,好代码被挖空(此处可自行想象用冰淇淋勺大勺掏空冰淇淋桶的舒爽感觉),进程中便出现了供坏人放入自己代码并修改头部和尾部的空间。这让修改充填过的代码看起来似乎还是好的,然后进程再被重启动。对普通用户而言,这就是个由Windows启动的正常系统进程。因此,逆向工程师和内存鉴证人员也就更难以进行分析了。Dridex银行木马便属于常使用进程挖空技术的恶意软件家族。
4. 进程列表解链
进程列表解链是另一种主要概念。进程就是计算机上运行的任意东西,无论是在用户空间里还是在内核空间里。进程列表解链涉及到操作“进程列表”,也就是包含了所有“活动”进程的双向链表。一旦进程被从进程列表中抽出(解链),该进程便可以对所有查看“活动”进程的工具隐身了。可通过使用ZwSystemDebugControl()函数,或映射/Device/PhysicalMemory来实现这一操作。
怎样将进程从列表中删除:
设要从列表中删除的进程为B,B的后链B->BLink指向其上一个进程A,前链B->FLink指向其下一个进程C。只需将进程A的前链((B->BLink)->FLink)指向C(B->FLink),再将进程C的后链((B->FLink)->BLink)指向A(B->BLink),便可顺利将进程B从双向链表中摘除,遍历进程列表时直接从A跳到C。更高级的黑客还会更进一步,在从列表中移除该进程后,再重写那块内存,这样即便有内存鉴证调查也无法定位到该进程了。安全研究人员有工具可用于查找隐藏恶意代码,比如PsAc4veProcessHead遍历、进程池标签扫描、线程池标签扫描等等。
5. 动态链接库列表解链
通过操作动态链接库(DLL)列表也能隐藏恶意软件。就像进程列表,DLL列表也是双向链表,每个DLL信息节点都有指向其上一个节点和下一个节点的指针,有API可以调用来修改DLL列表中的节点,摘除其中节点,并抹去内存中的信息以辅助逃过内存鉴证或备份工具的检测。这种方法在rootkit活动中很常见。
6. 内核模块列表解链
内核模块又更底层了。内核模块包含加载到内核的任意模块。与DLL和进程列表类似,内核模块也有自己的列表,能通过API查询,返回每一个被加载到内核的模块信息。同样,有调试API可以将内核模块从列表中移除并清零。这一点尤其重要,因为在内核级,只要被清零,再找回的难度就大得多了——该权限就像Ring0级权限,绝对与rootkit行为有关。一般来讲,恶意软件会在用户空间执行,然后尝试内核级漏洞利用以得到内核管理权限,随后释放出主rootkit,主rootkit再将自身从内核模块列表进程列表中清除。到了这一步,恶意软件就藏身良好,非常难以被发现了。