安全编程概述课件

上传人:我*** 文档编号:147658808 上传时间:2020-10-12 格式:PPT 页数:57 大小:664.50KB
返回 下载 相关 举报
安全编程概述课件_第1页
第1页 / 共57页
安全编程概述课件_第2页
第2页 / 共57页
安全编程概述课件_第3页
第3页 / 共57页
安全编程概述课件_第4页
第4页 / 共57页
安全编程概述课件_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《安全编程概述课件》由会员分享,可在线阅读,更多相关《安全编程概述课件(57页珍藏版)》请在金锄头文库上搜索。

1、第1章,安全编程概述,简介,现代生活中,计算机的应用已经越来越广泛,给我们的生活带来了巨大的方便。计算机系统的安全问题也越来越受到重视。软件,是组成计算机应用的一个重要部分,当软件由于不安全而遭受攻击,或者运行期间出现错误时,会给用户带来巨大的损失。如犯罪分子利用软件漏洞来获取有价值的信息,用于牟取利益;又如软件因为开发时没有考虑运行时的具体情况,而造成运行的突然崩溃;等等。 面对越来越频繁的软件安全隐患带来的损失,对软件的开发者软件工程师,提出了更高的要求,要求程序员能够编写出错误更加少的程序,并且能够及时修复软件出现的突发问题,切实为软件使用者服务。本书讲解的安全编程技术主要就是针对这些问

2、题进行解决。安全编程,是软件质量的重要保证,在软件开发和程序设计中具有重要地位。 不过,实际的软件工程中,安全隐患的出现往往来源于多个方面,给软件系统带来的危害也是多方面的。安全问题的出现,由于原因众多,而某些安全问题又具有不间断发生,难于调试等特点,因此,很难用一个单纯的理论来完全地阐述安全编程问题。基于这个考虑,安全编程的内容只能针对各个侧面来进行阐述,如异常情况下的安全、线程操作中的安全、数据安全加密等等。,主要针对问题: 软件安全问题出现的原因 软件安全问题的表现 安全问题分类 安全问题详细介绍 本书内容,1.1 软件的安全问题,1.1.1 任何软件都是不安全的,安全问题的典型表现:

3、使用某些交易软件的过程中,某些敏感信息,如个人身份信息、个人卡号密码等信息被敌方获取并用于牟利; 访问某些网站时,服务器响应很慢,或者服务器由于访问量造成负载过大,造成突然瘫痪; 自己的系统中安装了具有漏洞的软件,漏洞没有解决,敌方找到漏洞并对本机进行攻击,造成系统瘫痪 自己花费精力完成了一幅漂亮的风景画,放到网上去,没有考虑版权,被他人随意使用却无法问责; ,因此,对软件的开发提出了两个新的要求: 软件复杂性加强; 可扩展性要求的提高;,软件安全的挑战性 一方面,软件复杂了,安全问题也表现得很复杂,无法得到全面的考虑,而工程进度又迫使开发者不得不在一定时间内交付产品,代码越多漏洞和缺陷也就越

4、来越多; 另一方面,软件的可扩展性要求也越来越高,系统升级和性能扩展成为很多软件必备的功能;可扩展好的系统,由于其能够用较少的成本实现功能扩充,受到开发者和用户的欢迎;但是由于针对可扩展性必须具备响应的设计,软件结构变复杂了,另外,添加新的功能,也引入了新的风险。,怎样解决这些安全问题? 首先,大多数人可以想到的方法是软件测试,通过测试来减少软件中的缺陷。但是,由于软件系统规模越来越大,软件开发的进度要求越来越高,不可能在有限的时间内考虑所有安全方面的问题,即使进行了全方位的测试,也只能对所有的测试案例进行很小范围的覆盖。如下图:,模块A,模块B,模块C,模块A使用模块B和模块C,以黑盒测试为

5、例,如果模块A的输入有X种,模块B的输入有Y种,模块C的输入有Z种,理论上讲,应该对X*Y*Z个组合进行全面的测试。但是,由于工程进度问题,实际上在测试时不可能兼顾全面,往往只是采用了一些具有代表性的测试案例来进行测试,但这些测试案例在设计的时候又不能保证能够具有最全面的代表性。如果想要将所有问题考虑到,除非进行穷举测试,而,这种穷举测试基本上是不可能完成的。,因此,软件测试无法完全保证软件的安全性。一方面是想要实现全面的测试,找出全部的错误,另一方面又要保证工程的进度,早日解决用户的问题,往往无法两全,只能在其中找到平衡点。,关于测试,另一个问题是,全面的测试,一般情况下是针对所有可能出现的

