软件安全期末论文

更新时间:2024-03-05 14:13:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

软件安全开发

一、软件安全开发概况

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.软件安全测试

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

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

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

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

模糊测试的步骤:

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

② 将这些测试用例作为输入应用与被测对象; ③ 监测和记录由输入导致的任何崩溃或异常现象; ④ 查看测试日志,深入分析产生崩溃或异常的原因。

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

渗透测试的流程:

本文来源:https://www.bwwdw.com/article/n9wa.html

Top