复旦大学信息安全课件第8章程序安全与数据库安全
第八章第八章 程序安全与数据库安全程序安全与数据库安全 密码技术,安全协议,计算机病毒防治密码技术,安全协议,计算机病毒防治 注意和考虑程序级安全。注意和考虑程序级安全。 作为对程序安全的一个威胁是计算机病毒,除此之外还存在更多的威胁程序安全的问题。作为对程序安全的一个威胁是计算机病毒,除此之外还存在更多的威胁程序安全的问题。 主要有:主要有: 具有安全隐患的编辑错误,如缓冲区溢出,不完善的访问控制;具有安全隐患的编辑错误,如缓冲区溢出,不完善的访问控制; 恶意代码:计算机病毒,蠕虫,特洛伊木马;恶意代码:计算机病毒,蠕虫,特洛伊木马; 对于程序中本身的缺陷如何避免和消除对于程序中本身的缺陷如何避免和消除,在有问题的情况下,如何尽可能保护资源?在有问题的情况下,如何尽可能保护资源? 程序缺陷分为:有意缺陷和无意缺陷两类,程序缺陷分为:有意缺陷和无意缺陷两类, 有意缺陷又分为:恶意缺陷和非恶意缺陷两类有意缺陷又分为:恶意缺陷和非恶意缺陷两类8.1非恶意的程序漏洞非恶意的程序漏洞 1.缓冲区溢出缓冲区溢出 缓冲区溢出就好像是将大杯水倒入小杯中,肯定会有部分水流出而导致混乱。缓冲区溢出就好像是将大杯水倒入小杯中,肯定会有部分水流出而导致混乱。 缓冲区缓冲区(或数组,字符串或数组,字符串)是存储数据的空间是存储数据的空间,位于内存,它们的容量都是有限的,因此在程序中必须定义缓冲区的最大容量,以使编译器留出所需空间。位于内存,它们的容量都是有限的,因此在程序中必须定义缓冲区的最大容量,以使编译器留出所需空间。 执行过程中,所有程序和数据元素都在内存中,与操作系统、其他代码和常驻共享内存空间,造成四种溢出后果:执行过程中,所有程序和数据元素都在内存中,与操作系统、其他代码和常驻共享内存空间,造成四种溢出后果: 1)额外字符溢出到用户的数据空间,则仅覆盖已存在的变量值额外字符溢出到用户的数据空间,则仅覆盖已存在的变量值(也可能放在未使用的位置也可能放在未使用的位置),影响程序的运行的结果,不影响其他程序或数据,影响程序的运行的结果,不影响其他程序或数据 2)额外字符溢出到用户的程序区域,若覆盖了已执行命令且该命令以后也不再运行,则没有影响;若覆盖了未执行命令,就可能因非法指令而停机。额外字符溢出到用户的程序区域,若覆盖了已执行命令且该命令以后也不再运行,则没有影响;若覆盖了未执行命令,就可能因非法指令而停机。 3)额外字符溢出到系统的数据空间,则仅覆盖已存在的变量值额外字符溢出到系统的数据空间,则仅覆盖已存在的变量值(也可能放在未使用的位置也可能放在未使用的位置),影响程序的运行的结果,但不会影响其他程序或数据,影响程序的运行的结果,但不会影响其他程序或数据 4)额外字符溢出到系统的程序区域,若覆盖了已执行命令且该命令以后也不再运行,则没有影响;若覆盖了未执行命令,就可能因非法指令而停机。额外字符溢出到系统的程序区域,若覆盖了已执行命令且该命令以后也不再运行,则没有影响;若覆盖了未执行命令,就可能因非法指令而停机。 所有的程序都是被操作系统所调用,并且操作系统的运行权限比常规程序高,若能通过伪装成系统程序就可以获得较高权限执行系列命令。所有的程序都是被操作系统所调用,并且操作系统的运行权限比常规程序高,若能通过伪装成系统程序就可以获得较高权限执行系列命令。 攻击者通常会设法造成溢出到系统空间,由此替换系统空间中的代码,这样在其过程调用返回时就可以替换一些指令从而控制操作系统。攻击者通常会设法造成溢出到系统空间,由此替换系统空间中的代码,这样在其过程调用返回时就可以替换一些指令从而控制操作系统。 利用堆栈指针或返回值的寄存器。利用堆栈指针或返回值的寄存器。 子过程的调用是通过堆栈来管理的,子过程的调用是通过堆栈来管理的, 堆栈后到先出堆栈后到先出. 好处是过程调用保存在其中,并且每次调用返回都会将控制权交回给调用前的入口。好处是过程调用保存在其中,并且每次调用返回都会将控制权交回给调用前的入口。 由于在子过程运行时,在堆栈指针所指向的地址中找到并取出参数。由于在子过程运行时,在堆栈指针所指向的地址中找到并取出参数。 攻击者可以通过造成堆栈溢出来改变旧堆栈溢出攻击者可以通过造成堆栈溢出来改变旧堆栈溢出(即改变过程调用环境即改变过程调用环境)或改变返回地址或改变返回地址(这将造成子过程调用返回时,攻击者可以将控制权移交到任何地方这将造成子过程调用返回时,攻击者可以将控制权移交到任何地方)。 攻击者可以将程序的执行重定向到他所希望执行的代码处。攻击者可以将程序的执行重定向到他所希望执行的代码处。 一种溢出是在参数值传递到程序中时发生的。一种溢出是在参数值传递到程序中时发生的。 http:/ 这里这里userinput页面收到了两个参数,值为:页面收到了两个参数,值为:(808)-555-1212和和2004jan02 调用者的浏览器将接受用户从表格中填写的数值,并加密后传送给服务器。调用者的浏览器将接受用户从表格中填写的数值,并加密后传送给服务器。 攻击者若输入一个非常长的电话号码,例如攻击者若输入一个非常长的电话号码,例如500位。位。 开发者通常只分配了开发者通常只分配了15或或20个字节。个字节。 若若500位后,是否会由此造成程序的崩溃?如果崩溃,将是怎样的?是否可以被按照预定的崩溃的方式进行?位后,是否会由此造成程序的崩溃?如果崩溃,将是怎样的?是否可以被按照预定的崩溃的方式进行? 攻击者通常是利用溢出先造成系统的崩溃,然后制造出可控制的故障,从而导致了系统的严重安全隐患。所以必须重视缓冲区溢出问题。攻击者通常是利用溢出先造成系统的崩溃,然后制造出可控制的故障,从而导致了系统的严重安全隐患。所以必须重视缓冲区溢出问题。 2.不完全验证不完全验证 http:/ 如果如果parm2提交的值是提交的值是1800Feb30或或2048Min32将会造成什么后果?将会造成什么后果? 对于不正确的数据系统尝试处理,可能会造成系统故障,或者照常运行而得出错误的结果,如帐单计算,就会出错。对于不正确的数据系统尝试处理,可能会造成系统故障,或者照常运行而得出错误的结果,如帐单计算,就会出错。 采用对提交数据正确性检查,或者通过下拉列表选择,从而避免用户有意或无意的破坏。采用对提交数据正确性检查,或者通过下拉列表选择,从而避免用户有意或无意的破坏。 但是,提交的结果最终是包含在但是,提交的结果最终是包含在URL中进行传递的,而用户特别是攻击者完全可以操作或更改中进行传递的,而用户特别是攻击者完全可以操作或更改URL的,而服务器是无法区分该条信息是来自客户端的浏览器还是用户直接编辑修改的的,而服务器是无法区分该条信息是来自客户端的浏览器还是用户直接编辑修改的URL的,因此,如果提交的数据不进行完善的验证,敏感的数据将处于公开或失控的状态。的,因此,如果提交的数据不进行完善的验证,敏感的数据将处于公开或失控的状态。 电子商务网站,用户可以直接在网站上下订单。电子商务网站,用户可以直接在网站上下订单。 物品,价格等。如某物品物品,价格等。如某物品555A单价单价10元,购买元,购买20个,再加上运费共个,再加上运费共205元,系统将所有这些信息再显示的同时全部传回去:元,系统将所有这些信息再显示的同时全部传回去: http:/ 攻击者可以通过攻击者可以通过URL将价格数值从将价格数值从205改到改到25,。,。 攻击者可以用此方式以任何价格订购物品,直到漏洞被检查出来。攻击者可以用此方式以任何价格订购物品,直到漏洞被检查出来。 漏洞何时被检查出来。如果全世界的人都用此法蜂拥而至此公司购物,那公司将马上发现问题。但个别用户,只要公司没有感到利润的明显下降,就很少会被发现,直到某天核账。漏洞何时被检查出来。如果全世界的人都用此法蜂拥而至此公司购物,那公司将马上发现问题。但个别用户,只要公司没有感到利润的明显下降,就很少会被发现,直到某天核账。 运行的代码中还有多少类似的隐患?运行的代码中还有多少类似的隐患? 解决的方法是对浏览器产生的信息增加有密钥的信息鉴别,使得他人修改后无法产生相应的鉴别码。解决的方法是对浏览器产生的信息增加有密钥的信息鉴别,使得他人修改后无法产生相应的鉴别码。 3.“检查时刻到使用时刻”的漏洞检查时刻到使用时刻”的漏洞 一位顾客购买物品,检查了该物品后,即包装后去柜台付款,回来后将凭证交给营业员后拿着物品回家。在进行检查后到拿走之前这段时间,情况可能发生变化。一位顾客购买物品,检查了该物品后,即包装后去柜台付款,回来后将凭证交给营业员后拿着物品回家。在进行检查后到拿走之前这段时间,情况可能发生变化。 在计算机系统中同样有可能会发生类似事件。由于现代处理器和操作系统为了提高效率经常改变指令和程序的执行顺序,相邻指令在执行时不一定是相邻的。在计算机系统中同样有可能会发生类似事件。由于现代处理器和操作系统为了提高效率经常改变指令和程序的执行顺序,相邻指令在执行时不一定是相邻的。 如果有一个访问修改请求:“将第如果有一个访问修改请求:“将第4位改为位改为A”。经过检查通过并被授权放入到操作队列中。经过检查通过并被授权放入到操作队列中。 由于已经被检查过,在以后调用时就不会再检查,而此时在排队过程时将此命令改为“删除某文件”由于已经被检查过,在以后调用时就不会再检查,而此时在排队过程时将此命令改为“删除某文件”,则将造成严重后果。则将造成严重后果。 这就是所谓“检查时刻到使用时刻”的漏洞这就是所谓“检查时刻到使用时刻”的漏洞 阻止此攻击的方法是数字签名和鉴别。为了防止私钥泄露而造成后果,就可通过阻止此攻击的方法是数字签名和鉴别。为了防止私钥泄露而造成后果,就可通过PKI的密钥撤销列表来解决。的密钥撤销列表来解决。 4.三种漏洞的联合使用三种漏洞的联合使用 攻击者可能会利用缓冲区溢出来破坏机器上的运行代码,同时利用“检查时刻到使用时刻”的漏洞来添加一个新的系统用户。然后以新用户的身份登录系统并利用不完整的参数检验漏洞来获得一定权限或做其他破坏系统的事情。攻击者可能会利用缓冲区溢出来破坏机器上的运行代码,同时利用“检查时刻到使用时刻”的漏洞来添加一个新的系统用户。然后以新用户的身份登录系统并利用不完整的参数检验漏洞来获得一定权限或做其他破坏系统的事情。8.2 恶意代码恶意代码 恶意代码可以看成为系统中的潜伏者,是以破坏为目的的一类程序,它可能是正在运行的程序的全部或部分,由代理编制。恶意代码可以看成为系统中的潜伏者,是以破坏为目的的一类程序,它可能是正在运行的程序的全部或部分,由代理编制。 所谓代理是指,编写该类程序的作者,或是将程序引入系统的人所谓代理是指,编写该类程序的作者,或是将程序引入系统的人 有些恶意代码具有传染性,即为计算机病毒,而某些则不具有传染功能,即该系统受到攻击植入了恶意代码后,该系统不会传染给其他系统。下面主要讨论不具有传染性的恶意代码。有些恶意代码具有传染性,即为计算机病毒,而某些则不具有传染功能,即该系统受到攻击植入了恶意代码后,该系统不会传染给其他系统。下面主要讨论不具有传染性的恶意代码。 1.陷门陷门 陷门陷门trapdoor是通往某个模块的入口,在文档中没有该入口的记录。是通往某个模块的入口,在文档中没有该入口的记录。 陷门在代码开发期间加入,其目的可能是为了测试软件模块,或为将来模块的修改和功能增强提供陷门在代码开发期间加入,其目的可能是为了测试软件模块,或为将来模块的修改和功能增强提供hook(钩子钩子),或作为系统失效时提供的一个特别通道。,或作为系统失效时提供的一个特别通道。 当程序成为产品后,陷门可使程序员进入程序。当程序成为产品后,陷门可使程序员进入程序。 例如:通常采用系统的、有组织的、模块化的方式进行开发和测试例如:通常采用系统的、有组织的、模块化的方式进行开发和测试 一般,系统的每个小组件最先测试,即所谓的单元测试一般,系统的每个小组件最先测试,即所谓的单元测试(unit testing)确保