6、隐患进行测试,但是这需要对软件的隐患具有全方位的预见性。而在有些情况下,很多隐患是在运行期间才显露出来的,软件的开发者很难在开发阶段预见到所有可能出现的隐患,容易让测试陷入盲目。 因此,测试只能减少软件安全问题的发生,但是不能完全解决安全问题。业界大都公认一个事实:几乎所有的软件都是带着安全隐患投入运行。,提示: 以网络软件为例,敌方可能通过因特网获得未授权的访问的信息,或者利用软件缺陷来控制用户系统并展开攻击。随着网络应用的更加丰富,用户对网络服务的依赖也相应的增加(如网上银行、网上股票、网上游戏等),这也导致了攻击的方法的增加和复杂化,从而使得安全问题更加凸显出来。而软件工程师无法在开发阶

7、段就预见到全部的攻击,提高了软件开发的难度。所谓“防不胜防”,就是这个道理。,另一个解决安全问题的方法可能就是在测试前就尽量多地解决安全隐患。 在设计、编码阶段,熟练的软件设计人员和软件工程师完全可以尽可能多地将安全问题进行考虑并加以解决。如果在程序设计的时候就能够尽量地考虑安全问题,对软件的安全性也就会有更好的保证,可以大大减小测试的负担。这就是安全编程技术所阐述的内容。 近年来,不管是在应用方面还是在研究方面,安全编程技术越来越受到了重视,本书将针对该话题中的若干方面进行讲述。,1.1.2 软件不安全性的几种表现,软件的不安全性,一般情况下的受害者就是其直接用户。从用户的角度来看,软件的不

8、安全性主要体现在两个方面:,软件在运行过程中不稳定,出现异常现象、得不到正常结果、或者在特殊情况下由于一些原因造成系统崩溃。比如: 由于异常处理不当,软件运行期间遇到突发问题,处理异常之后无法释放资源,导致这些资源被锁定无法使用; 由于线程处理不当,软件运行中莫名其妙得不到正常结果; 由于网络连接处理不当,网络软件运行过程中,内存消耗越来越大,系统越来越慢,最后崩溃; 由于编程没有进行优化,程序运行消耗资源过大;等等。,敌方利用各种方式攻击软件,达到窃取信息、破坏系统等目的。比如: 敌方通过一些手段获取数据库中的明文密码; 敌方利用软件的缓冲区溢出,运行敏感的函数; 敌方利用软件对数据的校验不

9、全面,给用户发送虚假信息; 敌方对用户进行拒绝服务攻击;等等。,通常情况下,大多数安全问题是在软件运行的过程中发生,而负责软件系统运行的技术管理人员或者软件的个人用户,并不是专业的软件开发人员。此时他们往往无法给出直接的应对方案,虽然可以依靠一些简单的方法,如:优化操作系统、优化网络、优化数据库管理系统或者设置额外的操作权限来对付这些剧增的安全问题,但是实际上,这些方法都是治标不治本的方法。此时,软件的生产单位就需要投入大量的成本,来进行软件的维护。,1.1.3 软件不安全的原因,软件出现安全隐患,并造成损失,一方面是由于攻击者的猖獗,但是从开发者角度,几乎都有一个共同的基本原因:那就是由于软

10、件在设计、编码、测试和运行阶段,没有发现软件中的各种漏洞,导致软件的不安全。 从严格的定义上来讲,软件安全隐患一般可以分为两类:错误和缺陷。错误是指软件实现过程出现的问题,大多数的错误可以很容易发现并修复,如缓冲区溢出、死锁、不安全的系统调用、不完整的输入检测机制和不完善的数据保护措施等;缺陷是 一个更深层次的问题,它往往产生于设计阶段并在代码中实例化且难于发现,如设计期间的功能划分问题等,这种问题带来的危害更大,但是不属于编程的范畴。但是业内一般将这两个概念放在一起讲,将错误和缺陷不是划分的绝对清楚,本书也沿袭这一说法。,下面来阐述软件不安全的原因。首先,站在软件的开发者主观的角度,软件的不

11、安全的原因可以归纳为以下几种: 软件的生产没有严格遵守软件工程流程。由于缺乏经验或者蓄意(如片面追求高进度)的原因,软件的设计者和开发者们没有一个统一的管理,可以在软件开发周期的任意时候,随意删除、新增或者修改软件需求规格说明书、威胁模型、设计文档、源代码、整合框架、测试用例和测试结果、安装配置说明书,使得软件的安全性保证大大减弱。,大多数系统软件或其他商业软件,结构都相当大并且复杂,而且由于考虑到软件的扩展性,它们的设计更加巧妙,复杂性可能会更加提高一些。在运行的过程中,这些系统又可以在大量不同的状态之间转换,这个特性使得开发和使用持续正常运行的软件,是一件很困难的事情,更不用说持续安全运行

