10.6.1 安全漏洞的概念
1.安全漏洞的定义
软件存在的各种问题,中文通常用“软件缺陷”一词描述,但在英文中有多个词与之对应,例如缺陷(Bug),缺点(Defect),偏差(Variance),谬误(Fault),失败(Failure),矛盾(Inconsistency),错误(Incident),异常(Anomy)等[3]。
ANSI/IEEE729-1983(软件工程标准术语汇编)中对软件缺陷的定义为:从产品内部看,软件缺陷是软件产品开发或标准维护过程中存在的错误、毛病等各种问题;从外部看,软件缺陷是系统所需要实现的某种功能的失效或违背。
然而,并非所有的安全缺陷都会导致漏洞(Vulnerability),但是如果一个安全缺陷会导致输入数据(例如命令行参数)越过安全界限进入到程序中,那么就会导致软件漏洞。当包含安全缺陷的程序自身拥有比执行程序的用户更高的权限时,或者当程序被网络服务所使用时(输入数据通过网络连接传入),就有可能形成软件漏洞。
互联网词汇(RFC2828 Internet Security Glossary)将漏洞定义为“系统设计、实现和操作管理中存在的缺陷和弱点,能被利用而违背系统的安全策略”。
软件安全漏洞会导致系统性能不稳定、安全性不好,从而影响客户体验和客户信心,或者被黑客利用漏洞进行攻击,造成经济或者声誉损失。
2.安全漏洞产生的原因
根据漏洞出现的阶段,软件安全漏洞可分为设计漏洞和实现漏洞两大类。
(1)设计漏洞 设计漏洞是一种软件设计阶段发生的设计错误,无论编码人员如何实现,都存在安全问题。常见的设计漏洞包括密码技术使用不当、安全需求不明等。
1)密码技术使用不当。如选择错误的密码学方法(对称密码算法、非对称密码算法、Hash函数等)来完成加密、完整性校验、认证等。在使用密码技术时,没有使用研究透彻、标准化的知名算法,如AES、RSA等,而是自创一套没有得到公开研究和验证的密码算法。即使是使用现有的成熟算法,也没有使用较为知名的密码库,例如Microsoft Cryptography API或者OpenSSL,而是自己编写的或不知名的密码库。
2)安全需求不明。在系统分析阶段没有明确的威胁建模,没有形成明确安全需求。
(2)实现漏洞 实现漏洞是在软件编码中的安全缺陷造成的。例如:没有检测返回代码、没有正确定义缓冲区的大小、没有正确处理非预期的输入等。