APP下载

软件安全性设计常见问题的思考

2017-12-14冯济舟朱婷婷

航天标准化 2017年4期
关键词:字符串缓冲区安全性

冯济舟 朱婷婷

(中国电子科技集团38所,安徽合肥,230088)

软件安全性设计常见问题的思考

冯济舟 朱婷婷

(中国电子科技集团38所,安徽合肥,230088)

软件能力成熟度模型集成;安全隐患;软件质量。

软件测试是软件能力成熟度模型集成的重要活动,随着软件规模和复杂程度的不断提高,软件测试技术也不断发展,软件在各个领域比重不断加深的条件下,对于保障软件质量的软件测试也提出了更高的要求。此外,由于近年来软件占产品的比重不断提升,对软件的验证提出了更加严格的要求。然而在代码实现过程中,某些编程时忽视的问题,不仅无法通过测试手段发现,而且会给软件带来安全隐患。

目前,各软件企业不仅对质量保障的投入不断加大,而且作为保障软件质量最有效的测试也不断发展和完善,形成了一套比较系统而又严密的体系。其中包括文档审查、代码审查、静态分析、单元测试、集成测试、软件配置项测试和系统测试,并对每个活动的具体内容进行了规范和要求。然而遗憾的是,经过如此周密的测试过程,软件依然会出现一些意想不到的问题。

根据实际项目经验,笔者归纳和总结出一类目前测试方法无法发现且具有一定的规律性、易被忽视的软件安全性设计常见问题,以加强开发人员在开发过程中的编码规范,增强测试人员在代码检查过程中识别风险代码的能力,对提高软件质量具有积极意义。

1 当前系统时间作为访问权限控制的安全性

当使用标准C库函数、MFC库函数的时间相关函数时,所获取的当前系统时间有可能被篡改;当作为访问敏感信息的键值或者访问指定函数的许可时,有可能被可疑的当前系统时间引发安全漏洞,导致系统的安全隐患,使本不应具有访问权限的用户具有了超越权限的控制和操作。对于具有较高安全性需求且具有类似情境的系统,应避免使用标准C库和MFC库中与时间有关的函数。其中,标准C库中与时间有关的函数如: time、 clock、 ctime、 gmtime、 localtime、mktime和strftime;标准MFC库中与时间有关的函数如: GetTime、 GetYear、 GetMonth、 GetDay、GetHour、 GetMinute、 GetSecond 和GetDayOfWeek。

2 产生随机数作为访问权限控制的安全性

当使用标准C库函数的随机数函数时,所获取的随机数是伪随机数,即使用最后生成的数据作为创建下一个数据的种子,这样便会导致攻击者通过猜测和计算的手段得出下一个数据。如此,对于Web会话采用的随机会话ID,如果使用标准C库函数的随机数函数产生随机数,则有可能被可疑的用户猜测到产生的下一个数据结果,通过获得访问需要的有权限数据,伪造会话身份,进而达到欺骗此次会话的效果。

对于具有较高安全性需求且具有类似情境的系统,应避免使用标准C库函数的随机数函数。其中,标准C库中与生成随机数有关的函数如:rand、 random、 randomize和 srand。

3 使用系统中的环境变量的安全性

当使用系统中的环境变量时,所使用的系统中的环境变量可能使恶意用户通过环境变量传递的一个专门制作的字符串到一个正在运行的程序中,这样就可导致缓冲区溢出;或者所使用的系统中的环境变量可能是通过putenv写入的应用程序的敏感信息 (如密码),恶意用户就会捕获并使用以获得未经授权的权限或访问敏感数据。

对于具有较高安全性需求且具有类似情境的系统,应避免使用系统中的环境变量,通过编程开发过程中对系统环境变量使用的限制,会给系统带来更好的安全性和可靠性。

4 使用加载库的安全性

当使用标准C库函数的加载库函数时,要确保加载库所指定的文件名是完整修饰的,如此才可以保证被加载的库是始终正确的。当所加载的库指定的文件名不是完整修饰时,那么期望的模块可以被攻击者所取代,给系统带来安全隐患。比如说,加载库指定的文件名缺少了文件扩展名时,那么系统将会给此文件使用 “.dll”作为文件扩展名,这样攻击者就可以在加载库函数指定的搜索路径中,在系统找到期望的DLL之前的某个位置,放置有问题的DLL,这样系统就加载了攻击者指定的DLL,即可能将一个DLL木马注入到所运行的系统进程中。

