软件安全期末论文

软件安全开发

一、软件安全开发概况

1.软件安全开发背景

第一次“软件危机”-20世纪60年代,根源:汇编语言不能处理日益庞大和复杂的程序,解决:高级语言的诞生-FORTRAN和C;

第二次“软件危机”-20世纪80年代,根源:大型程序,数百万行,数百万人同时开发,解决:1.面向对象语言-C++/java/c#;2.软件工程; 第三次“软件危机”-21世纪头十年,根源:软件安全。

软件应用广泛:电脑游戏、火车票售票系统、多媒体教学、手机、航天飞机、人造卫星、、、

软件安全问题广泛存在:运行错误,售票系统反应慢、连不上或是崩溃,多媒体教学系统死机,黑客盗取用户的银行密码、、、

软件安全问题导致的一般后果:造成产品运行不稳定,得不到正确的结果甚至崩溃,被恶意攻击,导致信息泄露/数据破坏等后果; 软件安全问题导致的严重后果:售票系统瘫痪,美国放射治疗仪超剂量辐射事件,阿丽亚纳5号火箭首发失败事件,Stuxnet病毒攻击伊朗布什尔核电站事件。

软件存在诸多安全问题的原因:软件开发周期短,工作量大,无暇顾及安全;软件设计时缺乏安全设计;软件开发人员缺乏安全编程的经验;功能越来越多,情况越来越复杂;软件模块复用,可扩展性/灵活性要求高;互联网环境下的安全挑战。总结概括为两点:存在漏洞,存在威胁。

漏洞已经成为危害软件安全的主要因素,危及用户对软件的信任、业务运营,还会危及一些关键基础设施和应用。

漏洞普遍存在,普通软件工程师,每千行代码存在20个缺陷,虽然采用严格的软件开发质量管理机制和多重测试,软件公司的缺陷率依然很高,其中普通软件开发公司的缺陷密度为4-40个,高水平的软件开发公司的缺陷密度为2-4个缺陷,美国NASA的软件缺陷密度可达到0.1个缺陷。

2.软件安全开发简介

所谓的安全的软件是指不存在安全漏洞,能抵御各种攻击威胁,按照预期的方式执行。而软件安全开发是指在软件开发生命周期各个阶段采取必要的、相适应的的安全措施来避免绝大多数的安全漏洞。采取措施防止由于设计、开发、提交、升级或维护中的缺陷而导致的系统脆弱性。

软件安全开发要求安全提前介入,在软件发布以后进行修复的代价是在软件设计和编码阶段即进行修复所花代价的30倍。并且等软件发布以后再进行修复对软件使用者所造成的损失是巨大的,因此有了软件安全开发,即安全的软件开发生命周期:包括安全设计原则,安全开发方法,最佳实践,安全专家经验。另外还提出了一些安全开发模型,包括

由微软提出的可信计算安全开发生命周期,由Gary McGraw等提出的BSI系列模型,OWASP提出的SAMM和CLASP模型。

可信计算安全开发生命周期(The Trustworthy Computing Security Development LifeCycle)是一个安全保证过程,其在开发过程的所有阶段中引入了安全和隐私原则,共5+2个阶段,16项必须的安全活动。

BSI(Building Security IN)使安全成为软件开发必须的部分,无需改变现有的软件开发方法,适用各种软件开发生命周期。

SAMM(Software Assurance Maturity Mode),即软件保证成熟度模型,一个开放的框架,用以帮助制定并实施针对软件安全特定风险的策略。规定了四个软件开发过程中的核心业务功能:治理、构造、验证和部署。

CLASP(Comprehensive Lightweight Application Security Process),综合的轻量应用安全过程,选取了30个特定的基于角色的活动,用于提升整个开发团队的安全意识,并针对这些活动给出了相应的指南、导则和检查列表。

二、软件安全开发的关键工作

1.软件安全设计

在这个环节中我们要了解软件安全设计的重要性,理解软件安全设计的基本原则,理解受攻击面概念和常用的减少攻击面的保护措施,了解威胁建模的概念和目的,理解威胁建模的关键因素及作用。

在传统的方法中,软件发布后测试,等待修复bug,有研究表示50%的安全问题由设计瑕疵引起,因此安全提前介入,效益高,成本低。

所谓的设计缺陷,有如明文存储口令,甚至将口令拿到客户端对比验证,这些都会给系统带来严重的威胁。

