为您的软件建立强大的安全性至关重要。恶意行为者不断使用各种类型的恶意软件和网络安全攻击来破坏所有平台上的应用程序。您需要了解最常见的攻击并找到缓解它们的方法。
本文不是关于堆溢出或堆利用的教程。在其中,我们探讨了允许攻击者利用应用程序中的漏洞并执行恶意代码的堆喷射技术。我们定义什么是堆喷射,探索它的工作原理,并展示如何保护您的应用程序免受它的影响。
什么是堆喷射技术,它是如何工作的?
堆喷射是一种用于促进执行任意代码的漏洞利用技术。这个想法是在目标应用程序中的可预测地址上提供一个shellcode,以便使用漏洞执行这个 shellcode。该技术是由称为heap spray的漏洞利用源代码的一部分实现的。
在实现动态内存管理器时,开发人员面临许多挑战,包括堆碎片。一个常见的解决方案是以固定大小的块分配内存。通常,堆管理器对块的大小以及分配这些块的一个或多个保留池有自己的偏好。堆喷射使目标进程连续地逐块分配所需内容的内存,依靠将 shellcode 放置在所需地址的分配之一(不检查任何条件)。
堆喷射本身不会利用任何安全问题,但它可用于使现有漏洞更容易被利用。
必须了解攻击者如何使用堆喷射技术来了解如何缓解它。以下是普通攻击的样子:
堆喷射如何影响进程内存
堆喷射攻击有两个主要阶段:
1.内存分配阶段。一些流连续分配大量具有相同内容的固定大小的内存块。
2.执行阶段。这些堆分配之一接收对进程内存的控制。
如您所见,堆喷射漏洞利用技术看起来像连续的垃圾邮件,形式为大小相同且内容相同的块。如果堆喷射攻击成功,控制权将传递给这些块之一。
为了执行这种攻击,恶意行为者需要有机会在目标进程中分配大量所需大小的内存,并用相同的内容填充这些分配。这个要求可能看起来过于大胆,但最常见的堆喷射攻击案例包括破坏Web 应用程序漏洞。任何支持脚本语言的应用程序(例如,带有 Visual Basic 的 Microsoft Office)都是堆喷射攻击的潜在受害者。
因此,在一个流的上下文中预期攻击是有意义的,因为脚本通常在单个流中执行。
但是,攻击者不仅可以使用脚本语言执行堆喷射攻击。其他方法包括将图像文件加载到进程中,并通过使用 HTML5 引入的技术以非常高的分配粒度喷射堆。
这里的问题是哪个阶段可疑,我们可以干预并试图弄清楚是否存在正在进行的攻击?
内存分配阶段,当一些流填满大量内存时,已经很可疑了。但是,您应该问自己是否可能存在误报。例如,您的应用程序中可能存在确实在一个循环中分配内存的脚本或代码,例如数组或特殊内存池。当然,脚本在完全相同的堆块中分配内存的可能性很小。但是,它仍然不是堆喷射的关键要求。
相反,您应该注意执行阶段,因为分析接收进程内存控制权的堆分配总是有意义的。因此,我们的分析将特别关注包含潜在 shellcode 的分配内存。
为了将堆喷射 shellcode 的执行与普通JIT代码生成区分开来,您可以分析分配某个内存块的最新流分配,包括流中的相邻分配。请注意,堆中的内存始终分配有执行权限,这允许攻击者使用堆喷射技术。
堆喷射缓解基础知识
为了成功缓解堆喷射攻击,我们需要管理接收内存控制的过程,应用钩子,并使用额外的安全机制。
保护您的应用程序免受堆喷射执行的三个步骤是:
1.拦截NtAllocateVirtualMemory调用
2.在尝试分配可执行内存期间使其无法执行
3.注册结构化异常处理程序 (SEH) 以处理由于执行不可执行内存而发生的异常
现在让我们详细探讨每个步骤。
接收对内存的控制
我们既需要监控目标进程如何分配内存,又需要检测动态分配内存的执行情况。后者假设在堆喷射期间分配的内存具有执行权限。如果数据执行保护 ( DEP ) 处于活动状态(对于 x64,默认情况下始终处于活动状态)并且尝试执行没有执行权限分配的内存,则会生成异常访问冲突。
恶意 shellcode 可以预期在没有 DEP 的应用程序中执行(这不太可能),或者使用脚本引擎在默认情况下具有执行权限的堆中分配内存。
我们可以通过拦截可执行内存的分配并以分配它的漏洞无法察觉的方式使其不可执行来防止恶意代码的执行。因此,当漏洞利用认为喷射是安全的执行并尝试将控制权委托给喷射的堆时,将触发系统异常。然后,我们可以分析这个系统异常。
首先,让我们从用户模式进程的角度来探索 Windows 中的内存工作是什么样的。以下是通常分配大量内存的方式:
在哪里:
如果我们设法替换NtAllocateVirtualMemory,我们将能够拦截进程内存中的堆分配流量。
应用挂钩
为了拦截目标函数NtAllocateVirtualMemory的执行,我们将使用 mhook 库。您可以选择原始库或改进版本。
使用 mhook 库很容易:您需要创建一个与目标函数具有相同签名的钩子,并通过调用Mhook_SetHook来实现它。钩子是通过在函数体上使用jmp指令覆盖函数prolog来实现的。如果您已经使用过钩子,那么您应该没有任何困难。
安全机制
有两种安全机制可以帮助我们缓解堆喷射攻击:数据执行预防和结构化异常处理。
结构化异常处理或 SEH是一种特定于 Windows 操作系统的错误处理机制。当发生错误(例如,除以零)时,应用程序的控制权被重定向到内核,内核会找到一系列处理程序并逐个调用它们,直到其中一个处理程序将异常标记为“已处理”。通常,内核将允许流程从检测到错误的那一刻起继续执行。
从进程的角度来看,DEP 看起来像是在内存执行时出现 EXCEPTION_ACCESS_VIOLATION 错误代码的 SEH 异常。
对于 x86 应用程序,我们有两个陷阱:

DEP可以在系统参数中关闭。
防止堆喷射攻击
现在,让我们开始练习。为了减轻堆喷射攻击,我们将采取以下步骤:
1.形成分配历史
2.检测 shellcode 执行
3.检测喷雾
形成分配历史
为了拦截动态分配内存的执行,我们将 PAGE_EXECUTE_READWRITE 标志更改为 PAGE_READWRITE。
让我们创建一个结构来保存分配:
接下来,我们将为NtAllocateVirtualMemory定义一个钩子。此挂钩将重置 PAGE_EXECUTE_READWRITE 标志并保存已重置标志的分配:
一旦我们设置了钩子,任何带有 PAGE_EXECUTE_READWRITE 位的内存分配都会被修改。当试图将控制权传递给该内存时,处理器将生成一个我们可以检测和分析的异常。
在本文中,我们忽略了多线程问题。然而,在现实生活中,最好单独存储每个流的分配,因为 shellcode 执行预计是单线程的。
检测 shellcode 执行
现在,我们将为 SEH 注册一个处理程序。这就是这个处理程序通常的工作方式:
1.提取触发异常的指令的地址。如果此地址属于我们保存的区域之一,则此异常已由我们的操作触发。否则,我们可以跳过它,让系统继续搜索相关的处理程序。
2.搜索堆喷射。如果动态分配的内存被可疑执行,我们必须对检测到的攻击做出反应。否则,我们需要恢复原样,以便应用程序可以继续工作。
3.使用NtProtect函数 (PAGE_EXECUTE_READWRITE)恢复区域的原始参数。
4.将控制权交还给工艺流程。
下面是一个 shellcode 检测的代码示例:
目前,我们有一种机制可以监控应用程序中的 shellcode,并可以检测其执行时刻。在现实生活中,我们需要再执行两个步骤:
检测堆喷射
使用上面的代码,我们在动态内存执行时停止了一个应用程序,并获得了最新分配的历史记录。我们将使用这些信息来确定我们的应用程序是否受到攻击。让我们探索一下我们的堆喷射检测技术的两个步骤:
用于识别堆喷射的建议算法
我们建议使用所描述的技术并注意以下四个标准,以排除可能会显着减慢您的应用程序的不必要检查:
1.为每个线程定义已保存的内存分配数量。
2.设置已保存内存分配的最小大小。拦截大小为一页的分配将导致不合理地节省内存。堆喷射通常使用为某个应用程序的特定堆管理器选择的巨大值进行操作。数十页和数百页似乎更相关。
3.定义发生异常时将分析的最新分配数。如果我们处理过多的分配,它会降低应用程序的效率,因为对于动态内存的每次执行,我们都必须读取大区域的内容。
4.设置 shellcode 的预期最小大小。如果我们要搜索的代码太小,就会增加误报的数量。
结论
我们探索了一种使用钩子和内存保护机制检测堆喷射攻击的方法。在我们的项目中,这种方法在测试和堆喷射检测过程中显示出出色的效果。
什么是缓冲区啊?
缓冲区溢出好比是将十磅的糖放进一个只能装五磅的容器里…… 堆栈溢出(又称缓冲区溢出)攻击是最常用的黑客技术之一。 我们知道,UNIX本身以及其上的许多应用程序都是用C语言编写的,C语言不检查缓冲区的边界。 在某些情况下,如果用户输入的数据长度超过应用程序给定的缓冲区,就会覆盖其他数据区。 这称作“堆栈溢出或缓冲溢出”。 一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误。 但是,如果输入的数据是经过“黑客”精心设计的,覆盖堆栈的数据恰恰是黑客的入侵程序代码,黑客就获取了程序的控制权。 如果该程序恰好是以root运行的,黑客就获得了root权限,然后他就可以编译黑客程序、留下入侵后门等,实施进一步地攻击。 按照这种原理进行的黑客入侵就叫做“堆栈溢出攻击”。 为了便于理解,我们不妨打个比方。 缓冲区溢出好比是将十磅的糖放进一个只能装五磅的容器里。 一旦该容器放满了,余下的部分就溢出在柜台和地板上,弄得一团糟。 由于计算机程序的编写者写了一些编码,但是这些编码没有对目的区域或缓冲区——五磅的容器——做适当的检查,看它们是否够大,能否完全装入新的内容——十磅的糖,结果可能造成缓冲区溢出的产生。 如果打算被放进新地方的数据不适合,溢得到处都是,该数据也会制造很多麻烦。 但是,如果缓冲区仅仅溢出,这只是一个问题。 到此时为止,它还没有破坏性。 当糖溢出时,柜台被盖住。 可以把糖擦掉或用吸尘器吸走,还柜台本来面貌。 与之相对的是,当缓冲区溢出时,过剩的信息覆盖的是计算机内存中以前的内容。 除非这些被覆盖的内容被保存或能够恢复,否则就会永远丢失。 在丢失的信息里有能够被程序调用的子程序的列表信息,直到缓冲区溢出发生。 另外,给那些子程序的信息——参数——也丢失了。 这意味着程序不能得到足够的信息从子程序返回,以完成它的任务。 就像一个人步行穿过沙漠。 如果他依赖于他的足迹走回头路,当沙暴来袭抹去了这些痕迹时,他将迷失在沙漠中。 这个问题比程序仅仅迷失方向严重多了。 入侵者用精心编写的入侵代码(一种恶意程序)使缓冲区溢出,然后告诉程序依据预设的方法处理缓冲区,并且执行。 此时的程序已经完全被入侵者操纵了。 入侵者经常改编现有的应用程序运行不同的程序。 例如,一个入侵者能启动一个新的程序,发送秘密文件(支票本记录,口令文件,或财产清单)给入侵者的电子邮件。 这就好像不仅仅是沙暴吹了脚印,而且后来者也会踩出新的脚印,将我们的迷路者领向不同的地方,他自己一无所知的地方。 缓冲区溢出的处理你屋子里的门和窗户越少,入侵者进入的方式就越少……由于缓冲区溢出是一个编程问题,所以只能通过修复被破坏的程序的代码而解决问题。 如果你没有源代码,从上面“堆栈溢出攻击”的原理可以看出,要防止此类攻击,我们可以:1、开放程序时仔细检查溢出情况,不允许数据溢出缓冲区。 由于编程和编程语言的原因,这非常困难,而且不适合大量已经在使用的程序;2、使用检查堆栈溢出的编译器或者在程序中加入某些记号,以便程序运行时确认禁止黑客有意造成的溢出。 问题是无法针对已有程序,对新程序来讲,需要修改编译器;3、经常检查你的操作系统和应用程序提供商的站点,一旦发现他们提供的补丁程序,就马上下载并且应用在系统上,这是最好的方法。 但是系统管理员总要比攻击者慢一步,如果这个有问题的软件是可选的,甚至是临时的,把它从你的系统中删除。 举另外一个例子,你屋子里的门和窗户越少,入侵者进入的方式就越少
PE是做什么的
把PE理解成一个:直接光盘运行的、功能强大的、精简版XP系统 Windows PE的全称是Windows Preinstallation Environment,即Microsoft Windows 预安装环境,是一个基于保护模式下运行的Windows XP Professional的工具,只拥有较少(但是非常核心)服务的Win32子系统。 这些服务为Windows安装、实现网络共享、自动底层处理进程和实现硬件验证。 Windows PE 它允许信息技术 (IT) 人员构建自定义的解决方案,通过自动化操作加速桌面部署过程,这样他们只需花更少的时间和精力就可以让桌面保持更新。 Windows PE 能够运行 Windows 安装程序、脚本和映像制作应用程序。 “企业协议(Enterprise Agreement,EA)”和“软件保障成员(Software Assurance Membership,SAM)客户已在 2002 年 10 月的更新中获得了 Windows PE,它将继续作为“软件保证”的一个权益提供给用户。 Windows PE让你创建和格式化硬盘分区,并且给你访问NTFS文件系统分区和内部网络的权限。 这个预安装环境支持所有能用Windows2000和WindowsXP驱动的大容量存储设备,你可以很容易地为新设备添加驱动程序。 支持Fat、Fat32、NTFS系统分区的文件COPY、删除以及分区格式化等操作。 使用Windows PE可以帮助你把现有基于MS-DOS的工具转换为32位的WindowsAPIs,以便你在标准的开发环境(例如微软的VisualStudio)中更加容易地维护这些应用程序。 Windows PE所包含的硬件诊断和其他预安装工具都支持标准的WindowsXP驱动,你无需任何做其他特别的工作。 对于程序开发者来讲,就可以把主要精力放在程序的诊断、调试和开发的环节上
瑞星个人防火墙是什么
就是用来保护你的电脑系统安全,防范和杀死木马,阻挡黑客攻击的。 个人防火墙是为解决网络上黑客攻击问题而研制的个人信息安全产品,具有完备的规则设置,能有效的监控任何网络连接,保护网络不受黑客的攻击。 2008版瑞星个人防火墙具有以下主要新特性:1.防火墙多帐户管理防火墙提供“管理员”和“普通用户”两种帐户。 防火墙提供切换帐户功能可以在两种帐户之间进行切换。 管理员可以执行防火墙的所有功能,普通用户不能修改任何设置、规则、不能启动/停止防火墙、不能退出防火墙。 且普通用户切换到管理员用户需要输入管理员用户的密码。 2.未知木马扫描技术通过启发式查毒技术,当有程序进行网络活动的时候,对该进程调用未知木马扫描程序进行扫描,如果该进程为可疑的木马病毒,则提示用户。 此技术提高了对可疑程序自动识别的能力。 功能调用拦截由于IE提供了公开的Com组件调用接口,有可能被恶意程序所调用。 此功能是对需要调用IE接口的程序进行检查。 如果检查为恶意程序,报警给用户。 4.反钓鱼,防木马病毒网站提供强大的、可以升级的黑名单规则库。 库中是非法的、高风险、高危害的网站地址列表,符合该库的访问会被禁止的。 5.模块检查防火墙能够控制是否允许某个模块访问网络。 当应用程序访问网络的时候,对参与访问的模块进行检查,根据模块的访问规则决定是否允许该访问。 以往的防火墙只是对应用程序进行检查,而没有对所关联的dll做检查。 进行模块检查,防止了木马模块注入到正常进程中,访问网络。
发表评论