信息安全原理与实践_第二版11_软件缺陷和恶意软件

上传人:xmg****18 文档编号:120108407 上传时间:2020-02-03 格式:PPT 页数:44 大小:3.43MB
返回 下载 相关 举报
信息安全原理与实践_第二版11_软件缺陷和恶意软件_第1页
第1页 / 共44页
信息安全原理与实践_第二版11_软件缺陷和恶意软件_第2页
第2页 / 共44页
信息安全原理与实践_第二版11_软件缺陷和恶意软件_第3页
第3页 / 共44页
信息安全原理与实践_第二版11_软件缺陷和恶意软件_第4页
第4页 / 共44页
信息安全原理与实践_第二版11_软件缺陷和恶意软件_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《信息安全原理与实践_第二版11_软件缺陷和恶意软件》由会员分享,可在线阅读,更多相关《信息安全原理与实践_第二版11_软件缺陷和恶意软件(44页珍藏版)》请在金锄头文库上搜索。

1、1 Information Security Principles and Practice 2nd Edition 美 Mark Stamp著 张 戈译 第11章 软件缺陷和恶意软件 2 11 1 引言 本章主要内容 非故意的软件缺陷以及因此而引发的安全问题 恶意软件 基于软件的攻击类型 3 11 2 软件缺陷 软件缺陷无处不在 NASA火星登陆者探测器 共耗资1 65亿美元 最终却由于某个软件错误导致在着 陆火星的过程中直接撞毁 丹佛机场的行李装卸系统 该软件中的bug致使机场投入使用的时间比预期晚了11 个月之久 据保守估计 商业软件中bug的数量大约会在平均每1000行代码 LOC 0

2、 5个的水平 一些系统中代码行数的近似值 4 在本节中 我们将注意力集中在程序缺陷上面 这些缺陷属于无心之 失造成的软件bug 其中蕴含着安全问题 缓冲区溢出 竞态条件 不完全仲裁 恶意软件 错误 error 是由人为导致的bug 程序过错 fault 则是软件内部的问题 而系统故障或失效 failure 是从外部可以观测到的现象 例子 int main int buffer 10 buffer 20 37 5 11 2 1 缓冲区溢出 假设Web表单请用户输入数据 比如姓名 年龄 出生日期等等 被 输入的信息随后被传送到一台服务器上 而这台服务器会将 姓名 字 段中输入的数据写入可以容纳N个

3、字符的缓冲区中 如果服务器软件 没有去验证以确保输入的姓名的长度至多为N个字符的话 就会发生 一次缓冲区溢出 任何溢出的数据都可能会覆盖掉某些重要的数据 进而会导致系统崩 溃 或是线程吊死 这种情况发生的可能性是相当大的 例子 缓冲区和布尔标志位 如果缓冲区溢出覆盖了布尔标志位存储的内存位置 Trudy就能够将值 F 也就是二进制 的0值 替换为 T 也就是二进制的1值 这样该软件就会相信Trudy已经通过了认证 6 存储器结构及组织方式 标识为 text 的区域用于装载代码 而标识为 data 的 区域则用于保存静态变量 heap 堆 用于保存动态数据 而stack 栈 可以被视 为处理器的

4、 便签簿 动态变化的局部变量 要传递给函数的参数以及一 次函数调用的返回地址等都会被保存在堆栈 stack 中 栈顶指针 Stack Pointer SP 标识出了栈顶的 位置 栈的增长是自底向上的 而堆的增长是自上向下的 7 1 堆栈溢出 堆栈溢出特指一种颇具破坏性的攻击方式 这种攻击依赖于缓冲区溢出 对于堆栈溢出攻击 Trudy的兴趣集中在处于函数调用过程中的堆栈 当函数执行时 堆栈用于为其中的数组缓冲区提供空间 另外 堆栈中 还保持了返回地址 当函数执行完毕后 程序可以重新恢复控制并由此 继续向下执行 请注意 缓冲区的位置在堆栈中返回地址的位置之上 也就是说 缓冲区在返回地址之后才被压入

5、到堆栈当中 于是 如果缓 冲区发生溢出 那么溢出的数据将会覆盖原来的返回地址 正是由于这 个关键事实 才使得缓冲区溢出攻击如此致命 8 如果Trudy溢出了缓冲区 使得返回地址被一些随机的二进制位值覆盖 那么当被调用的函数执行完毕时 程序将会跳转到随机的内存位置 如图11 5的图解所示 在这种情况下 最有可能的结果就是程序崩溃 9 通过多次试错 Trudy可能会将原来的返回地址重写为缓冲区的起始地 址 这样一来 程序将会尝试 执行 存储在缓冲区中的数据 所以 如果Trudy能够将可执行的代码作为 数据 填充到缓冲区中 那么 Trudy就能够在受害者的计算机上执行这些代码 图11 6中所示的图解