安全设计的目标就是制定项目计划来定义安全行为,制定安全检查点来保证安全控制措施的质量,识别配置过程和变更控制过程。

安全设计主要的设计内容包括确定访问控制机制,定义主体角色和权限,选择加密方法和算法,解决敏感数据处理问题,评估内部通信机制,确定完整性机制、、、

安全设计的安全设计原则包括保护最薄弱的环节,纵深防御,最小特权,最小共享,权限分离,经济性,保护隐私,正确理解“秘密”,安全的错误处理,心理接受能力等原则。

受攻击面指对一个软件系统可以采取的攻击方法的集合,可攻击的面例如有功能、API、接口、资源、数据存储等。一个软件的攻击面越大安全风险就越大。因此降低受攻击面,对于提高软件安全性至关重要。

降低受攻击面的方法,第一步分析产品功能的重要性,即此功能是不是必须的;第二步分析从哪里访问这些功能;第三步采取合理的措施,比如降低权限等。

威胁建模是以结构化的方式,识别评估应用系统面临的威胁。目的是帮助在设计阶段充分了解各种安全威胁,并指导选择适当的应对措施;对可能的风险进行管理;可以重新验证其架构。

威胁建模的流程:确定建模对象;识别威胁;评估威胁;消灭威胁。 建模对象包括应用的可信任边界之内的所有功能组件和边界之外的

应用最实际部分。识别威胁包括发现组件或进程存在的威胁,但是威胁不等于漏洞。评估威胁包括判断攻击发生的概率,攻击后果,计算风险。消灭威胁包括重新设计并排除这个威胁,使用标准的威胁消减技术,发明新的消减方法,根据安全bug标准来确定是否可以接受风险,把威胁作为漏洞记录下来,以后再想办法解决。

常见威胁举例,1.哄骗,就是模仿其他人或实体,比如伪装成microsoft.com;2.篡改,即修改数据或代码,例如修改硬盘、DVD或网络数据包中的DLL;3.抵赖,即声称没有执行过某个动作;4.信息泄露,即把信息披露给那些无权知道的人,比如允许某人阅读windows源代码,公布某个网站的用户清单;5.拒绝服务,即拒绝为用户提供服务,例如使得Windows或Web网站崩溃,发送数据包并耗尽CPU时间,将数据包路由到某黑洞中;6.权限提升,即获得非授权访问权,例如允许远程因特网用户执行命令,让受限用户获得管理员权限。

消减威胁举例,1.针对假冒威胁,采取认证方式,例如Cookie认证,KerBeros认证,PKI等;2.针对篡改威胁,采取哈希函数、消息认证码、数字签名、防篡改协议的措施消减;3.针对抵赖威胁,采取强认证、安全审计、数字签名、时间戳等措施消减;4.针对信息泄露威胁,采用加密、保护秘密、访问控制、不保存秘密、隐私保护协议等措施消减;5.针对拒绝服务威胁,采取认证、访问控制、过滤、流量控制、授权等措施消减;6.针对特权提升威胁,采取建立访问控制列表、最小权限运行等措施消减。

2.软件安全编码

软件安全编码属于软件安全开发的关键阶段,在此,我们先了解通用的安全编程准则,包括验证输入、避免缓存溢出、程序内部安全、安全调用组件、程序编写编译等概念。了解编码时禁止使用的函数,了解相关的安全编码标准和建议。了解常见的代码安全问题及处置办法。了解代码审查的目的。了解常见源代码静态分析工具。

其中验证输入是安全程序的第一道防线,我们要检查、验证或是过滤输入,不让恶意数据进入程序后续处理,类似网络中的防火墙。对数据的检查应该设置在最初接收数据时。

最常见的输入,即输入源,包括1、命令行,要检查参数数量、数据格式和内容;2、环境变量,环境变量可能超出期望,有的环境变量存储格式可能存在危险;3、文件,包括被不可信用户控制的文件能容,不可信的临时文件;4、网络,来自网络的数据是高度不可信的;5、还包括一些其它的来源。

常见的数据类型,1、字符串,确定合法的范围,拒绝非法的字符(串),识别特定的字符,使用强类型,过滤单引号、双引号、反斜杠、以及NULL字符,过滤“select”、“insert”、“update”、“shutdown”、“delete”、“drop”等字符串,对于数字类型的字段,很多程序员会这样写“select * from test where id=?”,由于变量没有用单引号扩起来,就会造成sql_inject攻击,因此程序员应该对所有用户提交的要放到SQL语句的变量进行过滤;2、数字,确定合法的范围,大数溢出为负数;3、文件名,最好不要让用户自己设置文件名,避免文件名使用特殊字符,例如.、/、--rf、../、com1等;4、电子邮件地址,用正则表达式限制合法的

