近来,在我负责的公司某软件产品的最后測试工作,经常被问到这样一个问题:在做測试过程中,我们的软件产品在安全性方面考虑了多少?应该怎样測评一个软件究竟有多安全?
这个软件因为涉及客户商业上重要的信息资料,因此用户关心的核心问题始终环绕“这个软件安全吗”。一个因为设计导致的安全漏洞和一个因为实现导致的安全漏洞,对用户的终于影响都是巨大的。我的任务就是确保这个软件在安全性方面能满足客户期望。 一、什么是软件安全性測试 (1)什么是软件安全 软件安全属于软件领域里一个重要的子领域。在曾经的单机时代,安全问题主要是操作系统easy感染病毒,单机应用程序软件安全问题并不突出。可是自从互联网普及后,软件安全问题愈加显加突显,使得软件安全性測试的重要性上升到一个前所未有的高度。 软件安全一般分为两个层次,即应用程序级别的安全性和操作系统级别的安全性。应用程序级别的安全性,包含对数据或业务功能的訪问,在预期的安全性情况 下,操作者仅仅能訪问应用程序的特定功能、有限的数据等。操作系统级别的安全性是确保仅仅有具备系统平台訪问权限的用户才干訪问,包含对系统的登录或远程訪 问。 本文所讲的软件安全主要是应用程序层的安全,包含两个层面:①是应用程序本身的安全性。一般来说,应用程序的安全问题主要是由软件漏洞导 致的,这些漏洞能够是设计上的缺陷或是编程上的问题,甚至是开发者预留的后门。②是应用程序的数据安全,包含数据存储安全和传输数据安全两个方面。 (2)软件安全性測试 一般来说,对安全性要求不高的软件,其安全性測试能够混在单元測试、集成測试、系统測试里一起做。但对安全性有较高需求的软件,则必须做专门的安全性測试,以便在破坏之前预防并识别软件的安全问题。 安全性測试(Security Testing)是指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程。应用程序级安全測试的主要目的是查找软件自身程序设计中存在的安全隐患,并 检查应用程序对非法侵入的防范能力,依据安全指标不同測试策略也不同。注意:安全性測试并不终于证明应用程序是安全的,而是用于验证所设立策略的有效性, 这些对策是基于威胁分析阶段所做的如果而选择的。比如,測试应用软件在防止非授权的内部或外部用户的訪问或有益破坏等情况时的运作。 二、软件安全性測试过程 (1)安全性測试方法 有很多的測试手段能够进行安全性測试,眼下主要安全測试方法有: ①静态的代码安全測试:主要通过对源码进行安全扫描,依据程序中数据流、控制流、语义等信息与其特有软件安全规则库进行匹对,从中找出代码中潜在的安 全漏洞。静态的源码安全測试是很实用的方法,它能够在编码阶段找出全部可能存在安全风险的代码,这样开发者能够在早期解决潜在的安全问题。而正由于 如此,静态代码測试比較适用于早期的代码开发阶段,而不是測试阶段。 ②动态的渗透測试:渗透測试也是经常使用的安全測试方法。是使用自己主动化工具或 者人工的方法模拟黑客的输入,相应用系统进行攻击性測试,从中找出执行时刻所存在的安全漏洞。这样的測试的特点就是真实有效,一般找出来的问题都是正确的, 也是较为严重的。但渗透測试一个致命的缺点是模拟的測试数据仅仅能到达有限的測试点,覆盖率非常低。 ③程序数据扫描。一个有高安全性需求的软件, 在执行过程中数据是不能遭到破坏的,否则就会导致缓冲区溢出类型的攻击。数据扫描的手段一般是进行内存測试,内存測试能够发现很多诸如缓冲区溢出之类的漏 洞,而这类漏洞使用除此之外的測试手段都难以发现。比如,对软件执行时的内存信息进行扫描,看是否存在一些导致隐患的信息,当然这须要专门的工具来进行验 证,手工做是比較困难的。 (2)反向安全性測试过程 大部分软件的安全測试都是根据缺陷空间反向设计原则来进行的,即事先检查哪些 地方可能存在安全隐患,然后针对这些可能的隐患进行測试。因此,反向測试过程是从缺陷空间出发,建立缺陷威胁模型,通过威胁模型来寻找入侵点,对入侵点进 行已知漏洞的扫描測试。优点是能够对已知的缺陷进行分析,避免软件里存在已知类型的缺陷,可是对未知的攻击手段和方法一般会无能为力。 ①建立缺陷威胁模型。建立缺陷威胁模型主要是从已知的安全漏洞入手,检查软件中是否存在已知的漏洞。建立威胁模型时,须要先确定软件牵涉到哪些专业领域,再依据各个专业领域所遇到的攻击手段来进行建模。 ②寻找和扫描入侵点。检查威胁模型里的哪些缺陷可能在本软件中发生,再将可能发生的威胁纳入入侵点矩阵进行管理。假设有成熟的漏洞扫描工具,那么直接使用漏洞扫描工具进行扫描,然后将发现的可疑问题纳入入侵点矩阵进行管理。 ③入侵矩阵的验证測试。创建好入侵矩阵后,就能够针对入侵矩阵的详细条目设计相应的測试用例,然后进行測试验证。 (3)正向安全性測试过程 为了规避反向设计原则所带来的測试不完备性,须要一种正向的測试方法来对软件进行比較完备的測试,使測试过的软件可以预防未知的攻击手段和方法。 ①先标识測试空间。对測试空间的全部的可变数据进行标识,因为进行安全性測试的代价高昂,当中要重点对外部输入层进行标识。比如,需求分析、概要设计、具体设计、编码这几个阶段都要对測试空间进行标识,并建立測试空间跟踪矩阵。 ②精确定义设计空间。重点审查需求中对设计空间是否有明白定义,和需求牵涉到的数据是否都标识出了它的合法取值范围。在这个步骤中,最须要注意的是精确二字,要严格依照安全性原则来对设计空间做精确的定义。 ③标识安全隐患。依据找出的測试空间和设计空间以及它们之间的转换规则,标识出哪些測试空间和哪些转换规则可能存在安全隐患。比如,測试空间愈复杂,即 測试空间划分越复杂或可变数据组合关系越多也越不安全。还有转换规则愈复杂,则出问题的可能性也愈大,这些都属于安全隐患。 ④建立和验证入侵矩阵。安全隐患标识完毕后,就能够依据标识出来的安全隐患建立入侵矩阵。列出潜在安全隐患,标识出存在潜在安全隐患的可变数据,和标识出安全隐患的等级。当中对于那些安全隐患等级高的可变数据,必须进行详尽的測试用例设计。 (4)正向和反向測试的差别 正向測试过程是以測试空间为根据寻找缺陷和漏洞,反向測试过程则是以已知的缺陷空间为根据去寻找软件中是否会发生相同的缺陷和漏洞,两者各有其优缺点。 反向測试过程基本的一个长处是成本较低,仅仅要验证已知的可能发生的缺陷就可以,但缺点是測试不完好,无法将測试空间覆盖完整,无法发现未知的攻击手段。正向 測试过程的长处是測试比較充分,但工作量相对来说较大。因此,对安全性要求较低的软件,一般按反向測试过程来測试就可以,对于安全性要求较高的软件,应以正 向測试过程为主,反向測试过程为辅。 三、常见的软件安全性缺陷和漏洞 软件的安全有非常多方面的内容,基本的安全问题是由软件本身的漏洞造成的,以下介绍常见的软件安全性缺陷和漏洞。 (1)缓冲区溢出 缓冲区溢出已成为软件安全的头号公敌,很多实际中的安全问题都与它有关。造成缓冲区溢出问题通常有下面两种原因。①设计空间的转换规则的校验问题。即缺 乏对可測数据的校验,导致非法数据没有在外部输入层被检查出来并丢弃。非法数据进入接口层和实现层后,因为它超出了接口层和实现层的相应測试空间或设计空 间的范围,从而引起溢出。②局部測试空间和设计空间不足。当合法数据进入后,因为程序实现层内相应的測试空间或设计空间不足,导致程序处理时出现溢出。 (2)加密弱点 这几种加密弱点是不安全的:①使用不安全的加密算法。加密算法强度不够,一些加密算法甚至能够用穷举法破解。②加密数据时password是由伪随机算法产生的,而 产生伪随机数的方法存在缺陷,使password非常easy被破解。③身份验证算法存在缺陷。④客户机和server时钟未同步,给攻击者足够的时间来破解password或改动数据。⑤未 对加密数据进行签名,导致攻击者能够篡改数据。所以,对于加密进行測试时,必须针对这些可能存在的加密弱点进行測试。 (3)错误处理 普通情况下,错误处理都会返回一些信息给用户,返回的出错信息可能会被恶意用户利用来进行攻击,恶意用户可以通过分析返回的错误信息知道下一步要怎样做 才干使攻击成功。假设错误处理时调用了一些不该有的功能,那么错误处理的过程将被利用。错误处理属于异常空间内的处理问题,异常空间内的处理要尽量简单, 使用这条原则来设计能够避免这个问题。但错误处理往往牵涉到易用性方面的问题,假设错误处理的提示信息过于简单,用户可能会一头雾水,不知道下一步该怎么 操作。所以,在考虑错误处理的安全性的同一时候,须要和易用性一起进行权衡。 (4)权限过大 假设赋予过大的权限,就可能导致仅仅有普通 用户权限的恶意用户利用过大的权限做出危害安全的操作。比如没有对能操作的内容做出限制,就可能导致用户能够訪问超出规定范围的其它资源。进行安全性測试 时必须測试应用程序是否使用了过大的权限,重点要分析在各种情况下应该有的权限,然后检查实际中是否超出了给定的权限。权限过大问题本质上属于设计空间过 大问题,所以在设计时要控制好设计空间,避免设计空间过大造成权限过大的问题。 四、做好安全性測试的建议 很多软件安全測试经验告诉我们,做好软件安全性測试的必要条件是:一是充分了解软件安全漏洞,二是评估安全风险,三是拥有高效的软件安全測试技术和工具。 (1)充分了解软件安全漏洞 评估一个软件系统的安全程度,须要从设计、实现和部署三个环节同一时候着手。我们先看一下Common Criteria是怎样评估软件系统安全的。首先要确定软件产品相应的Protection Profile(PP)。一个PP定义了一类软件产品的安全特性模板。比如数据库的PP、防火墙的PP等。然后,依据PP再提出详细的安全功能需求,如用 户的身份认证实现。最后,确定安全对象以及是怎样满足相应的安全功能需求的。因此,一个安全软件的三个环节,哪个出问题都不行。 (2)安全性測试的评估 当做完安全性測试后,软件是否可以达到预期的安全程度呢?这是安全性測试人员最关心的问题,因此须要建立对測试后的安全性评估机制。一般从下面两个方面进行评估。①安全性缺陷数据评估。 假设发现软件的安全性缺陷和漏洞越多,可能遗留的缺陷也越多。进行这类评估时,必须建立基线数据作为參照,否则评估起来没有根据就无法得到正确的结论。 ②採用漏洞植入法来进行评估。漏洞植入法和可靠性測试里的故障插入測试是同一道理,仅仅只是这里是在软件里插入一些有安全隐患的问题。採用漏洞植入法时,先 让不參加安全測试的特定人员在软件中预先植入一定数量的漏洞,最后測试完后看有多少植入的漏洞被发现,以此来评估软件的安全性測试做得是否充分。 (3)採用安全測试技术和工具 可使用专业的具有特定功能的安全扫描软件来寻找潜在的漏洞,将已经发生的缺陷纳入缺陷库,然后通过自己主动化測试方法来使用自己主动化缺陷库进行轰炸測试。比如,使用一些可以模拟各种攻击的软件来进行測试。 安全測试是用来验证集成在软件内的保护机制是否可以在实际中保护系统免受非法的侵入。一句通俗的话说:软件系统的安全当然必须可以经受住正面的攻击——可是它也必须可以经受住側面的和背后的攻击