《软件安全》课件第3章-典型的软件漏洞.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《软件安全》课件第3章-典型的软件漏洞.pptx》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件安全 软件 安全 课件 典型 漏洞
- 资源描述:
-
1、典型的软件漏洞1234目 录CONTENTS缓冲区溢出漏洞Web应用程序漏洞竞争条件数据安全漏洞Part章 节01缓冲区溢出漏洞l 函数栈帧结构l 堆和栈l 函数调用原理l 缓冲区溢出漏洞原理l 栈溢出漏洞l 堆溢出漏洞l 格式化串漏洞l 弥补及防御l 著名漏洞3.1 缓冲区溢出漏洞 一个PE文件(可执行文件)运行过程中,通过层层调用相关函数实现特定功能。C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。同一个进程中的函数栈帧连续存放,这就为缓冲区溢出攻击提供了可能。3.1.1 函数栈帧结构3
2、.1.1 函数栈帧结构函数栈帧分布图ESP:栈指针寄存器(extended stack pointer),其存放的是当前栈帧的栈顶指针。EBP:基址指针寄存器(exteded base pointer),其存放的是当前栈帧的栈底指针。堆在内存中由下向上增长,而栈是向下增长。程序调用过程中,函数的栈帧就存放在栈中,因此函数栈帧是向下增长的。内存中,函数的数据存放在缓冲区中,缓冲区是函数栈帧中的一部分。3.1.2 堆和栈3.1.2 堆和栈堆和栈在进程内存中的分布 进程执行过程中,为主函数分配栈帧,主函数调用其他函数,为它们申请栈帧并存放在主函数栈帧之后,函数再调用其他函数时,就作为母函数为子函数申
3、请栈帧,子函数执行完后按照栈帧中保存的返回地址返回母函数,层层递进之后完成进程功能。3.1.3 函数调用原理进程中的函数调用主要通过以下几个步骤实现:a)参数入栈:将被调用函数的参数按照从右向左的顺序依次入栈。b)返回地址入栈:将call指令的下一条指令的地址入栈。c)代码区跳转:处理器从代码区的当前位置跳到被调用函数的入口处。d)栈帧调整:这主要包括保存当前栈帧状态、切换栈帧和给新栈帧分配空间。3.1.3 函数调用原理3.1.3 函数调用原理函数调用原理 在栈帧中分配有固定的缓冲区空间,当用户输入的数据长度超出缓冲区范围,就有可能覆盖其他有用的数据,从而导致不可预测的情况发生。如果输入的数据
4、经过精心的设计,就可以达到特定的目的,比如植入恶意代码,将函数返回到特定的节点执行,或者执行其他的操作。3.1.4 缓冲区溢出的原理3.1.4 缓冲区溢出的原理 函数栈中存放的一般是函数定义的变量等数据,通过对变量赋值可以实现栈溢出,通过栈溢出覆盖返回函数可使函数返回到特定节点。上述过程虽然理论上能完成栈溢出攻击行为,但是实际上很难实现。操作系统每次加载可执行文件到进程空间的位置都是无法预测的,因此栈的位置实际是不固定的,通过硬编码覆盖新返回地址的方式并不可靠。更普遍的做法是使用跳板。3.1.5 栈溢出漏洞 3.1.5 栈溢出漏洞 和栈不同,堆的数据结构并不是由系统(无论是机器系统还是操作系统
5、)支持的,而是由函数库提供的。基本的malloc/realloc/free函数维护了一套内部的堆数据结构。当调用malloc等函数分配内存空间时,这部分空间就在堆上,对所分配的空间输入数据就可能造成堆溢出,同样的,堆溢出也可以覆盖关键数据。3.1.6 堆溢出漏洞3.1.6 堆溢出漏洞这是一个简单的堆溢出例子,在程序第二次分配内存的时候发生堆溢出(验证环境为Windows 2000)。和栈溢出一样,在精心构造溢出内容后可实现简单的攻击。格式化输出函数是由一个格式字符串和可变数目的参数构成的。在效果上,格式化字符串提供了一组可以由格式化输出函数解释执行的指令。因此,用户可以通过控制格式字符串的内容
6、来控制格式化输出函数的执行。格式化输出函数是一个变参函数,也就是说它接受的参数个数是可变的。变参函数在C语言中实现的局限性导致格式化输出函数的使用中容易产生漏洞。一个转换规范是由可选域(标志、宽度、精度以及长度修饰符)和必需域(转换指示符)按照下面的格式组成的:%标志宽度.精度长度修饰符 转换指示符。3.1.7 格式化串漏洞#include stdio.hmain()int a=44,b=77;printf(a=%d b=%dn,a,b);printf(a=%d b=%dn);3.1.7 格式化串漏洞 第一个 printf调用是正确的,第二个调用中则缺少了输出数据的变量列表。程序输出结果为:a
7、=44,b=77a=4218928,b=44为什么?3.1.7 格式化串漏洞Printf(a=%d,b=%dn);Printf(a=%d,b=%dn,a,b);预防:预防策略可以根据其如何分配空间,进一步分为静态预防策略和动态预防策略。一致的内存管理约定:最有效地防止出现内存问题的方法是在编写内存管理代码时严守纪律。开发团队应该采用个标准的途径并始终如一地应用它。空指针:一个可以减少C和C+程序中漏洞数量的明显技术就是在完成对free)的调用后,将指针置为NULL。3.1.8 弥补及防御检测和恢复:检测和恢复的缓解策略通常要求对运行时环境做出一定的改变,以便可以在缓冲区溢出发生时对其进行检测,
8、从而应用程序或操作系统可以从错误中恢复(或者至少“安全地”失效)。Stackgap:很多基于栈的缓冲区溢出的利用都依赖于一个内存中已知位置的缓冲区。运行时边界检查器:如果不能使用一种类似于Java的类型安全语言,我们还是有可能使用编译器对C程序执行数组边界检查。3.1.8 弥补及防御canaries:canaries是另一种用来检测和阻止栈粉碎攻击的机制。栈粉碎保护器(Propolice):从 Stack guard发展而来的一个流行缓解方法是GCC的栈粉碎保护器(Stack smashing Protector,SSP,也称为 Propolice)Etoh 00。SSP是GCC的一个扩展,可
9、以保护C应用免遭大多数常见形式的栈缓冲区溢出利用,它是作为GCC的中间语言翻译器的形式实现的。3.1.8 弥补及防御莫里斯蠕虫漏洞:它的编写者是美国康乃尔大学一年级研究生罗特莫里斯。这个程序只有99行,利用了Unix系统中的缺点,用Finger命令查联机用户名单,然后破译用户口令,用Mail系统复制、传播本身的源程序,再编译生成代码。最初的网络蠕虫设计目的是当网络空闲时,程序就在计算机间“游荡”而不带来任何损害。当有机器负荷过重时,该程序可以从空闲计算机“借取资源”而达到网络的负载平衡。而莫里斯蠕虫不是“借取资源”,而是“耗尽所有资源”。3.1.9 著名漏洞“云出血”(cloudbleed):
10、据谷歌安全工程师Tavis Ormandy披露,他在做一个业余项目时无意中发现,CloudFlare把大量用户数据泄露在谷歌搜索引擎的缓存页面中,包括完整的https请求、客户端IP地址、完整的响应、cookie、密码、密钥以及各种数据。经过分析,CloudFlare漏洞是一个HTML解析器惹的祸。由于程序员把=错误地写成了=,导致出现内存泄露的情况。就像OpenSSL心脏出血一样,CloudFlare的网站客户也大面积遭殃,包括优步(Uber)、密码管理软件1password、运动手环公司FitBit等多家企业用户隐私信息在网上泄露。3.1.9 著名漏洞Part章 节02Web应用程序漏洞
11、随着传统互联网的普及,云服务和新型移动互联网的兴起,基于Web的应用已成为个人工作、生活和企业业务管理中重要的一部分。Web应用程序的目的是执行可以在线完成的任何有用功能 功能:网上购物、社交网络、银行服务、web搜索、网络存储 安全问题:私密信息被泄露、经济损失、企业失去信誉、服务异常3.2.1 概述 OWASP:open web application security project,开放式Web应用程序安全项目 2017年公布的WEB TOP10安全漏洞:3.2.1 概述安全漏洞安全漏洞A1注入A2失效的身份认证和会话管理 A3XSS A4失效的访问控制 A5安全配置错误A6敏感信息泄
12、露A7攻击检测与防护不足A8CSRFA9使用含有已知漏洞的组件A10未受有效保护的APIWeb应用程序是用不同的编程语言编写的,其面临的威胁也有所不同。按编程语言分类:解释型语言 操作系统命令 本地编译型应用程序按源码类型分类:Java ASP.NET PHP JavaScript3.2.2 受影响的编程语言u 解释型语言 运行时由一个运行时组件解释语言代码并执行其中包含的指令。任何有实际用途的应用程序都会收到用户提交的数据,对其进行处理并执行相应的操作。代码注入漏洞解释器处理的数据:程序员编写的代码+用户提交的数据恶意输入:符合应用程序所使用的解释型语言语法的具有特殊意义的语句原理:攻击者提
13、交精心设计的输入,使得该输入被解释成计划外的程序指令执行3.2.2 受影响的编程语言u操作系统命令 开发者选择使用更高级的技术直接向服务器发送操作系统命令 优势:功能强大、操作简单,并且通常能够立即解决特定的问题 安全缺陷:如果应用程序向操作系统命令传送用户提交的输入,那么就很可能会受到命令注入攻击,由此攻击者能够提交专门设计的输入,修改开发者想要执行的命令。案例:PHP中的exec和ASP中的wscript.shell函数 3.2.2 受影响的编程语言u本地编译型应用程序 许多主要使用托管代码编写的应用程序同样包含本地代码或调用在非托管环境中运行的外部组件 打印机与交换机等硬件设备上运行的W
14、eb应用程序常常使用某种本地代码 其他可能的目标包含:任何其名称(如dll或exe)表示它使用了本地代码的页面或脚本,以及任何已知调用遗留外部组件的功能(如日志机制)。如果认为所攻击的应用程序包含大量的本地代码,那么就有必要对应用程序处理的每个用户提交的数据进行测试包括每个参数的名称与参数值、cookie、请求消息头及其他数据。3.2.2 受影响的编程语言uJava:文件访问 文件与目录的访问p java.io.Filep 构造函数:通过接受一个父目录和文件名,或者一个路径名来获得File实例 路径遍历漏洞:特殊的构造函数参数String userinput=.boot.ini;FileInp
15、utStream fis=new FileInoutSteam(C:temp+userinput);3.2.2 受影响的编程语言2按源码类型分类(1)Java:数据库访问下面这些是常用于以SQL查询任何一个字符串的API:java.sql.Connection.createStatementjava.sql.Statemen.executejava.sql.Statemen.executeQuery 如果用户提交的数据属于以查询执行的字符串的一部分,那么它可能易于受到SQL注人攻击。3.2.2 受影响的编程语言2按源码类型分类(1)Java:数据库访问例如:String username=ad
16、min or 1=1-;String password=foo;Statement s=connection.createStatement();s.executeQuery(SELECT*FROM users WHERE username=+username+AND password=+password+);3.2.2 受影响的编程语言2按源码类型分类(1)Java:数据库访问 它执行不良查询:SELECT*FROM users WHERE username=adminorl=1-AND password=foo3.2.2 受影响的编程语言2按源码类型分类(1)Java:动态代码执行 Jav
17、a语言本身并不包含任何动态评估Java源代码的机制,尽管一些应用(主要在数据库产品中)提供了评估方法。如果所审查的应用程序动态构建任何Java代码,就应该了解应用程序如何构建这些代码,并决定用户可控制的数据是否以危险的方式使用。3.2.2 受影响的编程语言2按源码类型分类(1)Java:OS命令执行执行外部操作系统命令的API:java.lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec例如,下面的代码将运行Windows calc程序:String userinput=calc;Runtime.getRuntime.e
18、xec(userinput)3.2.2 受影响的编程语言2按源码类型分类(1)Java:URL重定向 下面的API用于在Java中发布HTTP重定向:javax.servlet.http.HttpservletResponse.sendRedireotjavax.servlet.http.HttpServ1etResponse.setStatus javax.servlet.http.HttpServ1etResponse.addHeader 通常,使用sendRedirect方法可以引起一个重定向响应,该方法接受一个包含相对或绝对URL的字符串。如果这个字符串的值由用户控制,那么应用程序可能
19、易于收到钓鱼攻击3.2.2 受影响的编程语言2按源码类型分类(1)Java:套接字 .socket类从它的构造函数中提取与目标主机和端口有关的各种信息,如果用户能够以某种方式控制这些信息,攻击者就可以利用应用程序与任意主机建立网络连接,无论主机位于因特网上、私有DMZ中还是在应用程序上运行的内部网络内。3.2.2 受影响的编程语言2按源码类型分类(2)ASP.NET:文件访问 System.IO.File是用于访问ASP.NET文件最主要的类。它的所有方法都是静态的,并且没有公共构造函数。这个类的37个方法全都接受一个文件名作为参数。如果未检查其中是否包含点-点-斜线序,就提交用户可控制的数据
20、,就会造成路径遍历漏洞。例如,下面的代码将打开Windows C:驱动器根目录下的一个文件:string userinput=.boot.ini;FileStream fs=File.Open(C:temp+userinput,FileMode.OpenOrCreate);3.2.2 受影响的编程语言2按源码类型分类(2)ASP.NET:数据库访问 ASP.NET有许多用于访问数据库的API,下面的类主要用于建立并执行SQL语句:System.Data.SqlClient.Sq1CommandSystem.Data.SqlClient.Sq1DataAdapter.System.Data.Od
21、bc.OdbcCommandSystem.Data.01edb.OleDbCommandSystem.Data.Sq1ServerCe.SqlCeCommand3.2.2 受影响的编程语言2按源码类型分类(2)ASP.NET:数据库访问 其中每个类都有一个构造函数,它接受一个包含SQL语句的字符串;而且每个类都有一个commandText属性,可用于获取并设定SQL语句的当前值。如果适当地配置一个命令对象,通过调用Execute方法即可执行SQL语句。它生成的查询等同于:SELECT*FROM users WHERE username=adminor 1=1-3.2.2 受影响的编程语言2按源
22、码类型分类(2)ASP.NET:动态代码执行 VBScript函数Eval接受一个包含VBScript表达式的字符串自变量。该函数求出这个表达式的值,并返回结果。如果用户可控制的数据被合并到要计算值的表达式中,那么用户就可以执行任意命令或修改应用程序的逻辑。函数Execute和ExecuteGlobal接受一个包含ASP代码的字符串,这个ASP代码与直接出现在脚本的代码的执行方式完全相同。冒号分隔符将用于将几个语句连接在一起。如果向Execute函数提交用户可控制的数据,那么攻击者就可以在应用程序中执行任意命令。3.2.2 受影响的编程语言2按源码类型分类(2)ASP.NET:OS命令执行 下
23、面的API可以各种方式在ASP.NET应用程序中运行外部进程:System.Diagnostics.Start.ProcessSystem.Diagnostics.Start.ProcessStartInfo 在对对象调用start之前,可以向静态Process.Star方法提交一个文件名字符串,或者用一个文件名配置Process对象的StartInfo属性。如果文件名字符串可完全由用户控制,那么应用程序几乎可以肯定易于受到任意命令执行攻击。3.2.2 受影响的编程语言2按源码类型分类(2)ASP.NET:URL重定向 下面的API用于在ASP.NET中发布一个HITP重定向:System.W
展开阅读全文