信息安全产品开发实践32700.docx
《信息安全产品开发实践32700.docx》由会员分享,可在线阅读,更多相关《信息安全产品开发实践32700.docx(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、信息安全产品开发实践课程设计报告 缓冲区溢出的保护Evaluation Warning: The document was created with Spire.Doc for .NET.*大学*学院信息安全产产品开发实实践课程设设计报告题 目 缓冲区区溢出的保保护 学生姓名 学 号_ _ 年 级 指导老师 指导老师评评阅意见: 指导老师评评分: 提交时间: 22007年年12月 缓冲区溢出出的保护(软软件工程专专业)学生 学学号 指导教教师 摘要:19999 年年 Buggtraqq(一个讨讨论安全缺缺陷的邮件件列表)进进行的一次次非正式调调查发现,三三分之二的的参与者认认为第一号号的缺陷就
2、就是缓冲区区溢出。从从 19997 年到到 20007 年 33 月,CCERT/CC 发发出的半数数安全警报报都基于缓缓冲区缺陷陷。 面对对如此大的的威胁,我我们需要知知道什么是是缓冲区溢溢出,如何何防止它们们,可以采采用哪些最最新的自动动化工具来来防止它们们以及为什什么这些工工具还不足足够,还有有如何在编编写程序的的程序中防防止它们。关键字:缓缓冲区溢出出;溢出保护护;溢出防御 Detecctionn Of Buffeer Overfflow Absttractt: Fromm an infoormall invvestiigatiion oon Buugtraaq (aa maiil l
3、iist wwhichh disscusss a llimittatioon onn seccuritty) iin 19999, we ccan ffind thatt twoo-parrts partticippantss thooughtt thaat thhe Noo.1 llimittatioon iss bufffer overrfloww. Frrom 11997 to MMay, 20077, allmostt hallf thhe seecuree warrninggs seent bby CEERT/CCC weere bbasedd on the limiitatiion
4、 oof buufferr. Faacingg succh a hugee mennace, we needd to learrn whhat iis thhe buufferr oveerfloow, hhow tto deefendd theem, wwhichh kinnds oof thhe laatestt auttomattizattion toolls wee cann useed foor avvoid themm , wwhy tthesee toools sstilll nott enoough, andd howw to prevvent themm in proggra
5、mmming.Keywoords: Bufffer Overrfloww,Overrfloww Deteectioon, Overrfloww Deffensee 正文1 绪论1.1 立立题背景缓冲区溢出出是当前一一些软件存存在的最常常见的安全全隐患之一一,通过提提供一个恶恶意的输入入黑客可以以改变进程程的执行流流程,缓冲冲区溢出能能够威胁到到整个进程程,机器,甚甚至相关的的系统领域域。如果运运行的进程程是在权限限比较高的的用户下面面,比如aadminnistrratorr或者本地地的系统帐帐户(Loocal Systtem AAccouunt),那么黑客客破坏所导导致的损失失将会很严严重而且
6、将将会面临更更广泛的潜潜在危胁。最最近时期爆爆发的一些些众所周知知的病毒像像,红色代代码病毒和和震荡波蠕蠕虫病毒,都都是C/CC+代码码里存在着着缓冲区溢溢出的结果果。1.2 研研究内容在几乎所有有计算机语语言中,不不管是新的的语言还是是旧的语言言,使缓冲冲区溢出的的任何尝试试通常都会会被该语言言本身自动动检测并阻阻止(比如如通过引发发一个异常常或根据需需要给缓冲冲区添加更更多空间)。但但是有两种种语言不是是这样:CC 和 CC+ 语语言。C 和 C+ 语言言通常只是是让额外的的数据乱写写到其余内内存的任何何位置,而而这种情况况可能被利利用从而导导致恐怖的的结果。更更糟糕的是是,用 CC 和
7、CC+ 编编写正确的的代码来始始终如一地地处理缓冲冲区溢出则则更为困难难;很容易易就会意外外地导致缓缓冲区溢出出。除了 C 和 C+ 使用得 非常广泛泛外,上述述这些可能能都是不相相关的事实实;例如,RRed HHat LLinuxx 7.11 中 886% 的的代码行都都是用 CC 或 CC + 编写的。因因此,大量量的代码对对这个问题题都是脆弱弱的,因为为实现语言言无法保护护代码避免免这个问题题。 在 C 和和 C+ 语言本本身中,这这个问题是是不容易解解决的。该该问题基于于 C 语语言的根本本设计决定定(特别是是 C 语语言中指针针和数组的的处理方式式)。由于于 C+ 是最兼兼容的 CC
8、 语言超超集,它也也具有相同同的问题。存存在一些能能防止这个个问题的 C/C+ 兼容容版本,但但是它们存存在极其严严重的性能能问题。而而且一旦改改变 C 语言来防防止这个问问题,它就就不再是 C 语言言了。许多多语言(比比如 Jaava 和和 C#)在在语法上类类似 C,但但它们实际际上是不同同的语言,将将现有 CC 或 CC+ 程程序改为使使用那些语语言是一项项艰巨的任任务。有些语言存存在允许缓缓冲区溢出出发生的&ldquuo;转义义&rdqquo;子子句。Adda 一般般会检测和和防止缓冲冲区溢出(即即针对这样样的尝试引引发一个异异常),但但是不同的的程序可能能会禁用这这个特性。CC# 一
9、般般会检测和和防止缓冲冲区溢出,但但是它允许许程序员将将某些例程程定义为“不安全的的”,而这样样的代码 可能 会会导致缓冲冲区溢出。因因此如果您您使用那些些转义机制制,就需要要使用 CC/C+ 程序所所必须使用用的相同种种类的保护护机制。许许多语言都都是用 CC 语言来来实现的(至至少部分是是用 C 语言来实实现的 ),并并且用任何何语言编写写的所有程程序本质上上都依赖用用 C 或或 C+ 编写的的库。因此此,所有程程序都会继继承那些问问题,所以以了解这些些问题是很很重要的。 2缓冲区区溢出的概述 2.1 缓缓冲区溢出出的起源内存溢出已已经是软件件开发历史史上存在了了近40年年的“老大难”问题
10、2.2缓冲冲区溢出如如何工作计算机还有有由程序共共享, 随随机访问内内存 (RRAM)。 为了简化化, 内存存管理 WWindoows XXP SPP 2 有有功能控制制当前正在在使用哪段段的 RAAM。 如如果启动程程序, 释释放内存分分配给程序序。 该内存被分分为三段: 代码段段此处存储程程序特定执执行命令。 数据段段此处程序特特定数据存存储。 堆栈是是数据段 (一部分分)此处存储所所有与程序序函数。 这包括参参数、 缓缓冲区存储储本地变量量以及, 最重要、 返回地址址。 返回回地址指定定执行函数数后, 程程序将继续续从。作为是由用用户输入该该信息也注注册作为变变量, 一一切, 发发送到堆
11、栈栈用户类型型。 不通通常, 此此行为不提提出问题。 但是, 如果因编编程错误, 超过缓缓冲区限制制堆栈成为为容易控制制。 整个个段被指定定为本地变变量例如, 如果攻攻击者选择择适当项对对于攻击, 可能会会覆盖用指指令。 此此外, 后后续返回地地址可更改改为指向恶恶意代码。 因此, 程序不再再正常, 但盲目执执行攻击者者的命令。内存的底部部 内存的顶顶部 bufffer1 sfpp reet aa b c - 增长 - . 堆栈的顶部部 堆栈的底底部 许多计算机机处理器,包包括所有 x86 处理器,都都支持从高高位地址向向低位地址址“倒”增长堆栈栈。因此,每每当一个函函数调用另另一个函数数,更
12、多的的数据将被被添加到左左边(低位位地址),直直至系统的的堆栈空间间耗尽。在在这个例子子中,当 mainn() 调调用 fuunctiion1() 时,它它将 c 的值压入入堆栈,然然后压入 b 的值值,最后压压入 a 的值。之之后它压入入 retturn (rett) 值,这这个值在 funcctionn1() 完成时告告诉 fuunctiion1() 返回回到 maain() 中的何何处。它还还把所谓的的“已保存的的帧指针(ssavedd fraame ppointter,ssfp)”记录到堆堆栈上;这这并不是必必须保存的的内容,此此处我们不不需要理解解它。在任任何情况下下, fuunct
13、iion1() 在启启动以后,它它会为 bbuffeer1() 预留空空间,这在在图 1 中显示为为具有一个个低地址位位置。 现在假设攻攻击者发送送了超过 bufffer1() 所能能处理的数数据。接下下来会发生生什么情况况呢?当然然,C 和和 C+ 程序员员不会自动动检查这个个问题,因因此除非程程序员明确确地阻止它它,否则下下一个值将将进入内存存中的“下一个”位置。那那意味着攻攻击者能够够改写 ssfp (即即已保存的的帧指针),然然后改写 ret (返回地地址)。之之后,当 funcctionn1() 完成时,它它将“返回” 不过不不是返回到到 maiin() ,而是返返回到攻击击者想要运
14、运行的任何何代码。 通常攻击者者会使用它它想要运行行的恶意代代码来使缓缓冲区溢出出,然后攻攻击者会更更改返回值值以指向它它们已发送送的恶意代代码。这意意味着攻击击者本质上上能够在一一个操作中中完成整个个攻击!AAlephh On 的文章(请请参阅 参参考资料)详详细介绍了了这样的攻攻击代码是是如何创建建的。例如如,将一个个 ASCCII 00 字符压压入缓冲区区通常是很很困难的,而而该文介绍绍了攻击者者一般如何何能够解决决这个问题题。 除了 smmashiing-sstackk 和更改改返回地址址外,还存存在利用缓缓冲区溢出出缺陷的其其他途径。与与改写返回回地址不同同,攻击者者可以 ssmas
15、hhing-stacck(使堆堆栈上的缓缓冲区溢出出),然后后改写局部部变量以利利用缓冲区区溢出缺陷陷。缓冲区区根本就不不必在堆栈栈上 它可以以是堆中动动态分配的的内存(也也称为“mallloc”或“new”区域),或或者在某些些静态分配配的内存中中(比如“globbal”或“stattic”内存)。基基本上,如如果攻击者者能够溢出出缓冲区的的边界,麻麻烦或许就就会找上你你了。 然然而,最危危险的缓冲冲区溢出攻攻击就是 stacck-smmashiing 攻攻击,因为为如果程序序对攻击者者很脆弱,攻攻击者获得得整个机器器的控制权权就特别容容易 2.3缓缓冲区溢出出分类 22.3.11在程序的的
16、地址空间间里安排适适当的代码码 2.33.1.11殖入法 攻击者用被被攻击程序序的缓冲区区来存放攻攻击代码。 攻击者向向被攻击的的程序输入入一个字符符串,程序序会把这个个字符串放放到缓冲区区里。这个个字符串包包含的数据据是可以在在这个被攻攻击的硬件件平台上运运行的指令令序列。 2.3.11.2利用用已经存在在的代码 有时候,攻攻击者想要要的代码已已经在被攻攻击的程序序中了,攻攻击者所要要做的只是是对代码传传递一些参参数,然后后使程序跳跳转到指定定目标。比比如,在CC语言中,攻攻击代码要要求执行“execc(/bbin/ssh)”,而在llibc库库中的代码码执行“execc(argg)”,其中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息 安全产品 开发 实践 32700
限制150内