软件安全性浅析
前言
现今,软件安全性已成为一个越来越不容忽视的问题,提起它,人们往往会想起一连串专业性名词:“系统安全性参数”、“软件事故率”、“软件安全可靠度”、“软件安全性指标”等等,它们可能出现在强制的规范性文档中的频率比较多,但却不一定能在开发过程中吸引开发者的眼球。几乎每一个程序员都或多或少的在项目维护时遭遇过自己软件的安全性bug,这种经历使我们有幸在一个设计严谨而又性能良好的系统平台上工作时,我们都会对其大为感叹:“那真是一段很棒的代码!”这是因为,专业的软件设计开发人员会重视软件的安全性,不仅仅把它当做是书面字眼。在这里本文将通过对软件安全性概念的引入,以及对软件安全性各阶段的任务的介绍和如何通过软件测试来验证是否完成了软件安全性目标,较全面的阐述软件安全性对软件质量起的重要作用。首先,我们从加固对软件安全性的认识开始。
一、软件安全性分析的重要性
“安全性分析”(safety analysis)是一种系统性的分析,应在研发过程的早期开始进行,用于确定产品在每一个使用模式中执行其功能的方式,识别潜在的危险,预计这些危险对人员及(或)设备可能造成的损害,并确定消除危险的方法。其中一项重要内容是“软件安全性分析”,这是对软件程序进行的一种分析,以保证程序在其设计的运行环境中,不会引起(或可以容忍的小概率引起)或诱发对人员或设备的危害。例如多级火箭一级点火、二级点火指令如果错了,火箭就会失败。但只要对火箭指令及传递机构采取足够的防错设计,错发指令的概率就可以小到能容忍的程度。
在软件和信息系统的开发过程中,由于技术难度高,项目复杂,开发周期短而带来的一系列困难,潜伏安全性隐患的几率其实是很大的。现代化的软件本身变得越来越复杂,开发一个软件产品或一个大型系统所需要依靠的技术也越来越多样化,需要考虑的问题也越来越多,例如,我们需要在研发开始前就确定好软件系统能够承受的出事概率。很多软件开发的组织由于没有掌握和利用必要的控制软件安全性的技术,无法妥善解决相应的问题,把时间耗费在事后补救上,使得开发的效率大为降低,产品的质量大打折扣,甚至因为某个关键错误的发生,导致产品的信誉度降低,更严重的结果则会导致生命财产安全的损失。如果你发现有关安全性的要求已经出现在安全相关软件的合同书或任务书中,并提出软件安全性分析的范围和要求,那么说明你们已经开始了进行软件安全性分析的准备。
二、软件安全性分析的指导原则
我们将软件安全性分析作为一项目标明确的项目去做,从管理的角度分为五个阶段,每个阶段有不同的任务需要完成。
启动和范围确定:在安全相关软件的合同或任务书中应提出软件安全性分析的范围和要求。实施方明确责任,管理者检查必备的资源(包括人员、技术、基础设施和时间安排),确保软件安全性分析的开展;
策划:软件安全性分析管理者应制定安全性分析计划,该计划可作为所属软件过程或活动的计划的一部分。
执行和控制:管理者应监控由软件安全性分析计划规定的任务的执行。管理者应控制安全性分析进展并对发现的问题进行调查、分析和解决(解决方案有可能导致计划变更)。
评审和评价:管理者应对安全性分析及其输出的软件产品进行评价,以便使软件安全性分析达到目标,完成计划。
结束(收尾阶段):管理者应根据合同或任务书中的准则,确定软件安全性分析的是否完成,并应核查软件安全性分析中产生的软件产品和记录是否完整。
终上所述,我们将软件安全分析在一个典型的项目中各个阶段所要做的工作做了一个总结,你可以看到软件安全分析在各阶段的重点是什么。我们在实际工作中,则要调动所有有关人员,努力完成各阶段的任务。
三、软件安全性分析的任务
根据上面所总结的各阶段需要做的安全分析重点,我们可以总结出以下七种需要做的工作。在这里为抛砖引玉,再对相应的一些分析技术作一些介绍:1.软件需求安全性分析——对分配给软件的系统级安全性需求进行分析
做软件需求安全性分析的目的是要保证规定必要的软件安全功能和软件安全完整性。
我们需要根据软件安全性分析准备的结果和系统的初步结构设计文档,包括系统分配的软件需求、接口需求,产生后续软件安全分析的输入信息,和对后续的软件设计和测试的建议。
2.软件结构设计安全性分析——评价结构设计的安全性,以保证软件安全功能
的完整性
结构设计安全性分析的目的是将全部软件安全性需求综合到软件的体系结构设计中,确定结构中与安全性相关的部分。
软件结构设计安全性分析可产生后续软件安全性分析的输入信息,可提出对后续的软件设计和测试的建议。应当在软件结构设计评审中评审软件结构设计安全性分析的结果,并将之提供给进行中的系统安全性分析活动。
3.编程软件安全性分析——选择合适的编程语言
所有编程语言无论在其定义还是在其实现中都有其不安全性。计算机语言的发展趋势证明,新的编译语言总是会修正老一代语言的不足之处。程序员可能会误解语言构造的作用,而对这些误解,一些相对开放的语言又缺乏相应的解释。
4.软件编码安全性分析——完成安全相关软件的编码活动
软件编码完成软件详细设计的实现。所以,代码应该体现软件详细设计所提出的设计要求,实现设计过程中开发的安全性设计特征和方法,遵循设计过程中提出的各种约束以及编码标准。
我们一般采用代码走查或采用静态检查工具来检查源代码,依照软件编码安全性分析对代码的要求,应该主要从以下几个方面入手:
a)分析软件代码是否能追溯到需求;
b)分析软件代码是否符合支持工具和编程语言分析;
c)分析软件代码是否满足模块化、可验证、易安全修改的要求;
d)分析软件编码中所使用技术的安全性和方法的合理性。
下面列出一些可用于提高代码安全性的相关技术。
代码逻辑分析:如有不可达代码,或代码结构过于复杂,维护性降低。通过实施逻辑重构、方程式重构和存储器解码来进行。
代码数据分析:关注如何定义和组织数据项。变量忘记赋初值,或变量声明了却没有使用,或出现了冗余代码。
复杂性度量:复杂软件不稳定,也经不起不可预测的行为。所以,我们努力使软件的复杂度变小。如果有条件采用某种自动化工具,可以通过工具对软件设计或/和代码进行控制,用图形化的方法反映出软件结构中的控制流和数据流,通过连结数/调用数、节点数、嵌套深度等这样一些结构关系的检查,获得复杂度的度量。
5.软件测试安全性分析——保证软件安全性
软件测试作为验证软件功能性和安全性的重要手段,其采用的测试方法和测试技术也完全关系着测试结果的准确性,关系着后续软件变更和测试有效性。
为保证我们做有效测试,我们应分层次地进行测试:软件单元测试、软件集成测试、软件合格性测试、系统集成测试、系统合格性测试。如果可能,系统层次的测试还需要与硬件开发者做紧密地配合。
软件测试安全性分析既包括事前分析,又包括对测试结果的评价,所以我们一般分步骤进行如下测试:
a)分析测试集中的所有测试用例,测试是否通过测试准则。
b)测试代码是否按照要求分析,并达到相应的测试覆盖率。测试覆盖是指
检查代码的每一个状态和路径。
c)对测试结果进行分析,以验证所有的安全性需求是否得到了满足。
关于应用相关技术完成相关软件的测试安全性分析,在软件测试和软件集成阶段我们一般采用的技术/措施有:
概率测试;功能和黑盒测试;
动态分析和测试;性能测试;
数据记录和分析;接口测试。
在系统集成阶段,则一般采用功能和黑盒测试,以及性能测试。
四、软件安全性分析的前景
在我们前进的道路上,风险是不可避免的,多一条可供选择的道路,就会多增加一份风险系数。在计算机技术飞速发展的今天,我们不可避免地会面临降低风险还是躲避风险两种选择。将必要风险降低是提高系统安全性的最重要和最积极的方法,所以,我们必须从研发的开始阶段到项目最终评估受审阶段,以安全完整性为目标,使我们的系统满足必须实现的功能达到或维持安全状态所必需的安全功能。
软件安全性分析任务包含于软件生存周期的若干活动中,是针对软件的安全性质量,并作为这些活动的补充。软件安全性分析作为开发中软件的质量的重要保证,关系到软件的获取、供应、开发、运行和维护,以得到专业人士的高度重视。并且现在,软件安全性分析任务的各项细节执行都写入了国军标,被安全相关软件的需方、供方、开发者、维护者以及独立的评价者使用。规范化将推进软件安全性分析的进程,使更多的开发和评测单位遵循标准化文件,同样,也会在推进的过程中,不断地发展软件安全性分析标准。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)