APP下载

软件测试中软件代码安全性设计的讨论

2018-12-07冯济舟刘洪喜

航天标准化 2018年3期
关键词:软件测试缓冲区攻击者

冯济舟 刘洪喜

(1中国电子科技集团公司38所;2空军驻安徽地区军事代表室,安徽合肥,230088)

随着软件测试技术不断发展,软件在各产品中的比重也不断增加,这对软件测试技术提出了更高的要求。软件代码是组成软件可运行系统的最小单元,也是软件测试的基础。软件代码组合成具有某种用途的软件系统,通过充分的软件测试可以有效提高软件系统的安全性、可靠性和稳定性,以保证客户的正常使用。

目前,软件测试技术已经形成一整套比较系统、完善且又严密的体系,包括文档审查、代码审查、静态分析、单元测试、集成测试、软件配置项测试和系统测试等。同时对每项工作的内容进行了具体规范和要求,并相应地制定了一套度量方法,以保障各工作执行的有效性。

然而遗憾的是,经过如此周密的测试过程,软件依然会出现一些意想不到的问题,这些问题往往是可以避免的。笔者归纳和总结了软件测试无法发现且具有一定规律性且易被忽视的软件代码安全性设计问题。

1 使用可能被Shell中元字符影响的shell函数的安全性问题

在命令行shell和SQL解释器中的元字符是指不被解释为数据的字符。这些字符包括如 “:{&;`'" |*?~<>^ () [] {}$ }.”。这些字符可能是命令,也可能是从命令或其它数据中分隔出来的数据。当程序调用其它系统并允许攻击者插入这些元字符时,通常的结果是攻击者可以通过插入的元字符来完全控制运行的应用程序。对于具有较高安全性需求的系统应避免在命令行shell中使用popen函数、system函数、execlp函数和execvp函数。

2 使用catch函数打印由异常产生的潜在敏感信息

在开发过程中,研发人员习惯使用catch函数打印输出程序出现的异常,以发现、捕获并解决系统可能出现的问题。然而在实际使用的应用系统中,当使用catch函数在其块中打印消息时,应避免由于系统错误导致异常而产生的潜在敏感信息的泄漏,因为恶意用户可以根据泄漏的敏感信息来攻击应用系统,给系统造成安全隐患。对于具有较高安全性需求的系统应避免在catch块中打印消息,以防止由于某些来自应用程序的出错,造成应用程序敏感信息的泄漏。

3 使用gets函数的安全性问题

当使用标准C库gets函数获取字符数据时,由于gets函数事先不知道需要读取多少数据,且gets函数是将获取的字符不断传入存储,直至缓冲区填满,这可能会导致缓冲区溢出,造成系统安全的隐患。该函数已经被用来破坏电脑的安全性,应禁止使用gets函数,相应的使用fgets函数来代替,这样可以预防使用gets函数时可能造成的缓存溢出隐患。

4 使用非常量参数或变量传递给exec函数的安全性问题

当传递给exec函数的参数变量不是常量时,那么攻击者就有可能插入一段恶意字符串片段到一个动态创建的字符串中。这些恶意字符串片段有可能允许攻击者执行一个指定的命令,给系统造成安全隐患。对于具有较高安全性需求的系统应避免使用非常量参数或变量传递给exec函数。

5 使用可能产生资源竞争关系函数的安全性问题

竞争条件是指由于对事件的相对时间具有特别严重依赖性的异常行为。竞争条件通常涉及一个或多个进程访问一个共享资源 (如同一个文件或同一内存),那么这种多重访问就很难得到妥善的控制,导致具有竞争关系函数的异常行为。标准库中可能产生资源竞争关系函数, 如 access、creat、pathconf、 opendir、 dirname、 scandir、 open、 lstat、stat、 open、 rename、 remove、 lexecve、 execl、execlp、execle、execv、 execvp、 freopen、 mktemp、link和unlink。应禁止使用可能产生资源竞争关系的函数。

6 使用mbstowcs函数的安全性问题

当使用标准库mbstowcs函数时,其内部堆栈分配的缓冲区可能在某些版本中导致缓冲区溢出,造成系统安全隐患,破坏电脑的安全性。因此,在软件开发过程中应禁止使用mbstowcs函数,以防止使用不安全的mbstowcs函数给系统带来的危害。

7 使用GetTempPath函数返回当前目录或窗口目录函数的安全性问题

当使用GetTempPath函数返回当前目录或窗口目录函数时,GetTempPath的函数功能是返回到临时目录的文件路径。当到临时目录的路径大于分配给存储这些信息的缓冲区时就可能造成缓冲区溢出;或者返回到的临时目录的文件路径可能是不安全的目录路径,且在Windows操作系统环境下,操作系统不能保证对临时文件返回的路径是有效的或可用的,如此会给系统带来安全隐患。攻击者可以利用GetTempPath函数功能中的弱点,如在Windows操作系统中返回一个攻击者可以读取或写入的路径 (如,c: emp),这样攻击者将能够读取或修改在临时文件中的任何数据;或者如果在缓冲区长度没有正确设置的情况下,攻击者可以指定一个环境变量及其长度比路径缓冲区的长度长。当程序在这种环境下运行时,路径缓冲区就会出现溢出问题。对于具有较高安全性需求且具有类似情境的系统应避免使用GetTempPath函数返回当前目录或窗口目录函数。

软件测试是软件能力成熟度模型集成的重要活动。近年来,各软件企业不仅对质量保障的投入不断加大,而且作为保障软件质量最有效的测试也不断发展和完善,形成了一套比较系统而又严密的体系。但是经过如此周密的测试过程,软件依然会出现一些意想不到的问题。本文根据实际项目经验,归纳和总结了软件测试无法发现、具有一定规律性、易被忽视的软件代码安全性设计问题。此问题的归纳和总结,不仅可以帮助开发人员在编码过程中避免一些由于误解或者开发习惯给系统造成的安全性风险,而且可以帮助测试人员结合语境分析,提高在代码检查过程中识别存在安全性隐患的风险代码的能力,对提高软件质量具有积极意义。

猜你喜欢

软件测试缓冲区攻击者
嵌入式系统环形缓冲区快速读写方法的设计与实现
基于微分博弈的追逃问题最优策略设计
基于OBE的软件测试课程教学改革探索
EXCEL和VBA实现软件测试记录管理
正面迎接批判
关于软件测试技术应用与发展趋势研究
软件测试工程化模型及应用研究
有限次重复博弈下的网络攻击行为研究
关键链技术缓冲区的确定方法研究
地理信息系统绘图缓冲区技术设计与实现