
本书内容是注册网络安全源代码审计专业人员(NSATP-SCA)认证培训的理论知识部分,对代码审计的基础知识和涉及的内容、代码安全审计规范和审计指标进行了全面的介绍,同时,针对目前常用的程序设计语言Java、C/C++和C#,分别基于其特点和漏洞测试规范中的案例进行了具体的分析和解读。本书参考了大量国内外代码安全审计规范、安全开发规范、常见漏洞库和相关文献,并进行了解析、汇总和提取,以系统地阐述代码审计的思想、技术和方法,构建完备的代码审计知识体系,旨在为代码审计人员提供全面和系统的指导。
序1 当今时代,云计算、大数据、人工智能、移动互联、物联网、5G等新技术新应用的高速发展,为生产生活、科学研究、知识学习、文化传承与交流、社会治理带来了极大的便利,为经济社会发展提供了巨大的推动力。但同时,伴随而来的网络安全问题越来越多,尤其是技术的先天性问题和不成熟性,如核心代码的各类缺陷,使不法分子能够利用技术漏洞进行攻击破坏或谋取利益;一些国家为保持其霸权而将网络空间作为新的战争空间,使网络空间面临的威胁日趋严峻复杂。如何确保网络安全,已经成为各国生存发展所面临的重大挑战。习近平总书记指出:“没有网络安全就没有国家安全,没有信息化就没有现代化。”这一重要论述深刻阐明了安全与发展的辩证关系。随着总体国家安全观的贯彻落实,网络安全已经上升到国家安全的战略高度,随着一系列相关法律法规的出台和实施,我国网络空间安全治理体系不断完善,网络安全标准化和检测认证作为法律法规实施的重要支撑和促进安全保障水平提升的重要抓手,正在成为重要的安全治理手段。在网络安全领域,我国已经建立的针对产品、服务、管理体系和人员能力的检验检测认证体系,成为网络安全保障体系的重要环节。不断深化和扩展网络安全检验检测认证手段的运用,加强检验检测认证能力建设,是完善我国网络安全保障体系的重要工作。源代码安全审计是网络安全检验检测认证中经常使用的基础性技术手段,提升源代码安全审计能力是加强检验检测认证能力建设的重要基础。 关键信息基础设施保护是网络安全工作的重中之重。目前,关键信息基础设施和重要信息系统呈现多领域、大型化、复杂化、智能化的特征,与此同时,全球网络空间斗争形势日益严峻,网络攻击方式不断演进升级,利用软件漏洞实施链式攻击愈加频繁,对我关键信息基础设施和重要信息系统安全稳定运行构成了严重威胁。如何保障源代码安全已经成为网络安全工作的关键环节,而源代码安全审计工作是及时发现、修正源代码漏洞的有效途径,通过源代码审计工作可以大大提升源代码质量安全。 源代码安全审计是一项专业性很强的工作,网络安全源代码安全审计专业人员的培训与能力评价是贯彻落实国家网络安全人才队伍建设政策规划的重要工作。本书既可作为专业人员学习培训的教材,也可应用于人员的专业能力评价认证体系建设。本书是关于源代码安全审计的基础理论型书籍,对源代码安全审计中的典型漏洞进行了详细剖析,对源代码安全审计的关键知识点和流程进行了总结并给出了大量实践案例,力求为读者营造全面、专业、易懂的阅读体验。对于想要从事源代码安全审计工作的人来说,本书是不错的自学读本。本书也非常适合作为网络安全渗透测试人员、企业网络安全防护人员及研发、运维、测试等技术人员的参考教材。 最后,希望本书能够助力广大读者,希望本书的读者能够为中国网络安全事业的发展添砖加瓦,贡献一份力量。 魏 昊 2022年9月于北京 序2 网络空间已经发展成为继陆、海、空、天之后的第五大空间。网络空间与其他空间相互交融,对政治、经济、军事、文化、民生和公共利益等产生了深刻的影响,甚至会影响国家安全。网络空间是人用信息技术创造出来的可以交互的特殊空间,随着信息技术的飞速发展,网络空间也在不断放大和升级,将全面改变人类社会的生产和生活方式。可见,信息技术是驱动和保障国家经济建设与社会安全发展的强力引擎,在现实社会的能源、交通、金融、电信、制造、教育、文化等领域发挥着重要作用。信息技术中最具有代表性和革命性的是计算机和互联网,这两项技术使社会对计算、交换、存储、处理、控制等系统的基本功能需求得到满足,而这些基本功能是靠软件程序实现的,于是,满足各种应用需求的软件程序越来越多。然而,在软件程序开发过程中,由于软件规模及其复杂程度的影响,不可避免地会出现软件逻辑错误、软件Bug等安全漏洞,甚至存在故意设置的后门和隐蔽通道。随着智能社会加速发展和国际斗争日益激烈,我国网络空间安全面临的安全威胁日趋严峻,一个根源性威胁就是来自信息技术产品和系统软件Bug等安全漏洞和后门的严重威胁。这种威胁已经成为整个网络空间的核心和关键问题,以及最敏感、最重要的焦点和棘手问题。 如何解决软件漏洞这一关键问题和技术难题,已成为网络安全企业、院校、研究机构和有识之士技术攻关的目标课题,可信计算、拟态技术、漏洞扫描、漏洞挖掘、众筹测试等安全技术、产品和服务应运而生,在黑箱测试和防御中发挥了重要作用,一定程度上应对了病毒、恶意代码等网络攻击。随着国际斗争形势的复杂性和残酷性不断增强,尤其是在军事战、网络战、贸易战、科技战、舆论战、病毒战等混合战模式下,解决网络空间软件安全管控问题就变成和在现实社会中管控枪支一样重要的事情。特殊时期对软件安全管控提出了更高的要求,否则,就有可能因为软件漏洞造成互联网网站或重要系统大量信息泄露、情报窃密、网站瘫痪、勒索攻击、APT攻击等,导致灾难性的后果及巨大的经济损失。近年来,从互联网遭受的攻击和个人信息泄露,以及政府、知名企业遭受勒索软件威胁等攻击事件的情况看,各类软件漏洞事件频发是主要原因,而我国的软件开发主要依赖开源,据权威统计,每1000行代码中就有4~6个安全缺陷,可见开源软件代码安全性堪忧。可以说,软件存在安全漏洞是不可避免的,使用的开源软件越多,能够被黑客利用的漏洞就越多,安全隐患也就越大。 综上所述,软件源代码安全是保障网络空间安全最基础、最核心的环节。近几年,源代码安全审计工作作为实现源代码安全的必要途径,重要性凸显,国家网络安全等级保护制度对源代码安全审计工作也提出了专门要求。然而,当前我国源代码安全审计工作刚刚起步,经验不足,相关参考资料不多,从业人员较少且能力水平普遍不高,因此,亟须培养大量掌握代码审计基本思想、基本技术和基本方法的专业测评人员。注册网络安全测评专业人员是我国网络安全专业人员资质认证的重要形式,多年来,在贯彻落实“加快网络安全人才培养,增强全民网络安全意识”和构建网络安全人才体系方面发挥了重要的作用。 本书作为注册网络安全源代码审计专业人员的教材,涵盖代码安全选择、代码审计工具、代码审计方法、代码审计规范、代码审计指标和常见漏洞分析等方面的内容,以保障信息系统软件代码安全为核心,以知识体系全面性和实用性为原则,以理论与实操相结合为路径,以培养高素质代码审计专业人才为目标,将为我国网络安全代码审计专业人员的培养工作提供有力支撑。 李京春 2022年9月于北京 序3 看待事物,当下的总是比过去的或未来的更容易看清,表象总是比内在要分明,简单的结果总是比构成的机理和过程更容易理解。 在网络安全领域,最早展现在我们面前的是网络安全体系建设问题。这些当下的、相对静态的、结果表象的领域,其基本方法、技术和产品完全称得上丰富多彩,围绕它们的产业也很发达。网络安全围绕这个最初的落脚点,向更具挑战的方向发展,有宏观的方向,有对抗的方向。而在系统生命周期这个时间坐标轴上,有了两个挑战性的方向:安全右移、安全左移。安全右移就是向时间的下游走,即安全运营(安全运行)。安全左移就是向时间的上游走,即供应链安全。 安全左移的供应链安全被认为是网络安全挑战中最具本源性的一个领域。近年来全球影响较大的网络安全事件往往都伴随着供应链安全问题。在供应链安全方向,有与本书内容密切相关的软件供应链安全领域。网络安全圈常说的0Day漏洞,大多是软件开发过程中的Bug和错误导致的。有了SDL安全开发生命周期规范的指导,辅以二进制逆向安全检测和软件源代码审计,可以尽量杜绝软件安全漏洞。前卫而时髦的DevSecOps体系,也需要在Dev开发阶段设置代码审计环节。 代码审计在网络安全领域占有重要地位。在代码开发阶段,如果能够发现并解决更多的问题,就能够减少系统“带洞运行”的情况,避免更多的网络安全风险。作为系统的开发者和防御者,要想与威胁者和攻击者对抗,就要充分运用自身优势——开发者和防御者拥有源代码。攻击者一般没有源代码,只能通过二进制逆向的方式寻找漏洞。所以,代码审计是防御者的优势,理当充分利用。 当然,从理论上,即使进行了代码审计,Bug和安全漏洞也难以在大型复杂软件系统中杜绝。但是,如果能在编码阶段减少漏洞,就能在建设和运行阶段少受损失,节约其他防御性投入。归根到底,就看我们是否有能力以较低的成本在编码阶段发现更多的问题、解决更多的问题。让代码审计技术得到更广泛的应用,让更多的技术人员掌握代码审计技术,就是本书的初衷和贡献。 由信息产业信息安全测评中心编写的这本书,对教材相对匮乏的代码审计人才培养工作来说是难得的及时雨。同时,本书完全对应于NSATP培训认证体系下新开设的代码审计方向的课程,即NSATP-SCA(注册网络安全源代码审计专业人员)认证培训。在某种程度上,本书兼具教材和认证评价规范的功能,具有很强的指导作用。 希望本书能为我国培养更多的代码审计工程师、测评师,更好地改善代码的安全性,夯实网络安全基础。 潘柱廷 2022年9月于北京 前 言 在我们享受新技术新应用带来的便捷生活的同时,网络安全形势日益严峻,数据泄露风险日益增加。在保障网络安全、减少漏洞攻击方面,源代码安全审计起着重要的作用。 写作背景 在目前国内的图书市场上,源代码安全审计类的书籍很少,源代码安全审计基础书籍更是凤毛麟角。本书填补了国内源代码安全审计基础书籍的空白,希望能为相关领域的学生、工作人员提供学习上的便利。 本书内容 本书内容是注册网络安全源代码审计专业人员(NSATP-SCA)认证培训的理论知识部分,共4篇。 第1篇介绍代码审计基础,从入门的角度对代码审计的基础知识和涉及的内容进行概述,主要包括代码审计现状、概念、辅助与漏洞验证工具、方法和技术等。 第2篇介绍代码审计规范,主要包括代码安全审计规范和审计指标解读。 第3篇介绍代码安全审计参考规范,主要针对国际代码安全开发参考规范CVE、OWASP、CWE及国内的Java、C/C++和C#语言源代码漏洞测试规范,从开发和测试两个角度分析和解读代码设计过程中应遵循的安全规范。 第4篇是实际开发中的常见漏洞分析,主要对常见的典型代码安全案例(如注入、跨站脚本攻击、硬编码、敏感信息泄露、内存泄漏等)进行全面解析,并针对目前常用的程序设计语言Java、C/C++和C#,分别基于其特点和漏洞测试规范中的案例进行具体的分析和解读。 本书在编写过程中参考了大量国内外代码安全审计规范、安全开发规范、常见漏洞库和相关文献,并进行了解析、汇总和提取,以系统地阐述代码审计的思想、技术和方法,构建完备的代码审计知识体系,旨在为代码审计人员提供全面和系统的指导。 本书的编著者有霍珊珊、锁延锋、徐佳俊、刘健、张益、程慧琴、姚宣霞、李洋、郑榕。 读者对象 本书非常适合作为网络安全渗透测试人员、企业网络安全防护人员及研发、运维、测试等技术人员的参考教材。
目 录 第1篇 代码审计基础 第1章 代码安全现状 2 1.1 典型漏洞代码案例分析 2 1.2 代码审计的基本思想 5 1.3 代码审计的现状 5 第2章 代码审计概述 7 2.1 代码审计的概念 7 2.2 代码审计对象 7 2.3 代码审计的目的 7 2.4 代码审计的原则 7 2.5 代码审计要素 8 2.6 代码审计的内容 9 2.6.1 认证管理 9 2.6.2 授权管理 11 2.6.3 输入/输出验证 11 2.6.4 密码管理 12 2.6.5 调试和接口 12 2.6.6 会话管理 13 2.7 代码审计的成果 13 2.8 代码审计的价值与意义 14 2.9 代码审计的发展趋势 14 第3章 代码审计与漏洞验证相关工具 15 3.1 常用代码编辑器 15 3.2 常用代码审计工具 18 3.3 常用漏洞验证工具 23 第4章 代码审计方法 28 4.1 自上而下 28 4.1.1 通读代码的技巧 28 4.1.2 应用案例 30 4.2 自下而上 39 4.3 利用功能点定向审计 42 4.4 优先审计框架安全 44 4.5 逻辑覆盖 45 4.5.1 白盒测试 45 4.5.2 逻辑覆盖法 47 4.6 代码审计方法综合应用示例 54 第5章 代码审计技术 56 5.1 词法分析 56 5.2 语法分析 59 5.3 基于抽象语法树的语义分析 59 5.4 控制流分析 63 5.5 数据流分析 65 5.6 规则检查分析 66 小结 67 参考资料 68 第2篇 代码审计规范 第6章 代码审计规范解读 72 6.1 代码审计说明 72 6.2 常用术语 72 6.3 代码审计的时机 73 6.4 代码审计方法 73 6.5 代码审计流程 74 6.6 代码审计报告 76 第7章 代码审计指标 78 7.1 安全功能缺陷审计指标 78 7.1.1 数据清洗 78 7.1.2 数据加密与保护 86 7.1.3 访问控制 88 7.1.4 日志安全 92 7.2 代码实现缺陷审计指标 92 7.2.1 面向对象程序安全 92 7.2.2 并发程序安全 95 7.2.3 函数调用安全 97 7.2.4 异常处理安全 100 7.2.5 指针安全 101 7.2.6 代码生成安全 103 7.3 资源使用缺陷审计指标 103 7.3.1 资源管理 103 7.3.2 内存管理 106 7.3.3 数据库使用 110 7.3.4 文件管理 110 7.3.5 网络传输 111 7.4 环境安全缺陷审计指标 113 小结 113 参考资料 114 第3篇 代码安全审计参考规范 第8章 国际代码安全开发参考规范 116 8.1 CVE 116 8.1.1 CVE概述 116 8.1.2 CVE的产生背景 116 8.1.3 CVE的特点 116 8.1.4 CVE条目举例 117 8.2 OWASP 118 8.2.1 OWASP概述 118 8.2.2 OWASP Top 10 118 8.2.3 OWASP安全测试指导方案 139 8.2.4 OWASP安全计划指导方案 140 8.2.5 OWASP应用程序管理方案 141 8.3 CWE 143 第9章 国内源代码漏洞测试规范 165 9.1 软件测试 165 9.2 《Java语言源代码漏洞测试规范》解读 171 9.2.1 适用范围 171 9.2.2 术语和定义 171 9.2.3 Java源代码漏洞测试总则 174 9.2.4 Java源代码漏洞测试工具 178 9.2.5 Java源代码漏洞测试文档 179 9.2.6 Java源代码漏洞测试内容 183 9.3 《C/C++语言源代码漏洞测试规范》解读 229 9.3.1 适用范围 230 9.3.2 术语和定义 230 9.3.3 C/C++源代码漏洞测试总则 232 9.3.4 C/C++源代码漏洞测试工具 236 9.3.5 C/C++源代码漏洞测试文档 236 9.3.6 C/C++源代码漏洞测试内容 236 9.4 《C#语言源代码漏洞测试规范》解读 272 9.4.1 适用范围 273 9.4.2 术语和定义 273 9.4.3 C#源代码漏洞测试总则 276 9.4.4 C#源代码漏洞测试工具 279 9.4.5 C#源代码漏洞测试文档 280 9.4.6 C#源代码漏洞测试内容 280 小结 329 参考资料 330 第4篇 实际开发中的常见漏洞分析 第10章 实际开发中常见的Java源代码漏洞分析 334 10.1 SQL注入 334 10.2 跨站脚本攻击 341 10.3 命令注入 347 10.4 密码硬编码 351 10.5 隐私泄露 353 10.6 Header Manipulation 356 10.7 日志伪造 358 10.8 单例成员字段 361 第11章 实际开发中常见的C/C++源代码漏洞分析 364 11.1 二次释放 364 11.2 错误的内存释放对象 366 11.3 返回栈地址 367 11.4 返回值未初始化 369 11.5 内存泄漏 370 11.6 资源未释放 371 11.7 函数地址使用不当 372 11.8 解引用未初始化的指针 374 小结 375 参考资料 375 英文缩略语 377