缓冲区溢出(Buffer Overflow)

原文地址:https://www.imperva.com/learn/application-security/buffer-overflow/
什么是缓冲区溢出
缓冲区是内存存储区域,可在数据从一个位置传输到另一个位置时临时保存数据。当数据量超过内存缓冲区的存储容量时,就会发生缓冲区溢出(或缓冲区溢出)。因此,尝试将数据写入缓冲区的程序会覆盖相邻的内存位置。

例如,登录凭证的缓冲区可能被设计为期望输入 8 个字节的用户名和密码,因此如果事务涉及 10 个字节的输入(即比预期多 2 个字节),程序可能会写入多余的数据超出缓冲区边界。

缓冲区溢出会影响所有类型的软件。它们通常由格式错误的输入或未能为缓冲区分配足够的空间造成。如果事务覆盖可执行代码,则可能导致程序行为不可预测并生成错误结果、内存访问错误或崩溃。

在这里插入图片描述
缓冲区溢出示例

什么是缓冲区溢出攻击
攻击者通过覆盖应用程序的内存来利用缓冲区溢出问题。这会改变程序的执行路径,触发破坏文件或暴露私人信息的响应。例如,攻击者可能会引入额外的代码,向应用程序发送新指令以访问 IT 系统。

如果攻击者知道程序的内存布局,他们可以故意提供缓冲区无法存储的输入,并覆盖保存可执行代码的区域,用自己的代码替换它。例如,攻击者可以覆盖一个指针(一个指向内存中另一个区域的对象)并将其指向一个漏洞利用负载,以获得对程序的控制。

缓冲区溢出攻击的类型
基于堆栈的缓冲区溢出更为常见,并且利用仅在函数执行期间存在的堆栈内存。

基于堆的攻击更难实施,并且涉及将为程序分配的内存空间泛滥到当前运行时操作使用的内存之外。

哪些编程语言更容易受到攻击?
C 和 C++ 是两种非常容易受到缓冲区溢出攻击的语言,因为它们没有内置的保护措施来防止覆盖或访问内存中的数据。Mac OSX、Windows 和 Linux 都使用用 C 和 C++ 编写的代码。

PERL、Java、JavaScript 和 C# 等语言使用内置的安全机制,可最大限度地减少缓冲区溢出的可能性。

如何防止缓冲区溢出
开发人员可以通过代码中的安全措施或使用提供内置保护的语言来防止缓冲区溢出漏洞。

此外,现代操作系统具有运行时保护。三种常见的保护措施是:

地址空间随机化 (ASLR) — 在数据区域的地址空间位置周围随机移动。通常,缓冲区溢出攻击需要知道可执行代码的位置,而随机化地址空间使得这几乎不可能实现。
数据执行预防——将内存的某些区域标记为不可执行或可执行,从而阻止攻击在不可执行区域中运行代码。
结构化异常处理程序覆盖保护 (SEHOP) —有助于阻止恶意代码攻击结构化异常处理 (SEH),这是一种用于管理硬件和软件异常的内置系统。因此,它可以防止攻击者利用 SEH 覆盖利用技术。在功能层面上,SEH 覆盖是通过使用基于堆栈的缓冲区溢出来覆盖存储在线程堆栈上的异常注册记录来实现的。
代码和操作系统保护方面的安全措施还不够。当组织发现缓冲区溢出漏洞时,它必须迅速做出反应以修补受影响的软件,并确保软件用户可以访问补丁。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值