GPU恐成最大帮凶未来病毒运行技术前瞻.doc

上传人:99****p 文档编号:1975039 上传时间:2019-03-25 格式:DOC 页数:11 大小:33.50KB
下载 相关 举报
GPU恐成最大帮凶未来病毒运行技术前瞻.doc_第1页
第1页 / 共11页
GPU恐成最大帮凶未来病毒运行技术前瞻.doc_第2页
第2页 / 共11页
GPU恐成最大帮凶未来病毒运行技术前瞻.doc_第3页
第3页 / 共11页
GPU恐成最大帮凶未来病毒运行技术前瞻.doc_第4页
第4页 / 共11页
GPU恐成最大帮凶未来病毒运行技术前瞻.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、GPU 恐成最大帮凶未来病毒运行技术前瞻恶意软件的编写者们不断地在寻找新的方法来伪装他们的代码,以求逃过杀毒软件的检测。目前有两种新的代码伪装技术对现有的恶意代码检测分析系统形成了挑战,这就是脱壳(unpacking)和运行时多态(runtimep01yITlorphism)。更为危险的是,脱壳和运行时多态都可以利用GPu 进行加速。这样一来,之前困扰恶意软件编写者的那些高负荷计算运行方法,都可以利用 GPU 强大的并行计算能力进行处理。这将导致我们在未来而临破坏力更为强大、狡猾而令人防不胜防的恶意软件。 加壳和变身恶意软件感染计算机的方法 本文中将提到多次有关汁算机病毒、僵尸客户端、木马程序

2、、后门程序以及恶意软件等诸多对电脑经常程序运行产生危害的非法软件。为了方便起见,本文全部将其称呼为“怀有恶意性质的软件”或“恶意软件” 。 在正常情况下,这些怀有恶意性质的软件,会悄悄地插入你的系统进程中,并在后台执行一些不可告人的操作。从硬件角度来分析,传统计算机系统中,只有 CPU 能完成这样的任务。原因首先是 CPU 可以执行任意类型的代码,可编程性极强;其次,CPU 是系统的核心,拥有执行任务相当高的权限;其三,现代 CPU 性能都很不错,多核心技术的普及让这些怀疑恶意性质的软件即使运行起来,用户也很难察觉因为你的CPU 某些核心往往不会满载,NVlDIA,已经分别针对其 GPU 发布

3、了相应的SDK(software developmentkits,软件开发包),用于帮助程序员执行可以在 GPUJL 运行的通用代码。这些代码甚至可以使用传统的 C 语言来编写,比较常见的有 NVIDIA 和 CUDA 或者 AMD 的 Stream。 目前,最新一代的 GPU(比如支持 DirectX 11 的 NVIDIA GeForce GTX500 系列),已经允许 CPU 和 GPU 上运行的代码完全相同(如 NVIDIA 所推出的 CUDA-X86 计划)。在这种情况下,GPU 通用计算被广泛应用于各类计算任务中。当然,这部分计算任务还包括那些“雄心勃勃”的恶意软件代码编写者。考虑

4、到通用计算的巨大潜力,做出“恶意软件编写者们将利用现代 GPU 的强大性能,来为自己牟利”的预测就是很自然的事情了。 当然,如果恶意软件需要正常的运行,必须有两个先决条件:1.躲避现有反恶意软件的防御能力;2.超越分析人员人工解析的能力。很多情况下,对恶意软件的人工解析是确定、部署相应的检测并开发反制软件的先决条件。为了达到这个目的,恶意软件往往使用两种手段来阻止各种反恶意软件发现,并防御自己的运行这就是加壳和多态性,这是使用最为广泛的、用于逃避反恶意软件扫描和防御的技术。除此之外,在实际应用中,代码伪装和反调试技巧常常被用于阻碍对恶意软件代码所实施的逆向分析工程。 所谓加壳,就是将自己真正需

5、要运行的内容保护起来。打比方来说,炸弹外面包上鲜花,然后放在邮包里,邮包放在旅行箱里,旅行箱被放在运输飞机的某一处。在加了三层壳子后,炸弹看起来像个正常的旅行箱,但一旦飞机上天,爆炸后的后果就不堪设想。恶意软件往往将自己伪装成正常执行的程序,骗取系统或者反病毒软件,甚至是用户本人的信任,最终实现其不可知的目的。 而多态性,是指恶意软件在执行时,不将自己全部暴露在内存中如果全部暴露,就可能难以逃脱反恶意软件的扫描。因此,恶意软件将自己的一小部分暴露在内存中,然后在需要的时候再暴露另一部分。简而言之就是“化整为零,按需调用” 。这个看起来相当“有效率”的方法,带来了恶意软件非常难以防御的特性。因为

