【IT168 技术文章】
现今,软件安全性已成为一个越来越不容忽视的问题,提起它,人们往往会想起一连串专业性名词:“系统安全性参数”、“软件事故率”、“软件安全可靠度”、“软件安全性指标”等等,它们可能出现在强制的规范性文档中的频率比较多,但却不一定能在开发过程中吸引开发者的眼球。几乎每一个程序员都或多或少的在项目维护时遭遇过自己软件的安全性bug,这种经历使我们有幸在一个设计严谨而又性能良好的系统平台上工作时,都会对其大为感叹:“那真是一段很棒的代码!”这是因为,专业的软件设计开发人员会重视软件的安全性,而不仅仅把它当做是书面字眼。在这里本文将通过对软件安全性概念的引入,以及对软件安全性各阶段的任务的介绍和如何通过软件测试来验证是否完成了软件安全性目标,较全面的阐述软件安全性对软件质量起的重要作用。首先,应该从加固对软件安全性的认识开始。
一、 软件安全性分析的重要性
“安全性分析”(safety analysis)是一种系统性的分析,应在研发过程的早期开始进行,用于确定产品在每一个使用模式中执行其功能的方式,识别潜在的危险,预计这些危险对人员及(或)设备可能造成的损害,并确定消除危险的方法。其中对于计算机系统来说,安全性分析的一项重要内容是“软件安全性分析”,这是对软件程序进行的一种分析,以保证程序在其设计的运行环境中,不会引起(或可以容忍的小概率引起)或诱发对人员或设备的危害。例如多级火箭一级点火、二级点火指令如果错了,火箭就会失败。但只要对火箭指令及传递机构采取足够的防错设计,错发指令的概率就可以小到能容忍的程度。如果各关键项目的开发单位能从软件安全性这方面重视“安全”这个题目,那么项目的安全性链条就不会轻易地由于诸如小数点错位的原因而断开。
在软件和信息系统的开发过程中,由于技术难度高,项目复杂,开发周期短而带来的一系列困难,潜伏安全性隐患的几率其实是很大的。现代化的软件本身变得越来越复杂,开发一个软件产品或一个大型系统所需要依靠的技术也越来越多样化,需要考虑的问题也越来越多,例如,开发团队需要在研发开始前就确定好软件系统能够承受的出事概率。很多软件开发的组织由于没有掌握和利用必要的控制软件安全性的技术,无法妥善解决相应的问题,把时间耗费在事后补救上,使得开发的效率大为降低,产品的质量大打折扣,甚至因为某个关键错误的发生,导致产品的信誉度降低,更严重的结果则会导致生命财产安全的损失。如果你发现有关安全性的要求已经出现在安全相关软件项目的合同书或任务书中,并提出软件安全性分析的范围和任务,那么说明已经需要开始进行软件安全性分析的准备了。
二、 软件安全性分析的指导原则
如果将软件安全性分析作为一项目标明确的项目去做,从管理的角度分为五个阶段,每个阶段有不同的任务需要完成。
启动和范围确定:在安全相关软件的合同或任务书中应提出软件安全性分析的范围和要求。实施方明确责任,管理者检查必备的资源(包括人员、技术、基础设施和时间安排),确保软件安全性分析的开展;
策划:软件安全性分析管理者应制定安全性分析计划,该计划可作为所属软件过程或活动的计划的一部分。
执行和控制:管理者应监控由软件安全性分析计划规定的任务的执行。管理者应控制安全性分析进展并对发现的问题进行调查、分析和解决(解决方案有可能导致计划变更)。
评审和评价:管理者应对安全性分析及其输出的软件产品进行评价,以便使软件安全性分析达到目标,完成计划。
结束(收尾阶段):管理者应根据合同或任务书中的准则,确定软件安全性分析的是否完成,并应核查软件安全性分析中产生的软件产品和记录是否完整。
上文将软件安全分析在一个典型的项目中各个阶段所要做的工作做了一个总结,每个阶段都有侧重的工作重点。我们在实际工作中,应调动所有有关人员,努力完成各阶段的任务。
三、 软件安全性分析的任务
根据上面所总结的各阶段需要做的安全分析重点,可以相应地总结出以下七种需要做的分析工作。在这里为抛砖引玉,再对相应的应用分析技术作一些介绍:
1. 软件需求安全性分析——对分配给软件的系统级安全性需求进行分析
做软件需求安全性分析需要对分配给软件的系统级安全性需求进行分析,规定软件的安全性需求,保证规定必要的软件安全功能和软件安全完整性。
评测人员需要根据软件安全性分析准备的结果和系统的初步结构设计文档,包括系统分配的软件需求、接口需求,完成对系统安全性需求的映射,以安全相关性分析和对软件需求的安全性评价。有了这些积累,评测人员才有把握对软件在系统中的安全性需求作出一个综合性的评价,更好地提交对后续的软件设计和测试的建议。
2. 软件结构设计安全性分析——评价结构设计的安全性,以保证软件安全功能的完整性
从安全角度讲,软件结构设计是制定软件基本安全性策略的阶段,因为这一阶段负责定义主要软件部件,以及它们如何交互,如何获得所要求的属性,特别是安全完整性,是软件安全性需求在结构定义中实现的阶段。对结构设计进行安全性分析要做到将全部软件安全性需求综合到软件的体系结构设计中,确定结构中与安全性相关的部分,并评价结构设计的安全性。
结构设计是开发人员对系统期望功能和功能实现方式的表示方法,但是沟通的一致性,和设计的合理性,通常会影响到安全完整性,这里可以借助一些技术来验证:用动画/仿真技术证实功能的实现状态;借助接口分析技术分析安全相关部件与其他部件的相互依赖关系和独立性。等等。
3. 软件编程安全性分析——选择合适的编程语言
所有编程语言无论在其定义还是在其实现中都有其不安全性。这通常汇号称程序员对语言的误用,而对这些误解,一些相对开放的语言又缺乏相应的解释。现举例如下:
a) 未初始化的变量。除非进行特别的检查,否则单元测试不会发现他们。而这将导致,一个程序在不同的环境下虽然运行成功,但运行结果却不是期望值。
b) 当要求重新分配存储器的调用时应予以检查,以确保不仅释放指针而且释放该结构所用的存储器。
c) 运算符优先级的规则,一些语言的要求并不是那么严格,容易是程序员发生误解。
如果某种语言有精确的定义(也有完备的功能性),从逻辑上说是清晰的,有易管理的规模和复杂度,那么就认为这个语言适用于安全相关性软件。使用编程语言时,也应该针对该语言的特点,努力满足安全性要求。
如果一种编程经验或编程风格因为能够提高软件安全性而被公认为专用性编码标准,可以选择这样一种编码标准来约束对不安全语言的使用。编码标准对程序员的编程修养和对语言正确使用是有指导意义的。MISRA协会在1994年发布了它的软件开发指南,在其中特别指出了为考虑安全集成度而做出的语言、编译器和语言特性的选择。MISRA要求使用“标准化结构化语言的受限子集”,其对语言检查的严格性已经使该规范应用在一些安全要求很高的系统相关代码上。
软件安全性浅析
发布时间: 2008-9-11 18:07 作者: 未知 来源: 网络转载
字体: 小 中 大 | 上一篇 下一篇 | 打印 | 我要投稿 | 每周一问,答贴有奖
4. 软件详细设计安全性分析——设计实现是否符合安全性要求
软件详细设计进一步细化高层的体系结构设计,将软件结构中的主要部件划分为能独立编码、编译和测试的软件单元,并进行软件单元的设计。
在这一阶段中,需要依据软件需求、结构设计描述、软件集成测试计划和之前所获得的软件安全性分析的结果,对软件的设计和实现阶段是否符合软件安全性需求进行验证。
相关软件单元应进一步细化设计以便于编码。所以,我们应该分析:
a) 软件详细设计是否能追溯到软件需求;
b) 软件详细设计是否已覆盖了软件安全性需求;
c) 软件详细设计是否与软件结构设计保持了外部一致性;
d) 软件详细设计是否满足模块化、可验性、易安全修改的要求。
软件详细设计是直接关系到编码的关键一环,软件详细设计安全性分析更相关整个软件的安全性。所幸的是,众多前辈们总结了许多可以提高软件安全性的手段和技术,这些经验经过长期验证,多数已经成为标准的参考:
设计逻辑分析:评价软件设计的方程式、算法和逻辑,可以包括失效检测/诊断、冗余管理、变量报警和禁止命名逻辑的检测。
设计约束分析:给出一些约束,来评价软件在这些约束下运行的能力。比如:物理时间约束和响应时间对软件性能的检查。
复杂性度量:高度复杂的数据结构难以彻底测试,可以采用McCabe或Halstead等这样一些复杂性评估技术来标示出需要进一步改进的区域。等等。
5. 软件编码安全性分析——完成安全相关软件的编码活动
软件编码完成软件详细设计的实现。所以,代码应该体现软件详细设计所提出的设计要求,实现设计过程中开发的安全性设计特征和方法,遵循设计过程中提出的各种约束以及编码标准。
我们一般采用代码走查或采用静态检查工具来检查源代码,依照软件编码安全性分析对代码的要求,应该主要从以下几个方面入手:
a) 分析软件代码是否能追溯到需求;
b) 分析软件代码是否符合支持工具和编程语言分析;
c) 分析软件代码是否满足模块化、可验证、易安全修改的要求;
d) 分析软件编码中所使用技术的安全性和方法的合理性。
下面列出一些可用于提高代码安全性的相关技术。
代码逻辑分析:如有不可达代码,或代码结构过于复杂,维护性降低。通过实施逻辑重构、方程式重构和存储器解码来进行。
代码数据分析:关注如何定义和组织数据项。变量忘记赋初值,或变量声明了却没有使用,或出现了冗余代码。
复杂性度量:复杂软件不稳定,也经不起不可预测的行为。所以,我们努力使软件的复杂度变小。如果有条件采用某种自动化工具,可以通过工具对软件设计或/和代码进行控制,用图形化的方法反映出软件结构中的控制流和数据流,通过连结数/调用数、节点数、嵌套深度等这样一些结构关系的检查,获得复杂度的度量,将会获得很好的效果。
6. 软件测试安全性分析——保证软件安全性
软件测试作为验证软件功能性和安全性的重要手段,其采用的测试方法和测试技术也完全关系着测试结果的准确性,关系着后续软件的变更和测试的有效性。
软件测试安全性分析既包括事前分析,又包括对测试结果的评价,所以一般从不同角度进行按步骤的测试:
a) 分析测试集中的所有测试用例,测试是否通过测试准则。
b) 测试代码是否按照要求分析,并达到相应的测试覆盖率。测试覆盖是指检查代码的每一个状态和路径。
c) 对测试结果进行分析,以验证所有的安全性需求是否得到了满足。
软件测试已渐渐占据软件开发40%以上的时间,由此可见软件测试的重要性。合理的软件测试手段的应用对于提高软件安全性是有很大的促进作用的,关于如何运用软件测试来验证软件安全性是否达到目标,我们将在下文详细探讨。
7. 软件变更安全性分析——应对可能出现的软件变更
在执行任何软件变更之前,应建立软件变更规程。如果必须进行软件变更,则因该对已经受控的规格说明、需求、设计、编码、计划、规程、系统、环境、用户文档的任何变更都进行安全性分析。
软件变更安全性分析一般根据变更的原因、变更影响、变更可能会导致的结果将这项任务安排为三个阶段。
需要注意的是,我们的目的是确保软件的质量在经过变更后达到了预定的目标,而不是有所倒退。
四、 运用软件测试提高软件安全性
据美国一家公司的统计表明,在查找出的软件错误当中,属于需求分析和软件设计的错误约占64%,属于程序编写和其他原因的错误占36%,由于一部分错误很可能因为复审过程中没有被发现而转入下一个阶段,导致在错误的基础上产生了更多的错误,形成错误的“放大效应”。事实上,开发工作中的每一个环节都可能出现问题,那些没发现或已“放大”的错误修复成本都是非常高的。所以,测试这种专门针对软件错误的技术渐渐被人们重视,它已成为保证软件安全性的一项重要手段。现今,测试投入也在整个开发投入中占了很大比重。但仍有很多测试人员在面对不同的软件测试对象、众多软件测试方法,对自己手中的项目应该采取什么样的测试手段,才能达到效果明显的目的不很明了。总的来说,测试经过有计划的安排才有意义,开始于模块层的功能验证,并跟随软件的抽象和整体性最终到了系统验证的阶段。当然,就算对一个不算太大的项目而言,要想实现“完全测试”也是不太可能完成的,所以,对每一个层次的测试而言,要做的工作都是做好测试计划,了解现阶段的测试目标,努力提高我们的软件安全性。
针对软件安全性的测试方法就是采用各种方法来验证或发现系统安全方面的问题。对于软件需求说明书上既定的有关安全的功能需求,我们要一一进行验证测试。对于没有在软件需求书上标明的可能影响系统运行安全的隐性需求我们也要努力的发现。除了被动发现系统已遭受破坏的隐患和原因,在主动发现方面,我们最基本和最主要的是要采取静态分析技术和功能测试两种方式拦截系统开发时存在的漏洞。
静态分析技术:其基本特征是不执行被测试软件,而对需求分析说明书、软件设计说明书、源程序作结构检查、流图分析等找出软件错误。
这里,需求和设计追溯和确认是验证测试的前提,我们可以利用一些自动化工具画出功能需求的相关关系图,以及一些系统结构的UML图,能够使测试人员与开发人员保持一致的设计思路。
源程序的结构检查和流图分析一般是测试人员代码审查时的重要工作,对于查出前期的软件错误非常有效,现在很多开发单位都采用自动化测试,取代了冗长的代码审查会议,提升了测试的效率和准确度。比较著名的工具有英国PRQA公司的产品,它对检查一些代码逻辑错误、无法执行到的代码段和违反通用编程规范的行为非常有效。
功能测试:功能测试是动态测试的一种方式,验证的是软件的功能实现。比如在网络信息系统进行自身安全建设时,我们会在软件设计和开发过程中,增加一些必要的安全防护措施,如权限管理模块、数据恢复功能等等,我们就会通过功能验证来检查我们是否达到了没有安全疏漏的要求。
总之,软件安全性测试是要将软件测试人员放置在一个相对主动的位置上,能够尽力避免被动发现系统漏洞。
五、 软件安全性分析的前景
在前进的道路上,风险是不可避免的,多一条可供选择的道路,就会多增加一份风险系数。在计算机技术飞速发展的今天,我们不可避免地会面临降低风险还是躲避风险两种选择。将必要风险降低是提高系统安全性的最重要和最积极的方法,所以,必须从研发的开始阶段到项目最终评估受审阶段,始终以安全完整性为目标,使系统满足必须实现的功能达到或维持安全状态所必需的安全功能。
软件安全性分析任务包含于软件生存周期的若干活动中,是针对软件的安全性质量,作为这些活动的补充。软件安全性分析作为开发中软件的质量的重要保证,关系到软件的获取、供应、开发、运行和维护,已得到专业人士的高度重视。并且现在,软件安全性分析任务的各项细节执行都写入了国军标,被安全相关软件的需方、供方、开发者、维护者以及独立的评价者使用。规范化将推进软件安全性分析的进程,使更多的开发和评测单位遵循标准化文件,督促开发团队采取相应的技术手段,以软件测试作为辅助。同样,软件安全性分析标准也会在推进的过程中,得到不断地发展。相信,软件的安全性会随着标准化一起前进!