12、了。面对不可避免的安全威胁和风险,项目经理和软件工程师必须从开发流程做起,让安全性贯穿整个软件开发的始终。就大多数相对成功的软件工程案例而言,如果项目经理和软件工程师针对软件缺陷进行系统的训练,可以避免软件的许多安全缺陷。,编码者没有采用科学的编码方法。在软件开发的过程中没有考虑软件可能出现的问题,仅仅将能够想到的问题停留在实验室内进行解决。实际上,有些程序,在实验室阶段根本不会出现安全隐患,如下代码:,void function(char *input) char buffer16; strcpy(buffer,input); ,表示将input字符串拷贝到buffer中,如果没有考虑缓冲区

13、溢出,即使在开发阶段的测试过程中让这个函数产生缓冲区溢出,也不会产生攻击效果。只有在精心设计之后,才可能对系统造成攻击。因此在开发阶段很难意识到这个问题,使得软件留下安全隐患。,测试不到位(不过有时是无法到位)。主要是测试用例的设计无法涵盖尽可能典型的安全问题。如下的登录表单:,一般测试用例只是设计输入正确的用户名和密码,看能否正常登录;再输入错误的用户名和密码,看能否得到相应的错误提示。但是攻击者如果输入某些和SQL注入有关的值,就有可能在不需要知道用户名和密码的情况下登录到系统,甚至知道系统中的其他信息或对系统中的内容进行修改。,从软件工程客观角度讲,软件的安全性隐患又来源于以下几个方面:

14、 1. 软件复杂性和工程进度的平衡。如前一节所述,软件规模复杂了,不仅仅是编码工作量的提高,更重要的是其中需要考虑的问题更加复杂,测试用例规模也呈指数级增长。但是工程进度只是按照软件规模进行适当的延长,因此很多问题来不及解决,软件带着缺陷投入使用。,2. 安全问题的不可预见性。主要是软件工程师对运行的实际情况的不了解,在测试时作出过于简单的假设。有些问题,包括对软件的功能、输出和软件运行环境的行为状态,或者外部实体(用户,软件进程)的预期输入,都无法完全考虑到。而攻击者有足够的时间进行攻击方法的研究。 3. 由于软件需求的变动。软件规格说明书或设计文档无法一开始就确定下来;在现代软件工程中,很

15、多软件的需求变动,导致其设计本来就是变动的,很多安全问题可能在变动的过程中被忽略。,4. 软件组件之间的交互的不可预见性。如客户可能在运行软件的过程中,自行安装第三方提供的组件,开发者根本无法知道客户的软件将要和谁交互,软件在运行的过程中出现安全问题。,因此,我们可以看到,不管采用了什么样的措施,软件的安全问题都无法完全避免。即使在需求分析和设计时可以避免(如通过形式化方法),或者在开发时可以避免(比如通过全面的代码审查和大量的测试),但缺陷还是会在软件汇编、集成、部署和运行时候被引入。不管如何忠实的遵守一个基于安全的开发过程,只要软件的规模和复杂性继续增长,一些可被挖掘出来的错误和其他的缺陷

16、是肯定存在的。我们所能做的工作就是尽量让安全问题变少,而不能完全消灭安全问题。因此,本书所叙述的“安全编程技术”,不是为了消除安全隐患,而是为了尽量减少安全隐患。,1.2 在软件开发生命周期中考虑安全问题,软件开发生命周期可以有很多模型,如瀑布模型、原型模型等。但是一般说来,软件开发生命周期可以包括以下5个阶段: 分析阶段。软件需求分析,实际上是回答“软件需要完成什么功能”。它的主要工作是,通过研讨或调查研究,对用户的需求进行收集,然后去粗取精、去伪存真、正确理解,最后把它用标准的软件工程开发语言(需求规格说明书)表达出来,供设计人员参考。 该阶段首先是在用户中进行调查研究,和用户一起确定软件需要解决的问题,此阶段的重要工作有:,建立软件的逻辑模型; 编写需求规格说明书文档,根据用户需求,通过不断沟通,反复修改,并最终得到用户的认可; 设计阶段。一般说来,软件设计可以分为概要设计和详细设计两个阶段。该阶段的最终任务是将软件分解成一个个模块(可以是一个函数、过程、子程序、一段带有程序说明的独立的程序和数据,也可以是可组合、可分解和可

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

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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