电子邮件地址;5、URL/URI,检查是不是非法地址形式,防止在合法地址后面增加恶意的内容。

缓冲区溢出,缓冲区指包含相同数据类型的实例的一个连续计算机内存块;溢出指数据被添加到分配给该缓冲区的内存块之外。

缓冲区溢出是一个普遍存在而且十分严重的问题。如果产生溢出,那么攻击者可以使远程服务程序或者本地程序崩溃;攻击者也可以设计溢出后执行的代码,从而达到自己的目的。之所以会产生溢出,是因为C/C++语言的特性决定的,大量的库函数存在溢出,比如strcpy、strcat、gets等,而其它很多语言都会调用c语言库。

那么解决缓冲区溢出的办法是什么呢?1、填充数据时计算边界,例如动态分配内存,控制输入等;2、使用没有缓冲区溢出问题的函数,例如strncpy、strncat等;3、使用替代库,例如Libmib、libsafe等;4、基于探测方法的防御,例如StackGuard、ProPolice、/GS,将一个“探测”值插入到返回地址的前面;5、非执行的堆栈防御,即不可在堆栈上执行代码。

程序内部安全包括程序内部接口安全、安全的失败、最小化反馈、避免拒绝服务攻击、避免竞争条件和安全的使用临时文件。

程序内部接口安全即对程序内部接口的数据的检查;安全的失败即检测异常,安全的处理各种可能运行的路径,检测到某些错误行为/数据时,必须以合适的方式处理,保证程序运行安全,必要时立即拒绝服务,甚至不回送详细的错误代码;最小化反馈,即避免给以不可靠用户过多的信息,认证程序在认证前尽量少给信息,如果程序接受了密码,不要返回它;避免拒绝服务攻击,即输入错误尽快返回,设置超时,延时服务等;避免竞争条件,即访问共享资源时(文件/变量)没有被适当的控制,使用原子操作,使用锁操作-避免死锁;安全的使用临时文件,很多安全漏洞发生在访问已知文件名或可猜测的临时文件时。

安全调用其它组件,是指应用程序实际上几乎都不会是自包含的,它们通常都会调用其它组件,例如底层的操作系统,数据库,可重用的库,网络服务等。安全的调用它组件包括只采用安全的方式使用安全的组件,例如检查组件文档,搜索相关说明,使用经过认可的组件,尽可能的不调用外部命令,如果不得已要调用,必须严格检查参数。正确处理返回值,一定要检查返回值,判断调用是否成功。成功时,检查是否按照期望值处理,数据中可能含有NULL字符、无效字符或其它可能产生问题的东西;失败时,检查错误码。保护应用程序和组件之间传递的数据,考虑传输加密,包括密码算法和安全协议。

在程序的编写和编译阶段,要遵守以下条约:使用最新版本的编译器与支持工具;使用编译器内置防御特性;减少潜在的可被利用的编码结构和设计;保护秘密,及时清除密码和秘钥等敏感数据;程序只实现你制定的功能;永远不要信任用户输入;必须考虑意外情况并进行处理;使用安全编码检查清单。

针对WEB应用,还要特别注意一下如下安全威胁,1、SQL注入,解决注入问题的办法就是不要相信用户的输入,一切的输入都是危险的,要验证用户的输入,对所有的用户输入进行转义,参数化查询,使用存储过程,使用视图,最小权限原则。2、跨站攻击(XSS),即恶意攻击

者往Web页面里插入恶意的HTML代码,当用户浏览该页面时,嵌入其中的HTML代码就会被执行,从而达到恶意攻击的目的。攻击的危害性有:敏感信息泄露、钓鱼攻击、屏蔽/伪造页面的特定信息、Cookie欺骗、拒绝服务攻击等等。跨站式攻击防御办法:对传入的URL参数进行处理,或者确定传入来源是可靠的。

在软件安全开发的开发阶段最后一个安全步骤就是源代码审核,源代码审核关注编码中的实现缺陷,这个可以通过静态分析工具进行,它们扫描源代码,能够发现大约50%的安全问题。

3.软件安全测试

软件安全测试就是按照特定规程,发现软件错误的过程,检查软件是否满足规定的要求,或是清楚的了解预期结果与实际结果之间的差异,其目的在于发现软件中的错误。