6、程序不是人,它们只能机械地执行扫描和对比的任务。如果反病毒程序已经确定了几种恶意软件“变身”的方法,那么只要恶意软件下次改变一下暴露顺序,或者掩盖一下自己的执行目标,反病毒软件就可能无法侦测。 迄今为止,这些所有的恶意软件都利用了目前程序执行环境的复杂性,尽可能隐秘地逃脱反恶意软件的侦测。更糟的是,大部分研究反恶意软件的安全研究人员们只关注于 IA-32 架构,因为绝大多数恶意软件都运行在 X86 系统上。但令人担心的是,GPU 通用计算的来临,为恶意软件的编写者们带来了一扇机会之窗,因为大多数安全研究者对于 GPU 的执行环境和指令集架构并不熟悉。利用 GPU 通用计算,恶意软件可能会有效对

7、抗现有的防御手段。 机会还是威胁 GPU 通用计算的发展 接下来,让我们先暂停一下对恶意软件的恐惧,进入 GPU 的世界。GPU 通用计算最近几年来飞速发展,当 GPU 本身可编程性和灵活性大大提高后,很多人开始着手探索如何利用 GPU 架构进行大规模的并行计算,毕竟 GPU 拥有系统中最为强劲的浮点计算能力,仅仅作为 3D 计算显然相当可惜。但 GPU 通用计算需要专用 API 才能在 GPU 上完美运行。一般的图形 APIMDlrectX 和 OpenGL 等,都不能很好地进行通用计算。 对传统 GPU 来说,无论是 GPU 本身设计还是调用方式都尽可能为 GPU需要执行的图形计算优化。因

8、此你如果想利用 GPU 庞大的计算资源,那些需要计算的数据和变量,必须映射为图形学对象,算法处理必须被表述为像素和顶点处理的形式,假装是在进行图形计算一样。这种“假装”的形式让程序员感到很束缚。因为传统 GPU 缺乏方便的数据类型,基本的计算函数,以及一个一般化的内存访问模型,使得它对于习惯于工作在传统编程环境下的程序员们来说没有多少吸引力。 进入 DirectX 10 时代后,NVIDIA 提出了 CUDAfCompute UnifiedDevice Architecture)这样一个相当富有创造力的通用运算 API架构。有了这个 API 之后,程序员就不需要在自己的大脑中“映射”各种数据,

9、APl 作为沟通桥粱已经承担了数据转换、程序编译等任务。这样一来,GPU 就能很好地发挥计算效能。与此同时,AMD 也提供了对应自家GPU 产品的通用计算方法,被称为 Stream。 CUDA 由一个 C 语言的极小扩展集和一个运行库组成,这个运行库提供的函数能够控制 GPU,以及设备专有函数和相应的数据。从相对宏观的角度看,一个 CUDA 程序由两部分组成,一个运行在 CPU 上,另一个称之为“kernel” ,是运行于 GPU 上的并行化部分。不过 GPU 上的 kernel 是不能独立运行的,它只能依赖于 CPU 上的父进程调用,因此,它不能被作为一个独立的程序直接初始化。 CUDA 中

10、的 kernel 在运行时被划分为多个线程来执行,这些线程被组织成多个线程块,然后交由 GPU 的 CUDA Core-也就是常说的流处理器来执行。在 GeForceGPU 中,每个处理单元会包含 8 个 SIMD 流处理器组。这 8 个 SIMD 流处理器组会根据一个线程调度器的调配,令多个线程块尽可能高效率、最大化地运作,保障整个 GPU 的运行效率。除了编程执行外,CUDA 还提供了用于在主机和 GPU 问进行数据交换的函数,所有的 IO 动作都通过 PCI-E 总线进行。不仅如此,存储器操作还可以通过 DMA 进行,这样就可以大幅度提高 CPU 和 GPU 工作的并行程度。在内存一致性

11、方面,主机的分页锁定内存中的一个块可以被映射到 GPU 的地址空间里,使得在 CPU 上运行的普通程序和 GPU 上运行的kernel 能够直接访问相同的数据。 总的来说,无论是 CUDA 还是 Stream,都是尽可能利用 GPU性能的API。恶意软件要运行得有效率,就绕不开这两个 API。下面就让我们来看看恶意软件是如何在 GPU 上捣鬼的。 上文说过,运行于 GPU 上的 kernel 必须依赖 CPU 上的父进程。恶意软件也是如此,那些能利用 GPU 超强性能的恶意软件往往包含两个部分-GPU 部分和 CPU 部分。说得更细致一些,那就是恶意软件在执行时,会裁入 GPU 端的设备代码,

