您好,欢迎访问三七文档
软件安全性测试程绍银sycheng@ustc.edu.cn2软件安全性测试本章内容软件安全软件安全的最优方法软件安全性测试插曲:安全最优方法vs.安全性测试安全性测试的目标---漏洞相关网站和工具实验3软件安全性测试本章内容9软件安全软件安全的最优方法软件安全性测试插曲:安全最优方法vs.安全性测试安全性测试的目标---漏洞相关网站和工具实验4软件安全性测试软件安全什么是软件安全?软件安全就是使软件在受到恶意攻击的情形下依然能够继续正确运行的工程化软件思想---GaryMcGraw,Cigital公司首席技术官和董事会成员---《SoftwareSecurity:BuildingSecurityIn》或《软件安全:使安全成为软件开发必需的部分》软件安全性测试软件安全软件安全vs.安全的软件,不是一回事软件安全是一种系统级的问题,需要考虑安全机制(比如访问控制)和基于安全的设计(比如使攻击难以实施的健壮设计)软件安全必须成为完整的软件开发生命周期方法的一部分6软件安全性测试软件安全的含义软件安全是计算机安全的一个分支软件安全是计算机安全的关键软件安全问题的根源是软件存在弱点用工程化的方法来实施软件安全7软件安全性测试软件安全是计算机安全的一个分支现代社会中,我们生活所需的一切似乎都离不开计算机系统,我们的电力、供水、交通、通讯、金融等等,都依赖于计算机系统的安全运行。但是,计算机系统并不安全,它潜伏着严重的不安全性、脆弱性和危险性如何保障计算机系统的安全就成为我们这个时代的一个根本问题,计算机安全这门学科也因此应运而生,并成为近二十年来最热门的学科之一计算机安全的研究范畴包括硬件安全、软件安全、数据安全、运行安全和网络安全8软件安全性测试软件安全是计算机安全的关键由于病毒主要是通过网络传播,而黑客主要是通过网络来进行攻击,因此,多年来人们一直认为网络安全是计算机安全的主要问题。但是在网络安全上的巨大投入却没有从根本上解决计算机安全问题软件是计算机安全的大问题,危害计算机安全的绝大部分因素都与软件相关软件的不稳定导致系统崩溃和数据丢失病毒攻击的是软件的缺陷黑客利用的是软件的弱点机密和隐私的泄漏是因为软件存在漏洞计算机安全中的首要和关键问题是软件问题9软件安全性测试软件安全问题的根源是软件存在弱点现有方法并不能解决软件安全问题反病毒程序和防火墙之类的保护程序密码学之类的信息加密技术假设有一个程序,其密码验证是用加密算法来实现的,它安装在一个被防火墙保护的系统中,系统中安装了反病毒程序这个程序是否健壮,可能存在溢出类弱点没有谁能保证防火墙和反病毒软件是完全可靠的,它们也可能存在缓冲区溢出之类的弱点10软件安全性测试软件安全问题的根源是软件存在弱点软件安全问题的根源就是我们所依赖的软件存在太多的安全弱点,而不断增加的软件复杂性和可扩展性更是火上浇油般地助长了这种情形解决软件安全问题的根本方法就是改善我们建造软件的方式,以建造健壮的软件,使其在遭受恶意攻击时依然能够安全可靠和正确运行11软件安全性测试用工程化的方法来实施软件安全在整个软件开发生命周期中都要确保将安全作为软件的一个有机组成部分软件安全的三根支柱:应用风险管理、软件安全的接触点和知识12软件安全性测试应用风险管理风险管理是一种战略性方法,即将追踪和减轻风险作为一种贯穿整个生命周期的指导方针成功的风险管理其实就是一种业务级中的决策支持工具;一种收集必需的数据并基于弱点、威胁、影响和概率的知识作出正确判断的方法13软件安全性测试软件安全的接触点接触点,即在软件开发生命周期中保障软件安全的一套最优方法,是一种战术性方法七个接触点:代码审核、体系结构风险分析、渗透测试、基于风险的安全测试、滥用案例、安全需求和安全操作“安全的”开发生命周期能够在每一个开发阶段上尽可能地避免和消除漏洞14软件安全性测试软件安全的接触点应用于不同的软件工件的软件安全最优方法(根据传统的瀑布模型来布局)15软件安全性测试软件安全的知识知识,包括收集、压缩和共享能用于为软件安全方法提供坚实基础的安全知识由于软件安全是一门新的学科,及时总结知识,并用知识来教育所有相关的人员,对确保软件安全是至关重要的在整个开发生命周期中综合应用这些方法,就能从设计、编码和测试等各个层面上消除软件中的安全弱点,从制度上、方法上最大限度地保障软件安全16软件安全性测试软件安全的知识知识是特定领域中相互关联的信息---能够通过一定的方法和过程得以运用的信息例如:C和C++中的一组潜在的安全缺陷是信息;在静态分析工具中的这样的信息就是知识软件安全知识可以归成为七种(原则、方针、规则、弱点、攻击程序、攻击模式和历史风险),并划分为三个知识类(说明性知识、诊断性知识和历史知识)17软件安全性测试软件安全的知识软件安全知识类映射为不同的软件工件和软件安全最优方法18软件安全性测试本章内容软件安全9软件安全的最优方法软件安全性测试插曲:安全最优方法vs.安全性测试安全性测试的目标---漏洞相关网站和工具实验19软件安全性测试软件安全的最优方法实施软件安全要求对常规建造软件的方式做一些修改这些修改并不是根本性的、翻天覆地的或者费用高得难以承受采用一组简单明了的最优工程方法,这些方法可以结合到现有的开发过程中在软件开发生命周期中集成软件安全最优方法(接触点),是软件安全的三根支柱的核心20软件安全性测试软件安全的最优方法21软件安全性测试七个接触点1.代码审核2.体系结构风险分析3.渗透测试4.基于风险的安全测试5.滥用案例6.安全需求7.安全操作22软件安全性测试1.代码审核工件:代码发现的风险的例子:在代码的第42行中发现缓冲区溢出所有的软件都会至少产生一种工件——代码。在代码级中,关注的焦点是实现缺陷,特别是那些静态分析工具就更是如此,它们通过扫描源代码能发现一般的弱点代码审核是一种实现安全的软件的必要而不充分的方法。安全缺陷(特别是在C和C++中的安全缺陷)是显而易见的,而体系结构瑕疵则是真正棘手的问题单独进行代码审核是一种特别有用的方法,但是,由于这种类型的审核只能确定缺陷,因此,即使是最好的代码审核也只能发现大约50%的安全问题。仅仅盯着代码是很难(并且几乎是不可能)发现体系结构问题的。现代的系统都由数百万行代码构成,这种方法就更不能奏效了。实现软件安全的完整方法是包括代码审核和体系结构分析的有机组合23软件安全性测试2.体系结构风险分析工件:设计和说明书发现的风险的例子:对关键数据的区分和保护很糟糕;Web服务未能验证调用代码及其用户,并且没有基于正确的上下文来作出访问控制决定在设计和体系结构级中,系统必须是连贯一致的,并提供统一的安全防线。设计人员、架构人员和分析人员应该用文档清晰地记录各种前提假设,并确定可能的攻击。在基于说明书的体系结构阶段和类层次的设计阶段,体系结构风险分析都是必需的。此时,安全分析人员揭示体系结构瑕疵,对它们评级,并开始进行降低风险的活动。忽视这个级别的风险分析会在日后引起严重的问题注意,在软件生命周期的所有阶段中都可能出现风险,因此,强烈地建议采用持续的风险管理方法,并不断地进行追踪和监视风险的活动24软件安全性测试3.渗透测试工件:处于环境中的系统发现的风险的例子:在Web接口中处理程序状态的糟糕方法渗透测试非常有用,如果根据体系结构风险分析来设计测试,效果就更好。渗透测试的优点是,它给出了对处于真实运行环境中的实际部署的软件的很好的理解。但是,没有考虑软件体系结构的任何这类测试,或许都不能揭示关于软件风险的任何有用的信息。不能通过预构的应用程序安全测试工具所实施的封闭黑箱测试的软件肯定是非常糟糕的。因此,通过低层次的渗透测试,只能揭示出一点点软件的真实安全状况的信息,但是未能通过封闭的渗透测试,则说明你确实处于很糟糕的状况中渗透测试与进行测试的人员有关,这是它的一个缺陷。应该特别小心那些“改过自新的黑客”,他们改过自新的唯一证明只有一些自我描述。还要小心,网络渗透测试与应用程序或者软件所面临的渗透测试并不相同25软件安全性测试4.基于风险的安全测试工件:单元和系统发现的风险的例子:由于处理数据保护风险而导致可能的大量数据泄漏安全测试必须包含两种策略:(1)用标准功能测试技术来进行的安全功能性测试;(2)以攻击模式、风险分析结果和滥用案例为基础的基于风险的安全测试。一份好的安全测试计划包含这两种策略即便你直接探测一个系统,安全问题也并不总是显而易见的,因此,标准的质量保障方法可能不能揭示所有严重的安全问题。QA是为了保证所有好的事情的发生安全测试是为了保证坏的事情不会发生。像攻击者一样地考虑问题很重要。因此,用关于软件体系结构、一般性攻击和攻击者的心态的知识来指导安全测试是极为重要的26软件安全性测试5.滥用案例工件:需求和使用案例发现的风险的例子:易受广为人知的攻击——篡改攻击的影响建造滥用案例是深入攻击者的心理的好办法。类似于使用案例,滥用案例描述了系统在受到攻击时的行为表现;建造滥用案例要求明确地说明应该保护什么、免受谁的攻击,以及保护多长时间27软件安全性测试6.安全需求工件:需求发现的风险的例子:没有明确描述数据保护要求必须明确地在需求级中加入安全考量。好的安全需求包括明显的功能安全(比如说,使用实用的加密方法)和突然出现的特性(滥用案例和攻击模式可以很好地捕获它们)。确定和维护安全需求的方法是非常复杂的,应该灵活地处理28软件安全性测试7.安全操作工件:实际部署的软件发现的风险的例子:没有足够的日志记录以追踪某个已知的攻击者软件安全可以从网络安全中借鉴很多方法。经过有效组合的安全操作允许和鼓励网络安全专业人员积极应用接触点,提供开发团队可能缺乏的经验和安全智慧。在增强系统的安全状况的过程中,身经百战的操作人员认真地设置和监视实际部署的系统。不论设计和实现的力度如何,都会出现攻击,因此,理解导致攻击成功的软件的行为就是一种重要的防御技术。通过理解攻击和攻击程序而获得的知识应该再应用到软件开发中29软件安全性测试本章内容软件安全软件安全的最优方法9软件安全性测试插曲:安全最优方法vs.安全性测试安全性测试的目标---漏洞相关网站和工具实验30软件安全性测试软件安全性测试安全性(security)测试。它是指在测试软件系统中对危险防止和危险处理设施进行的测试,以验证其是否有效功能性测试:软件做它应该做的事应用输入,验证正确的输出不正确的输出/行为Æ缺陷(Bug)安全性测试:软件不做它不应该做的事应用输入,验证没有不安全的事情发生安全性缺陷(漏洞,脆弱性,Vulnerability)31软件安全性测试安全性测试的主要工作全面检验软件在软件需求规格说明中规定的防止危险状态措施的有效性和在每一个危险状态下的反应对软件设计中用于提高安全性的结构、算法、容错、冗余、中断处理等方案,进行针对性测试在异常条件下测试软件,以表明不会因可能的单个或多个输入错误而导致不安全状态用错误的安全性关键操作进行测试,以验证系统对这些操作错误的反应对安全性关键的软件单元和软件部件,要单独进行加强的测试,以确认其满足安全性需求32软件安全性测试安全性测试的目标通常的目标内存溢出SQLinjection/XSS各种输入验证型问题进一步的目标访问控制信息泄露不充分的随机数鉴别与加密…33软件安全性测试安全性测试的方法学WhiteBoxUsecommercialstatisticanalysistooltoauditthesourcecodeCoverity/Fortify/Etc..BlackBoxFaultinjectionDumbFuzzingGrayBoxSmartFuzzing(Fuzzingwithdeeplyknowledgeoftheproduct)34软件安全性测试安全性测试的方法白/灰盒测试对软件工程文档/源代码/二进制代码进行静态分析/审核对运行时系统进行动态监测例子:污点传播分析/符号执行功能验证功能验证是采
本文标题:软件安全性测试
链接地址:https://www.777doc.com/doc-1269699 .html