软件安全测试是有关验证软件安全等级和识别潜在安全缺陷的过程,不仅查找软件自身程序设计中存在的安全隐患,而且检查应用程序对非法侵入的防范能力。与传统的测试相比,传统的软件测试仅考虑软件出错时的处理,没有考虑对软件的故意攻击。

软件在投产前,应该由独立的安全团队对应用的安全性进行综合评估,分为功能性安全测试和对抗性安全测试。传统的测试方法有:白盒测试、黑盒测试和灰盒测试。特定的安全测试手段包括:模糊测试和渗透测试。

模糊测试是通过提供非预期的输入并监视异常结果来发现软件故障的方法,该测试属于黑盒测试,因为它并不关心被测试目标的内部实现,只是设计输入、检测结果、发现安全漏洞。这是一种非常有效的漏洞发掘技术,已知漏洞大部分都是通过这种技术发现的。使用这种方法进行测试时,不够强壮的程序会崩溃,编码良好的程序正常运行。模糊测试的特性是:方法学、随机值、大量的测试用例、查找漏洞或可靠性错误。

模糊测试的步骤:

① 生成大量的畸形数据作为测试用例;

② 将这些测试用例作为输入应用与被测对象;

③ 监测和记录由输入导致的任何崩溃或异常现象;

④ 查看测试日志,深入分析产生崩溃或异常的原因。

渗透测试是通过模拟恶意黑客的攻击方法,来评估系统安全的一种评估方法,从攻击的角度测试软件系统是否安全,使用自动化工具或者人工的方法模拟黑客的输入,找出运行时刻目标系统所存在的安全漏洞。渗透测试的优点是:找出来的问题都是真实的,也是较为严重的。缺点是:只能到达有限的测试点,覆盖率较低。

渗透测试的流程:

渗透测试的目的是进行安全性的评估,不是摧毁或是破坏。在渗透测试中,技术、知识和经验很重要,测试人员要像“坏人”一样思考问题,如果测试参数由那些不想发现安全问题的人确定,那么,渗透测试就很可能变成一种毫无用处的自我满足练习!

4.软件安全开发项目管理

我们要了解项目安全需求分析和安全设计的重要性,了解软件安全开发角色,了解安全培训重要性和内容,了解如何实施自己的软件安全计划。

项目安全需求分析和安全设计要求从一开始就要关注安全性,要开发和划分安全性需求,充分理解和完全文档化的需求,分析安全场景和安全风险,注重安全设计,包括应用软件结构选择,系统平台确定,编程/开发软件选择。

软件安全开发角色包括项目高管、安全群组/安全顾问、开发团队(项目经理、架构师、开发人员)、测试团队,每一个角色都要有很强的安全意识。另外,软件开发团队还要加强安全培训,软件开发团队需要接受专门的安全培训,定期/非定期培训,包括新员工培训,新知识培训,安全意识培训...,培训的内容包括:信息安全基础知识、密码技术、网

络安全,威胁建模、架构设计,安全编码训练、编程习惯等等。

实施软件安全计划,要求我们:1、建立适合自己的计划,要适应项目的商业和技术环境,确定最佳路径,逐步调整;2、认真实施每一个最优方法计划,确定负责人,局部实验,推广到全局;3、培训人员;4、评估进展,包括风险评估,监测项目进展;5、持续改进。

5.用工程化的方法来实施软件安全开发

总的来说就是在整个软件开发周期中都要确保安全作为软件的一个有机组成部分,把支撑软件安全的基础分为三个支柱:应用风险管理,软件安全的接触点,知识。

其中风险管理是一种战略性方法,即将追踪和减轻风险作为一种贯穿整个生命周期的指导方针。成功的风险管理其实就是一种业务级中的决策支持工具;一种收集必需的数据并基于弱点、威胁、影响和概率的知识作出正确的判断的方法。

软件安全的接触点,即在软件开发生命周期中保障软件安全的一套最优的方法,是一种战术性方法。它包括七个接触点:代码审查,体系结构风险分析、渗透测试、基于风险的安全测试、滥用案例、安全需求和安全操作。安全的开发生命周期能够在每一个开发阶段上尽可能的避免和消除漏洞。