12、分配 CPU 和 GPU 都可以访问到的一块内存区域,先初始化数据,然后调度 GPU 代码开始执行。当然,和所有利用 GPU 的程序一样,恶意软件可以在 GPU 和 CPU 之前来回转换,或者单独让 GPU运行或者只让 CPU 运行,也可以同时在 GPU 和 GPU 并行执行。 当然,恶意软件编写者不仅仅看中了 GPU 的计算能力,他们还需要更自由、不被监视的执行空间。恰好,在 GPU 这里,恶意软件可以与CUDA 库静态链接,成为一个独立的可执行程序,这样一来,恶意软件就不需要在被感染的系统中安装额外软件。更令人难以接受的是,目前 GPU端的代码执行,以及 CPU 和 GPU 之间的通讯,都

13、不需要管理员特权。这意味着,恶意软件可以在任何用户权限下成功运行它不需要任何权限,也没人监控它。这就令恶意软件隐蔽性更高、更容易被运行起来。束手无策?恶意软件如何利用 GPU 资源 前文已经描述了恶意软件感染系统的方式,并且说明了它利用 GPU进行并行加速的可能性。接下来,研究人员将通过实例来模拟这个过程。在模拟中使用的原型代码不仅仅证明了恶意软件利用 GPU 的可行性,而且已经确信对现有的分析检测系统构成了不容忽视的挑战。 研究人员选择使用 NVIDIACUDA 来部署源代码,当然攻击者可以很容易地使用其他 GPU 代码版本,甚至还能在不同 GPU 之间进行转换。目前攻击者只要掌握了 CUD

14、A 和 Stream,就能基本上掌握 100的 GPU 恶意软件攻击范围。还有更令人恐惧的OpenCL 是一个跨平台的 GPGPU 框架,致力于提供统一的 API,如果它得到广泛引用,那么就连插入不同版本的代码也完全没有必要,只要平台支持 OpenCL,就可能被恶意软件利用你电脑中的 GPU 加速运行。 1.自脱壳 GPU 加速 前文已经简单介绍了恶意软件的加壳技术。当然,飞机上放炸弹的例子只是用于破坏性的炸弹。在软件这里,经过多层加壳伪装后的代码,需要脱壳解秘,才能变成真正的恶意代码危害系统。 一般情况下,恶意软件设计有自脱壳程序,这个程序在运行时会首先解包被隐藏的代码,然后将控制权移交给已

15、在主机内存中变形为真实代码的恶意软件。当然,一种恶意软件可能不止使用一种加壳程序,使用不同的变换方法或者改变解包程序的代码,攻击者可以容易地制造同一个恶意软件的全新变种,还能有效地躲避检测程序。 目前传统恶意软件的自脱壳算法都不特别复杂,因为要考虑到 CPU的计算能力,一旦显著拖累系统,恶意软件不但容易被察觉,还给自己的运行带来了不利影响。但利用 GPU 强大的并行计算能力后,恶意软件的作者能够利用极其复杂的加密算法给恶意软件加壳,这些复杂的加密算法最终将被 GPU 大规模并行架构快速而有效地处理。 这种高强度的加壳、脱壳操作,为现有的恶意软件分析检测系统制造了不容忽视的障碍。许多反恶意软件中

16、用于检测自动脱壳的部分有先天缺陷,没办法应对基于 GPU 的自解包恶意软件。比如常用的PolyUnpack,在脱壳时依赖单步执行和动态反汇编,但这种技术在 GPU上的动态和静态分析还很不成熟,当然也没有获得恶意软件分析系统的支持。另外一些反恶意软件的脱壳系统,比如 Renovo,依赖于在虚拟机中监控恶意软件的执行过程,但显而易见的是,目前的虚拟机还仅仅只能做到虚拟图形设备而已,只能执行简单的 3D 计算,根本不能执行 GPU通用计算任务,也没有这方面的功能。这样一来,利用虚拟机监控恶意软件的脱壳也将成为泡影。 当然,还有一些检测软件脱壳的技术比如 omniUnDack,这种技术理论上可能会对恶

17、意软件在 GPU 中的操作起到一定的检测作用,但实际上它在应用中还是和虚拟机联合部署的,也就是说,实际应用中也不能检测到 GPU 中的脱壳运行情况。 2.运行时多态技术 不过,前一页研究人员的演示可能并不能让人信服,有人肯定会说,无论加壳脱壳的设备是 CPU 还是 GPU、无论壳算法多么复杂,最终都将恶意代码直接存放在主机内存中。这样一来只要反恶意软件扫描系统内容,就能很轻松地发现恶意软件执行意图并给予相应防御措施。 实际上这种情况只能代表部分恶意软件的运行方法。正像本文开头解释“运行时多态”技术时说的那样,恶意软件在运行时,往往不会暴露自己的全部代码,它可能重新加壳,或者只是按需分配、重复加

18、壳脱壳那些当前需要的代码。不仅如此,恶意软件开发人员还会控制解码部分的粒度,也就是每次解码的数最,这个数量越小,在内存中暴露真实代码的区域就越小,被侦测的可能性也就越低,也越难以被发现和防御。这种代码分割算法给反恶意软件带来了明显的困扰。 在加入了 GPU 后,这些重复脱壳加壳的算法,都使用 GPu 执行,并且整个需要脱壳和加壳的部分代码也全部存在 GPUAc。CPU 的职责仅是在每个部分的代码执行前和执行后,将控制权交还给 GPu 上的调度代码,去做按需的解密变换和加密变换。也就是说,在执行期间,控制权在 CPU和 GPU 之间不断地转换。同样,GPU 和 CPU 也拥有一个可以同时访问的内

19、存区域用于保持数据一致性和及时刷新。 不仅如此,在这种技术中,解密密匙被保存在较为保密的、无法从CPU 端访问的 CUDA 设备存储器当中,更有甚者,在每个部分执行后的重加密过程中,还可以使用随机生成的不同密匙,这导致了恶意软件能够在存储器中以不可预测的方式不断地发生变异。而这些解密方法和变异都是不能被检测或者预测到的,将直接导致目前依赖抽取密钥和相应加密解密区域等方法的反恶意软件运行失败。当然从理论上来说,虽然原始代码的完整抽取仍然是可能被分析人员做到的,但是如果考虑现有的反调试技术,这种有 GPu 从旁协助的运行时多态会使得整个逆向工程分析过程变得异常地漫长和艰难。未来更危险?GPU 上恶

20、意软件的发展方向 在先前的章节中,研究人员为我们展示了恶意软件将自己在 CPU 和GPU 之间分离执行的具体方式。虽然现代 GPU 的性能已经足够强大,但是目前的技术仅仅使用了其中的一小部分。未来恶意软件作者可能会开始广泛利用 GPU 的图形和通用计算能力。 GPU 提供了,大规模并行处理的能力,可以被用来加速 CPU 负载较重的运算。例如,一些恶意软件开发人员往往使用僵尸网络进行大规模的密码暴力破解,而这正是 GPU 通用计算的专长。通过对 GPU 通用计算的支持,僵尸电脑的能力可以很容易地获得延伸,可以使用被感染主机的GPU 来分摊密码破解的负载。这不仅带来了整体破解效率的显著提升,而且还

21、隐藏了正在进行的恶意活动因为 GPU 的工作无法被实时监控,无法鉴别正在运行的代码,所以难以确认 GPU 上是否有密码破解程序的代码出现。另外,由于 GPU 的加入,在这种计算任务中,CPU 几乎不会占用,所以 CPU 负载监视程序对于检测恶意活动也无能为力。 除了恶意软件在 GPU 上的运行外,还有其他的一些危险也可能和 GPU挂钩。比如 GPU 的帧缓冲区,屏幕上所显示的内容往往存放在帧缓冲区内。不过目前系统对帧缓冲区的访问没有施加限制,这可能会带来一系列攻击手段。比如,GPU 上运行的恶意代码能够周期性地访问这一缓冲区,将用户屏幕上出现的私人数据收入囊中,这个做法比现有的屏幕截图的手段更

22、加隐蔽。而更老练的恶意软件甚至会试图在用户访问虚假网站时,在屏幕上显示错误的或者具有迷惑性的信息,例如偷偷将用户浏览器地址栏中,那些可能会引起用户怀疑的恶意地址,替换成看起来正常的地址。 不过有一个好消息是,目前帧缓冲区还存在读写保护,因此一些对帧缓冲区的恶意行为很难轻易实施。但由于厂商们一直在尝试提升 GPU通用运算 SDK 和图形 API(如 OpenGL,DirectX)的互通性,所以未来有可能存在对屏幕帧缓冲区拥有完全访问权限的 kernel。这种要求主要来自于那些需要直接访问屏幕像素的程序,例如 3D 变换,视频编码与解码等。因为这样一来就可以大大减少 cPU 和 GPU 间的数据交换。所以,将来发布的硬件会不可避免地具备这一特性。 更恐怖的是,未来的 GPu 通用架构将使得部署基于 GPU 的恶意软件成为可能,也就是说,恶意软件将主要在 GPU 上运行,与在 CPU 上运行的程序没有任何关联。不过令人庆幸是,这种问题可能在短期内都不会

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。