在代码中加载库时,需要考虑使用包含具有参数完整修饰文件名的 “LoadLibrary”函数或“LoadLibraryEx”函数,以确保加载正确的库。如果库文件没有扩展名时,则将 “.”追加到最后,保证文件名的完整性以及可以被正确识别,确保库的正确加载。

5 使用仅带有一个可变参数的printf/wprintf函数的安全性

当使用标准C库仅带有一个可变参数的printf/wprintf函数时,如果printf/wprintf函数传递了一个没有格式指示符的变量,这个变量可以包含一个巧妙的格式化字符串 (包括格式字符 “%n、%x或%s”),则该字符串有可能被用于执行恶意指令或使应用程序崩溃。

避免使用仅带有一个可变参数的printf/wprintf函数。对于具有较高安全性需求且具有类似情境的系统,应避免使用标准C库仅带有一个可变参数的printf/wprintf函数。

6 使用仅带两个参数且第二个参数是变量的fprintf/fwprintf函数的安全性

当使用标准C库仅带两个参数且第二个参数是变量的fprintf/fwprintf函数时,由于使用了没有格式指示符的fprintf/fwprintf函数,在传递没有格式指示符的变量时,此变量可以包含一个灵活的格式化的字符串 (包括格式字符 “%n、%x和%s”),则该字符串有可能被用于执行恶意指令或使应用程序崩溃。

对于具有较高安全性需求且具有类似情境的系统,应避免使用标准C库仅带两个参数且第二个参数是变量的fprintf/fwprintf函数。

7 使用向未做边界检查的缓冲区作写操作的C函数的安全性

当使用标准C库向未做边界检查的缓冲区作写操作的函数时,由于对写入的边界未检查缓冲区,因此系统不能正确处理超出边界的错误,造成系统安全的隐患。

对于具有较高安全性需求且具有类似情境的系统,应避免使用向未作边界检查的缓冲区做写操作的C函数。其中,标准C库中与未作边界检查的缓冲区做写操作有关的函数如:strcpy、strcat、sprintf、vsprintf、 gets、 strncpy、 strncat、 snprintf和 fgets。

8 使用string类中data函数的安全性

当使用标准C库String::data函数返回字符串时,由于该字符串对象中没有包含一个终止字符,在某种情况下,特别是当与C风格遗留代码接口交互时,这可能会导致缓冲区溢出或其它字符串相关的安全漏洞,造成系统安全的隐患。

对于具有较高安全性需求且具有类似情境的系统,应避免使用string类中data函数,可以使用data函数或c_str函数,这些函数会返回一个终止字符串。

9 使用vfork函数的安全性

当使用标准C库vfork函数时,该函数可能给系统带来两种安全隐患:①当代码改变或当编译器版本改变时,程序编码中所调用vfork函数的地方很容易造成系统的失败;②从可移植性方面来讲,由vfork函数生成的子进程,其运行不妨碍其父进程的运行,许多编译器将其生成隐藏的临时对象或其它代码结构,这会造成意想不到的后果。

对于具有较高安全性需求的系统,应禁止使用vfork函数,相应的情境可以使用fork函数代替。

[1]万江平,孔学东,杨建梅.集成能力成熟度模型 (CMMI) 的研究 [J].计算机应用研究, 2001,(10).

[2]李兴兵,李孟军,谭跃进.军用CMMI模型的建立初探 [J]. 兵工自动化, 2003,(06).

文 摘:代码实现过程中存在访问权限以及使用环境变量、加载库、printf/wprinft函数、缓冲区作写操作的C函数、string类中data函数、vfork函数等的安全性问题,对这些无法通过测试手段发现的问题提出相应的解决措施。

冯济舟 (1984年—),男,高级工程师,研究方向:软件测试和软件工程化。

猜你喜欢

字符串缓冲区安全性
两款输液泵的输血安全性评估
新染料可提高电动汽车安全性
某既有隔震建筑检测与安全性鉴定
基于文本挖掘的语词典研究
加强广播电视信息安全性的思考
缓冲区溢出漏洞攻击及其对策探析
SQL server 2008中的常见的字符串处理函数
倍增法之后缀数组解决重复子串的问题
最简单的排序算法(续)
初涉缓冲区