知识包括收集、压缩和共享能用于为软件安全方法提供坚实基础的安全知识,由于软件安全是一门新的学科,及时总结知识,并用知识来教育所有相关的人员,对确保软件安全是至关重要的。在整个开发生命周期综合应用这些方法,就能从设计、编码和测试等各个层面上消除软件中的安全弱点,从制度上、方法上最大限度地保障软件安全。知识是特定领域中相互关联的信息,例如:C和C++中的一组潜在的安全缺陷信息,在静态分析工具中的这样的信息就是知识。软件安全知识可以归成7种:原则、方针、规则、弱点、攻击程序、攻击模式和历史风险,并划分为三个知识类:说明性知识,诊断性知识和历史性知识。

集成软件安全开发的最优方法,即接触点,是软件安全开发三根支柱的核心。代码 审查的工件:代码,发现风险的例子:在代码的某行中发现缓冲区溢出。所有的软件都会至少产生一种工件,那就是代码,在代码集中,关注的焦点是实现缺陷,特别是那些静态分析工具就更是如此,他们通过扫描源代码能够发现一般的弱点。代码审查是一种实现安全的软件的必要而不充分的方法,安全缺陷,特别是在C和C++中的安全缺陷是显而易见的,而体系结构瑕疵则是真正棘手的问题。单独进行代码审核是一种特别有用的方法,但是,由于这种类型的审核只能确定缺陷,因此,即使最好的代码审核也只能发现大约50%的安全问题。仅仅盯着代码是很难(并且几乎是不可能)发现体系结构问题的;体系结构风险分析,工件:设计和说明。发现的风险例子:对关键数据的区分和保护很糟糕,Web为能验证调用代码及其用户,并且没有基于正确的上下文来作出访问控制决定。在设计和体系结构集中,系统必须的连贯一致的,并提供统一的安全防线。设计人员,架构人员和分析人员应该用文档清晰地记录各种前提假设,并确定可能的攻击。安全分析人员揭示体系结构瑕疵,对他们评级,并开始进行降低风险的活动。忽视这个级别的风险分析会在日后引起严重的问题。渗透测试的工件是处于环

境中的系统,渗透测试非常有用,如果根据体系结构风险分析来设计测试,效果更好。渗透测试的优点是,它给出了对处于真实运行环境中的实际部署的软件的很好的理解。渗透测试与进行测试的人员有关,这是他的一个缺陷。应该特别小心那些“改过自新的黑客”,他们改过自新的唯一证明只有一些自我描述。还要注意,网络渗透测试与应用程序或是软件所面临的渗透测试并不相同。基于风险的安全测试的工件是单元和系统,发现风险的例子是,由于处理数据保护风险而导致可能的大量数据泄露。安全测试必须包含两种策略:(1)用标准功能测试技术来进行的安全功能性测试;(2)以攻击模式、风险分析结果和滥用案例为基 础的基于风险的安全测试。安全测试是为了保证坏的事情不会发生,像攻击者一样地考虑问题很重要,因此,用关于软件体系结构、一般性攻击和攻击者的心态的知识来指导安全测试是极为重要的。滥用案例的工件是需求和使用案例,建造滥用案例是深入攻击者的心理的好办法。类似于使用案例,滥用案例描述了系统在受到攻击时的行为表现;建造滥用案例要求明确的说明应该保护什么、免受谁的攻击,以及保护多长时间。安全操作的工件是实际部署的软件,发现风险的例子:没有足够的日志记录追踪某个已知的攻击者。经过有效组合的安全操作允许和鼓励网络安全专业人员积极应用接触点,提供开发团队可能缺乏的经验和安全智慧。

三、软件安全开发的前景分析 紧迫的信息安全形势已发出警示:对于用户大量使用的商用软件,国家 应加强安全方面的审查力度,应整合社会力量,建立信息产品安全评测体系,对每个影响力大的软件、重要的补丁进行安全评估,尽可能地做到防患于未然,保证信息社会的安全。

如今,互联网用户面临的安全威胁正在发生前所未有的变化。首先是计算计病毒加壳,其次是“流氓”网站的大量出现,第三是以应用软件为主体的新“漏洞王”不断涌现。以往人们印象中windows系统经常爆出漏洞,但从2007年开始,百度搜霸、暴风影音、RealPlayer等流行软件的漏洞开始成为计算机病毒广为利用的新对象。随着计算机的应用重心日益向网络转移,网络应用不断蚕食桌面应用。根据软件厂商统计的漏洞数据,80%以上的新安全缺陷都发生在网络应用中,可见,软件安全开发在软件开发生命周期中越来越重要。


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn