第六章 缓冲区溢出(计算机与网络安全)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
几种典型的防护工具简介
StackGuard
几种典型的防护工具简介
几种典型的防护工具简介
Libsafe
基于操作系统截获有可能存在漏洞的库函数的 系统调用,如gets,strcpy等,使用相应函数的 替换版本来实现原来的函数功能。
这种方法不需要操作系统的任何修改并对所有 己经存在的二进制程序适用。这种方法不需要 修改有缺陷程序的源代码,不需要重新编译。 而且它可以在系统中广泛、透明地实现。
堆栈溢出攻击的必要条件如下:
C语言不做数组边界检查,因此可以溢出缓冲区。 改写函数的返回地址(特殊指针),改变程序的执行
流程。
堆栈可执行,以便执行精心编织的代码 程序员编写的应用程序有漏洞,使攻击得以成功。 以上是对于基于stack的缓冲区溢出,下面我们看
看基于堆的缓冲区溢出。
64
基于BSS段的溢出
缓冲区溢出攻击的防范措施
编写正确的代码和代码审计
C/C++不是为安全设计的开发工具,安全问题是 每个C/C++程序员的责任。
最简单的方法就是搜索源代码中容易产生漏洞的 库函数的调用,
开发了一些高级的查错工具,
fault injection,目的在于通过人为随机地产生一些 缓冲区溢出来寻找代码的安全漏洞。
而从发布到用户打上补丁,这段时间内攻击 给用户造成的损失就更没有办法估计
溢出攻击原理
堆和堆栈
Stack:与heap不同,它是由编译器自动来来分配和释放的。当主程序中调用 函数时,函数就将它自己的变量、外部环境等存储在堆栈中。当函数调用结束 后呢,他再从堆栈中探出,返回到主程序的下一跳指令。
实例
但可以设定堆栈数据段不可执行
缓冲区溢出攻击的防范措施
改进C语言函数库
C语言中存在缓冲区溢出攻击隐患的系统函数有 很多,如gets (),sprintf(),strcpy()
百度文库以开发出更安全的封装了若干已知的易受堆 栈溢出攻击的库函数
bell实验室开发的Iibsafe,通过操作系统截获对 某些不安全的系统函数调用,并对调用进行安 全检查,执行安全的库函数来防止缓冲区溢出 攻击。
计算机与网络安全
第六章 缓冲区溢出攻击
概述
缓冲区
内存中存放数据的地方 包含相同数据类型的实例的一个连续计算机内
存块,它保存了给定类型的数据
缓冲区溢出
覆盖函数的返回地址空间且其执行者具有root 权限
函数缺乏边界检查机制
strcpy()、strcat()、sprintf()、vsprintf()、 gets()、scanf()、fscanf()、sscanf()、 vscanf()、vsscanf()和vfscanf()等
ITS4通过对源码执行模式匹配,寻找已知可能危险 的模式。
缓冲区溢出攻击的防范措施
非执行的缓冲区
在内核中作特殊设置,使得堆栈段、堆和数据 段没有执行权限
攻击者并不一定要向缓冲区中植入攻击代码来 实现缓冲区溢出的攻击,所以这种方法还是存 在弱点的
近来的Unix和MS Windows系统为实现更好的 性能和功能,往往在数据段中动态地放入可执 行的代码。所以为了保持程序的兼容性不可能 使得所有程序的数据段不可执行。
数组边界检查
对数组进行边界检查,使超长代码不可能植 入, 因此完全没有了缓冲区溢出攻击产生 的条件
目前有以下的几种检查方法
Compaq C编译器
支持有限度的边界检查。只有显示的数组引用才被 检查,比如“a[3]”会被检查,而“*(a十3)”则不 会。
由于所有的C数组在传送的时候是指针传递的,所 以传递给函数的数组不会被检查。
Libsafe概述
libsafe 2.0是由著名的Bell实验室研制的。 当操作系统启动时,先把libsafe预装入。对于被
libsafe保护的库函数,就会存在两个分别在libsafe 和标准c libsafe截获调用请求并用两种方式来处理这种清求。
一种是在调用之前检查有漏洞的函数(如strcpy, strcat等) 是否存在栈溢出攻击:
在C语言中利用指针进行数组操作和传递是非常频 繁的,因此这种局限性是非常严重的。
Jones & Kelly的C语言数组边界检查
实现对C程序完全的数组边界检查。
由于没有改变指针的含义,所以被编译的程序和其 他的gcc模块具有很好的兼容性。当然,付出的性 能上的代价是巨大的。
对于一个频繁使用指针的程序,如向量乘法,将由 于指针的频繁使用而使速度慢30倍。
示例
void overflow (char *input) {
char buf[20]; strcp(buf,input); }
攻击历史
1988 年,Morris ,蠕虫病毒利用fingerd程序的缓冲区溢出 漏洞
2001年7月,名为“红色代码”的蠕虫病毒利用微软 IIS Web Server 中的缓冲区溢出漏洞使300,000 多台计算机受 到攻击
这个编译器目前还很不成熟, 一些复杂的程序还 不能在这个上面编译、执行通过。
缓冲区溢出攻击的防范措施
程序指针完整性检查
对C/C++编译器进行改进,在函数返回地址或 者其他关键数据、指针之前放置守卫值或者存 储返回地址、关键数据或指针的备份,然后在 函数返回的时候进行比对
堆栈保护
通过检查函数活动记录中的返回地址来实现。在每 个函数中,加入了函数建立和销毁的代码。
2004 年 5 月爆发的“网络天空”、“振荡波”病毒,以及 2005年 8 月被称为历史上最快利用微软漏洞进行攻击的“狙 击波”等病毒。
攻击历史
据 Microsoft Security Response Center (微软安全响应中心)估计,发布一个安全 报告以及一些相关的补丁程序大约需要耗资 100,000美元
另一种是在被调函数(如scanf和printf函数)执行过程中检 查是否存在格式化串攻。这在很大程度上防止了缓冲区溢 出的攻击。
指针保护
通过在所有的代码指针之前放置附加字节来检验指 针在被调用之前是否被修改,如被修改,会发出报 警信号和退出程序的执行,如同堆栈保护一样。
使用类型安全语言
所有的缓冲区溢出漏洞都源于C语言的类型 安全。如果只执行类型安全的操作,这样就 不可能出现对变量的强制操作。如果作为新 手,可以推荐使用具有类型安全的语言,如 JAVA。但是作为Java执行平台的Java虚拟 机是C程序。因此攻击JVM 的一条途径是使 JVM 缓冲区溢出。因此在系统中采用缓冲 区溢出防卫技术来使用强制类型安全的语言 可以收到很好的效果。
2003年1月,“Slammer”蠕虫利用微软SQL Server2000 中的缺陷,使得韩国和日本的部分Internet崩溃,中断了芬兰 的电话服务,并使美国航空订票系统,信用卡网络和自动柜员 机运行缓慢
2003 年蔓延的“冲击波”病毒利用了 Windows 系统的 DCOM RPC 缓冲区溢出漏洞