6、 说明了这种精巧版本堆栈溢出攻击的原理 10 从Trudy的角度来看 实施这种堆栈溢出攻击还存在几个困难 n 首先 Trudy可能不会知道被她插入到缓冲区中的恶意代码的精确地址 n 其次 她可能也不会知道堆栈中返回地址的精确位置 有两个简单的技巧可以使缓冲区溢出攻击变得要容易实现得多 n 其一 就是Trudy可以在注入的恶意代码之前填充NOP形式的 登录垫 n 其二 她可以多次重复地插入所期望的返回地址 译者注 这种方式同样 可以扩大地址猜测的命中窗口 从而能够提高命中率 图11 7中给出了这种改进后的堆栈溢出攻击的图解说明 11 要想使缓冲区溢出攻击能够成功 显而易 见 首先程序必须包含缓冲

7、区溢出的缺陷 另外 要知道并不是所有的缓冲区溢出 都可以被利用 而只有那些可以令Trudy 将代码注入系统中的溢出才有利用价值 2 堆栈溢出攻击的例子 假设Trudy正面临某个应用程序的质询 程序需要她输入一个序列号 而Trudy并不知道这个序列号 如图11 8中所示 当Trudy运行这个程序 之后输入了不正确的序列号 时 该程序就会停止并且不再提供任何更多的信息 然后 Trudy尝试敲入非正常的输入值 想看看这个程序会作何反应 图11 9中呈现的结果表明这个程序存在缓冲区溢出问题 通过对相应报错消息进行仔细分析 Trudy意识到她已经使用字符A精 确地覆盖了保存返回地址的两个字节 12 然后

8、 Trudy就对exe可执行文件进行反汇编 于是就得到了图11 10 中呈现的汇编代码 在这段代码当中 最重要的信息就是字符串 Serial number is correct 在代码中这个字符串出现位置的地址是 0 x401034 如果Trudy能够利用地址0 x401034覆盖掉原来的返回地址 那么该程序就会跳转到 Serial number is correct 于是她就已经获 得了对该程序的使用权 而无须知道有关正确序列号的任何信息 13 但是 Trudy不能直接输入十六进制的地址以充当序列号 因为这样的 输入值会被解释为ASCII码文本 于是 Trudy查找ASCII码表 据此 找到

9、值0 x401034在ASCII码中的表示是 P4 通过对错误消息进行仔细检查 可以看出错误发生的地址是0 x341040 显然 Trudy让程序跳转到了这个地址 而不是她预期的地址 0 x401034 所以 Trudy对她之前的攻击稍作调整 使用地址值 0 x341040 也就是ASCII 码中的 4P 来覆盖程序中的返回地址 14 为了完整性起见 我们给出了这个软件的C程序源代码bo c以及相应的 可执行文件bo exe Trudy无需访问上面的源程序代码 就已经能够完成缓冲区溢出攻击 在这个缓冲区溢出攻击的例子中 Trudy并没有在堆栈中执行代码 她 只不过是覆盖了函数返回地址而已 据此

10、使得程序跳转执行本已存在某 特定地址上的程序代码 return to libc攻击 也被称为 返 回库函数 攻击 15 3 堆栈溢出攻击的预防 n 一种方法就是从软件中消除所有的缓冲区溢出 但是 这个方法听起来不错 做起来却要难得多 n 另一种解决方案是 当缓冲区溢出发生时检测到此种过错的发生 并随之做 出相应的反应 n 还有一种选择就是不允许代码在堆栈当中执行 对于许多基于堆栈的缓冲区溢出攻击来说 最小化它们所致危害的一种 简单方法就是令堆栈为不可执行空间 即不允许代码在堆栈中执行 有一些硬件 以及许多操作系统 支持这个 no execute 选项或是NX标志 位 利用NX标志位 内存将会被

11、设置标识 从而使得代码无法在某些 特定的位置执行 通过这种方式 堆栈 以及堆和数据存储区 就可以获 得保护 以免受很多缓冲区溢出攻击之苦 使用安全的编程语言 诸如Java或C 之类 将有助于从源头就消除大 部分的缓冲区溢出 16 运行时堆栈检查可以用于防止堆栈溢出攻击 在这种解决方案中 当 返回地址从堆栈中弹出时 会对其进行检查以确定没有发生改变 这 一点可以通过在将返回值压入堆栈之后立刻压入某个特定的值到栈顶 来实现 当Trudy试图覆盖掉返回值时 她就必须要首先覆盖掉这个特定的值 这样就提供了一种用于检测堆栈的途径 这个特定的值就是通常所说 的canary 金丝雀 图11 13中显示了利用

