
第1章 概述
1.1 缺陷的基本概念
源代码缺陷指在软件开发生命周期的编码阶段,产生的有意或者无意的缺陷。这些缺陷以不同形式存在于软件源代码中,一旦被恶意主体所利用,就会对软件或者操作系统的安全造成损害。
导致源代码存在缺陷的原因有很多,主要可以归纳为以下几方面。
(1)由于受程序设计人员个人开发经验和技术能力的限制,难免在开发过程中引入某些不足和错误,即使优秀的开发人员也会犯错。此外,不是每一个开发人员都对安全知识有着足够的了解,缺少安全知识和安全开发经验也是造成源代码中存在缺陷的重要原因之一。
(2)产品引入了某些开源的项目,导致引入安全漏洞。开源软件是软件供应链的重要组成部分。据Gartner调查显示,99%的组织在其IT系统中使用了开源软件。很多情况下,一个产品的开发方式可以为自主开发、开源提供、外包开发等方式。使用开源组件提高了软件开发的效率,同时也放大了软件系统的攻击面,一个组件的漏洞常常会导致依赖该组件的软件系统受到攻击威胁,攻击者只需要找到软件供应链的一个突破口便可以成功入侵并造成整个链条失陷。
(3)产品在发布前通常会进行功能测试和性能测试,但往往会忽略安全测试。安全测试指在产品发布前,验证系统是否满足安全需求,发现系统的安全漏洞,并最终把这些漏洞的数量降到最低的一系列过程。而通过分析产品源代码发现缺陷是安全测试中的重要环节,对安全测试的忽略可能导致源代码缺陷。
2005年,美国总统信息技术咨询委员会关于信息安全的年度报告中就曾指出:美国重要部门使用的软件产品必须加强安全检测,尤其是应该进行软件代码层面的安全检测。而在美国国土安全部(DHS)和美国国家安全局(NSA)的共同资助下,MITRE公司展开了对软件源代码缺陷的研究工作,并建立了软件源代码缺陷分类库CWE(Common Weakness Enumeration),以统一分类和标识软件源代码缺陷。
美国CERT、SANS、OWASP等第三方研究机构也在软件源代码安全检测领域开展了许多工作,包括:CERT发布了一系列安全编程(C/C++、Java等)标准,SANS和OWASP发布了严重代码缺陷TOP25和TOP10,用于指导开发人员进行安全的编码,尽量避免源代码中的安全缺陷。与此同时,美国国家标准与技术研究院(NIST)提出并进行软件保障度量和工具检测项目SAMATE的研究,其中源代码缺陷分析是重要组成部分,这个数据库包含实际的软件应用程序和已知的错误或漏洞,便于进行漏洞分析和查找。
为了便于读者更好地认识各种缺陷的基本特性,本书依据对CVE(通用漏洞披露)数据的分析,以及开源代码检测计划中开源组织的反馈数据,选取C/C++、Java语言中的60个重要且常见的缺陷类型进行分析,逐类对缺陷的原理、危害、在代码中的表现形式以及修复建议进行描述。