缓冲区溢出:定义、攻击、类型等

缓冲区溢出
图片由 tonodiaz 在 Freepik 上提供

当内存缓冲区中存储的数据量超过其存储限制时,就会发生缓冲区溢出,也称为缓冲区溢出。应用程序在尝试将数据复制到缓冲区的过程中会覆盖附近的内存位置。在本文中,我们将了解缓冲区溢出攻击、类型和漏洞 

缓冲区溢出 

缓冲区溢出是一种软件编码错误或漏洞,黑客可以利用它来获得对公司系统的未经授权的访问。它是最著名的软件安全漏洞之一,但仍然相当常见。部分原因是它可以通过多种方式发生,并且用于防止它们的技术通常容易出错。

软件错误主要集中在缓冲区上,缓冲区是计算内存的连续部分,在数据在位置之间传输时临时保存数据。也称为缓冲区溢出,当边界中的数据量超过其存储容量时,就会发生缓冲区溢出。这些额外的数据会溢出到相邻的内存位置,并损坏或覆盖这些位置中的数据。

缓冲区溢出攻击 

当黑客操纵编码缺陷以破坏受感染的系统并执行有害操作时,就会发生缓冲区溢出攻击。攻击者修改程序的执行路径以破坏现有文件或泄露数据。它们还重写应用程序的部分内存。

编程语言违规和覆盖缓冲区边界是缓冲区溢出攻击的常见组成部分。关于数据数量或组成的错误假设以及内存操作是缓冲区溢出的主要原因。

缓冲区溢出攻击如何运作?

通常,攻击者将恶意代码与精心构建的输入数据相结合,以利用目标系统中的软件缺陷。通过操纵缓冲区并导致其溢出,恶意代码使攻击者能够运行该代码。

攻击者必须首先找到易受攻击的软件程序或系统,然后再创建旨在利用该漏洞的数据有效负载以执行缓冲区溢出攻击。有效负载由网络或基于 Web 的攻击媒介传递,包括网络钓鱼网站或电子邮件。 

目标系统接收到有效负载后,软件程序将进行处理并尝试将传入数据保存在缓冲区中。如果边框太小而无法容纳数据,则代码将按预期运行;否则会溢出。

接管系统后,攻击者可能决定窃取机密信息、干扰正常业务或访问网络上的其他系统。为了阻止这些攻击,必须采取防火墙和入侵检测系统等安全措施以及常规软件更新。

过去的缓冲区溢出攻击 

让我们来看看历史上一些著名的缓冲区攻击实例。

  • 2 年 1988 月 XNUMX 日,莫里斯蠕虫(也称为 Internet 蠕虫)是首批引起主流媒体广泛关注的计算机蠕虫之一。 Morris蠕虫攻击利用了多个漏洞,包括UNIX sendmail(使用后门)、finger(通过越界)和rsh/rexec。它还能够猜测弱密码。此外,它还能够猜测弱密码。 
  • 2014 年 XNUMX 月,由于缓冲区溢出攻击,索尼影视娱乐公司的计算机系统遭受严重破坏。攻击者窃取了敏感数据,包括未发行的电影以及员工和名人的个人信息。
  • 2011 年 200,000 月发生了针对花旗银行的缓冲区溢出攻击,黑客获得了大约 2.7 名客户的姓名、地址和账号。有了这些信息,攻击者就能够从银行窃取超过 XNUMX 万美元。
  • 2021 年 XNUMX 月,Libgcrypt 开发人员在程序中发现严重的基于堆的缓冲区溢出漏洞后发布了安全补丁更新。由于这个问题,攻击者可以瞄准机器并编写他们想要的任何代码。

避免缓冲区溢出的方法

通过在代码中包含安全预防措施或利用 编程语言 通过内置的安全性,开发人员可以防范缓冲区溢出漏洞。运行时保护是当代操作系统的另一个特征。典型的保障措施有以下三种:

  • 采用剥削性 SEH 覆盖方法。从功能上来说,基于堆栈的缓冲区溢出用于覆盖保存在线程堆栈上的异常注册记录,以完成 SEH 覆盖。
  • 仅靠操作系统保护和代码安全措施是不够的。组织需要快速采取行动修复受影响的软件,并确保用户在发现溢出边界问题时可以获得补丁。
  • 地址空间随机化 (ASLR) 随机打乱数据区域的地址空间。一般来说,这些攻击需要了解可执行代码的位置,而当地址空间是随机生成时,这几乎是不可能的。
  • 数据执行防护通过将特定内存位置标记为可执行或不可执行来防止攻击在不可执行区域中执行代码。

缓冲区溢出的漏洞

目标的操作系统和体系结构决定了黑客采用的缓冲区溢出攻击策略。然而,它们传输给软件的附加信息可能会包含恶意代码,这使攻击者能够启动更多命令并发起更多活动。 

例如,向程序添加新代码可以指示它执行新操作,从而允许攻击者访问 IT系统 该公司的。如果攻击者知道程序的内存布局,他们可能能够有目的地输入缓冲区无法包含的数据。他们将能够通过使用恶意代码替换存储在内存区域中的可执行代码来获得控制权。

缓冲区溢出类型 

攻击者利用各种缓冲区溢出技术来利用公司内部的系统。最典型的是:

#1.基于堆栈的缓冲区溢出

最流行的缓冲区溢出攻击类型就是这种。使用基于堆栈的技术,攻击者可以将包含恶意代码的数据传递给应用程序,然后应用程序将其保存在堆栈缓冲区中。这使攻击者可以通过覆盖堆栈上的所有内容(包括返回指针)来控制传输。

#2.基于堆的缓冲区溢出

执行基于堆的攻击比基于堆栈的攻击更难。这种类型的攻击会导致程序内存溢出,超出其运行时功能所需的内存。

#3。格式化字符串攻击

当应用程序将输入数据作为命令处理或无法正确检查输入数据时,就会发生格式字符串漏洞。这种类型使攻击者能够运行代码、访问堆栈中的数据以及创建应用程序分段错误。这可能会引发其他事件,危及系统的稳定性和安全性。 

缓冲区溢出漏洞 

攻击者利用缓冲区溢出来控制机器、执行任意代码并篡改 Web 应用程序的执行堆栈。 Web 服务器和应用程序服务器都可能存在缓冲区溢出漏洞,特别是在使用图形库等库的 Web 应用程序中。漏洞应用程序的编码也可能包含缓冲区溢出缺陷。这更有可能是因为它们更难被利用,被黑客发现的可能性较小,并且受到安全专业人员的关注较少。

缓冲区溢出漏洞通常会在代码出现以下情况时发生:

  • 依赖外部数据来控制其行为
  • 依赖于超出其直接范围强制执行的数据属性
  • 如此复杂以至于程序员无法准确预测其行为

缓冲区溢出的后果

以下是缓冲区溢出攻击的典型结果:

  • 系统崩溃:通常,这种攻击会导致系统崩溃。它还可能导致程序进入无限循环并导致可用性不足。
  • 失去访问控制:这种攻击经常使用任意代码,这些代码通常超出应用程序安全法规的参数。
  • 其他安全问题:攻击者可能会使用这种导致任意代码执行的攻击来闯入其他系统并损害其他安全措施。

什么是缓冲区溢出的示例? 

例如,依赖于外部数据并使用“gets()”函数从堆栈缓冲区获取数据的代码可能会导致直接的缓冲区溢出。用户输入的字符必须少于“BUFSIZE”,以确保代码安全,因为系统无法限制该函数可以读取的数据量。

缓冲区溢出是Ddos攻击吗? 

最典型的 DDoS 攻击是缓冲区溢出攻击。尽管某些编程语言比其他语言更容易受到攻击,但它们会影响几乎所有应用程序和 Web 服务器。

缓冲区溢出的原因是什么? 

编程语言违规和覆盖缓冲区边界是缓冲区溢出攻击的常见组成部分。关于数据数量或组成的错误假设以及内存操作是超出边界的主要原因。

status_stack_buffer_overrun 是什么意思?

虽然一开始它暗示堆栈缓冲区溢出,但我之前已经指出 STATUS_STACK_BUFFER_OVERRUN 并不一定表明这一点。当状态代码后来扩展为暗示“程序自触发异常终止”时,为时已晚。 

使用哪些工具来检测缓冲区溢出?

他们可能会在执行之前或之后验证您的代码,因为它们要么是静态的,要么是动态的。检测超出边界的工具包括 Fuzzing、AddressSanitizer 和 Valgrind。

哪种调试器最适合缓冲区溢出?

例如,您可以使用 gdb、lldb 或 Visual Studio Debugger 等调试器检查程序的内存布局、寄存器、堆栈和堆。要查找并报告内存问题,您还可以使用内存调试器,例如 Dr. Memory、AddressSanitizer 或 Valgrind。

参考文献

0股
发表评论

您的电邮地址不会被公开。 必填带 *

你也许也喜欢