12、canary值作为堆栈溢出检测手段的图解 17 canary值可以是常量 也可以是依赖于返回地址的值 有时候会使用 特殊的常量0 x000aff0d 这个常量包含0 x00作为首个字节 任何溢出 到某个缓冲区并且包含0 x00的字符串 都将在这个点上被终止 于是 就不会再有更多的堆栈空间被覆盖 微软公司在其C 编译器当中增加了用于支持canary值的特性 任何 使用 GS编译器选项进行编译的程序都会使用canary值来检测运行时 的缓冲区溢出 对于最小化缓冲区溢出攻击造成的影响 还有另一选择 就是所谓的 地址空间布局随机化 ASLR 这种技术已经被用于最新的Windows 操作系统以及几个其他

13、的现代操作系统 不过在实践中 相对而言只有很少数的 随机化 地址空间布局被投入 应用 18 4 缓冲区溢出 结语 l 在过去的这几个10年当中 对于每一个10年 缓冲区溢出都可以当之 无愧地被称为 10年攻击 l 鉴于缓冲区溢出攻击自20世纪70年代以来已为人们所熟知这一事实 通过利用NX标志位的方法 通过使用安全的程序设计语言 以及通过 使用ASLR技术等方式 还是有可能对大部分的此类攻击做到防患于 未然的 19 11 2 2 不完全仲裁 C语言函数strcpy buffer input 的定义是将输入字符串input中的内容复制到数 组buffer中 正如我们在前面已经了解到的 如果inp

14、ut的长度大于buffer的长 度 就会发生缓冲区溢出 为了防止这样的缓冲区溢出 程序必须对输入值 进行合法性验证 具体方式就是在尝试将数据写入到buffer中之前 要先检查 input的长度 如果无法做到这一点 那么这就是不完全仲裁 incomplete mediation 的例子 例子 如果服务器不去确认输入的有效性 那么Trudy也能够得到与上面相同的订单 但却是以特价商品的超低价格共付款25美元就完成了交易 而不是基于合 理价格的205美元 20 11 2 3 竞态条件 在理想情况下 安全处理过程应该是原子的 atomic 意思是说 相 关的处理操作应该一气呵成 如果安全处理过程是分阶

15、段进行的 那 么所谓的竞态条件 race conditions 就有可能出现在安全过程各阶段执 行的临界点上 竞态条件 意指 这是一种攻击者和处理过程中下一执行阶段之间的 一次 竞赛 虽然实际上这并不像是一场竞赛 毕竟对于攻击者来说 精打细算并拿捏好分寸才是最重要的 例子 mkdir命令设定的工作方式 21 11 3 恶意软件 恶意软件可以被划分为许多不同的类型 病毒 virus 这是一种依赖于其他人或物才能够从一个系统蔓延至另一个 系统的恶意软件 迄今为止 病毒都是最为流行的一种恶意软件形式 蠕虫 worm 这种恶意软件与病毒类似 不同的是它们具有自我繁衍和传 播的能力 而不需要外界的辅助

16、这个定义意味着蠕虫是通过网络来扩散 和传染的 特洛伊木马 trojan horse 或者简称为木马 这种恶意软件看起来像是正 常的软件 但实际上却内含了意想不到的不法功能 后门 trapdoor或backdoor 这种恶意软件会允许开启对某个系统的非授 权访问 rabbit 这是一种意图耗尽系统资源的恶意程序 间谍软件 spyware 这是一种特殊类型的恶意软件 它们可以监控键盘 敲击行为并进行记录 译者注 这是一种盗取用户口令的方法 可以盗取 数据或文件 或是执行一些与此类似的活动 22 引导扇区病毒 boot sector viruses 驻留在引导扇区中 能够在系统 启动过程的初期便接管控制 然后 就可以步步为营 在有可能被检 测到之前就先行掩盖自身的踪迹 另外一类病毒是所谓的 内存驻留 memory resident 型病毒 意思是 说这类病毒驻留在内存里 对于这种病毒 有必要通过重新启动系统 的方式将其刷出内存 例子 Brain病毒 莫里斯蠕虫病毒 红色代码 Code Red 病毒 SQL Slammer病毒等 23 11 3 1 Brain病毒 1986年的Brain病毒除

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号