《C和C++安全编码》是关于C和C++安全编码的著作。《C和C++安全编码》介绍了C和C++程序中已经导致危险的、破坏性的基本编程错误,包括在字符串、指针、动态内存管理、整数、格式化输出、文件I/O等中的漏洞或缺陷。《C和C++安全编码》还提供了对这些编程错误的深入剖析,并给出缓解策略,以减少或消除恶意利用漏洞的风险。
《C和C++安全编码》适合C/C++程序员、软件安全工程师参考。
洞悉软件漏洞的成因,熟知规避之道
通常而言,可利用的软件漏洞都由本可避免的软件缺陷所导致。在分析了过去10年中近18000份漏洞报告后,CERT/CC发现少量的根本原因导致了这些漏洞的产生。《C和C++安全编码》识别并解释了这些原因,而且展示了预防利用漏洞的步骤。此外,《C和C++安全编码》还鼓励程序员采用最佳安全实践,并培养安全的开发理念,这不但有助于保护软件免遭当前的攻击,更可使它们免遭将来可能发生的攻击。
基于CERT/CC的报告和总结,Robert Seacord系统地揭示了最可能导致安全缺陷的编程错误,展示了这些缺陷的利用方式,介绍了可能导致的后果,并提供了安全的替代做法。
《C和C++安全编码》特别讨论了如下技术细节:
改善任何C/C++应用程序的整体安全性。
抵御利用不安全的字符串操作逻辑的缓冲区溢出和栈粉碎攻击。
避免因对动态内存管理函数的不当使用而导致的漏洞和安全缺陷。
消除与整数相关的问题,包括整数溢出、符号错误以及截断错误等。
正确地使用格式化输出函数,避免引入格式字符串漏洞。
避免I/O漏洞,包括竞争条件等。
《C和C++安全编码》提供了许多针对Windows和Linux的安全代码、不安全代码以及利用程序的例子。如果你负责创建安全的C或C++软件,或者需要保持这类软件的安全性,《C和C++安全编码》为你提供了详尽的专家级协助。在这方面,其他任何书籍都望尘莫及。
译者序
序言
前言
作译者简介
第1章 夹缝求生 1
1.1 衡量危险 3
1.1.1 损失的现状 4
1.1.2 威胁的来源 5
1.1.3 软件安全 6
1.2 安全概念 7
1.2.1 安全策略 8
1.2.2 安全缺陷 8
1.2.3 漏洞 9
1.2.4 利用 10
1.2.5 缓解措施 10
1.3 C和C++ 11
1.3.1 C和C++简史 11
1.3.2 C存在的问题 12
1.3.3 遗留代码 13
1.3.4 其他语言 13
1.4 开发平台 13
1.4.1 操作系统 13
1.4.2 编译器 15
1.5 本章小结 16
1.6 阅读材料 16
第2章 字符串 17
2.1 字符串特征 17
2.2 常见的字符串操作错误 18
2.2.1 无界字符串复制 18
2.2.2 差一错误 20
2.2.3 空结尾错误 21
2.2.4 字符串截断 21
2.2.5 与函数无关的字符串错误 21
2.3 字符串漏洞 22
2.3.1 安全缺陷 23
2.3.2 缓冲区溢出 24
2.4 进程内存组织 24
2.5 栈粉碎 27
2.6 代码注入 30
2.7 弧注入 32
2.8 缓解策略 34
2.8.1 预防 34
2.8.2 字符串流 44
2.8.3 检测和恢复 45
2.9 著名的漏洞 48
2.9.1 远程登录 49
2.9.2 Kerberos 49
2.9.3 Metamail 49
2.10 本章小结 50
2.11 阅读材料 51
第3章 指针诡计 52
3.1 数据位置 52
3.2 函数指针 53
3.3 数据指针 54
3.4 修改指令指针 54
3.5 全局偏移表 56
3.6 .dtors区 57
3.7 虚指针 58
3.8 atexit()和on_exit()函数 60
3.9 longjmp()函数 61
3.10 异常处理 62
3.10.1 结构化异常处理 62
3.10.2 系统默认异常处理 64
3.11 缓解策略 65
3.11.1 W^X 65
3.11.2 Canaries 65
3.12 本章小结 65
3.13 阅读材料 66
第4章 动态内存管理 67
4.1 动态内存管理 67
4.2 常见的动态内存管理错误 69
4.2.1 初始化 69
4.2.2 检查返回值失败 70
4.2.3 引用已释放的内存 71
4.2.4 多次释放内存 72
4.2.5 不匹配的内存管理函数 73
4.2.6 未正确区分标量和数组 73
4.2.7 对分配函数的不当使用 73
4.3 Doug Lea的内存分配器 74
4.3.1 内存管理 74
4.3.2 缓冲区溢出 76
4.3.3 双重释放漏洞 80
4.3.4 写入已释放的内存 83
4.4 RtlHeap 83
4.4.1 Win32中的内存管理 83
4.4.2 RtlHeap的数据结构 85
4.4.3 缓冲区溢出 88
4.4.4 缓冲区溢出(再回顾) 89
4.4.5 写入已释放内存 92
4.4.6 双重释放 92
4.4.7 look-aside表 95
4.5 缓解策略 95
4.5.1 空指针 95
4.5.2 一致的内存管理约定 96
4.5.3 堆完整性检测 96
4.5.4 phkmalloc 97
4.5.5 随机化 98
4.5.6 哨位页 98
4.5.7 OpenBSD 98
4.5.8 运行时分析工具 99
4.5.9 Windows XP SP2 100
4.6 著名的漏洞 101
4.6.1 CVS缓冲区溢出漏洞 102
4.6.2 微软数据访问组件(MDAC) 102
4.6.3 CVS服务器双重释放漏洞 103
4.6.4 MIT Kerberos 5中的漏洞 103
4.7 本章小结 103
4.8 阅读材料 103
第5章 整数安全 105
5.1 整数 105
5.1.1 整数表示法 106
5.1.2 整数类型 106
5.1.3 整数取值范围 108
5.2 整型转换 109
5.2.1 整型提升 109
5.2.2 整数转换级别 109
5.2.3 从无符号整型转换 111
5.2.4 从带符号整型转换 112
5.2.5 带符号或无符号字符 113
5.2.6 普通算术转换 113
5.3 整数错误情形 113
5.3.1 整数溢出 114
5.3.2 符号错误 115
5.3.3 截断错误 115
5.4 整数操作 116
5.4.1 加法 117
5.4.2 减法 119
5.4.3 乘法 120
5.4.4 除法 122
5.5 漏洞 126
5.5.1 整数溢出 126
5.5.2 符号错误 127
5.5.3 截断错误 128
5.6 非异常的整数逻辑错误 129
5.7 缓解策略 130
5.7.1 范围检查 130
5.7.2 强类型 131
5.7.3 编译器运行时检查 131
5.7.4 安全的整数操作 132
5.7.5 任意精度的算术 136
5.7.6 测试 137
5.7.7 源代码审查 137
5.8 著名的漏洞 137
5.8.1 XDR库 137
5.8.2 Windows DirectX MIDI库 138
5.8.3 bash 138
5.9 本章小结 139
5.10 阅读材料 140
第6章 格式化输出 141
6.1 变参函数 142
6.1.1 ANSI C标准参数 142
6.1.2 Unix System V Varargs 144
6.2 格式化输出函数 144
6.2.1 格式字符串 145
6.2.2 GCC 147
6.2.3 Visual C++.NET 147
6.3 对格式化输出函数的漏洞利用 148
6.3.1 缓冲区溢出 148
6.3.2 输出流 149
6.3.3 使程序崩溃 149
6.3.4 查看栈内容 150
6.3.5 查看内存内容 151
6.3.6 覆写内存 152
6.3.7 国际化 156
6.4 栈随机化 156
6.4.1 阻碍栈随机化 156
6.4.2 以双字的格式写地址 157
6.4.3 直接参数存取 158
6.5 缓解策略 160
6.5.1 静态内容的动态使用 160
6.5.2 限制字节写入 161
6.5.3 ISO/IEC TR 24731 162
6.5.4 iostream与stdio 162
6.5.5 测试 163
6.5.6 编译器检查 164
6.5.7 词法分析 164
6.5.8 静态污点分析 164
6.5.9 调整变参函数的实现 165
6.5.10 Exec Shield 166
6.5.11 FormatGuard 166
6.5.12 Libsafe 167
6.5.13 静态二进制分析 167
6.6 著名的漏洞 168
6.6.1 华盛顿大学FTP Daemon 168
6.6.2 CDE ToolTalk 168
6.7 本章小结 169
6.8 阅读材料 170
第7章 文件I/O 171
7.1 并发 171
7.1.1 竞争条件 171
7.1.2 互斥和死锁 172
7.2 检查时间和使用时间 173
7.3 作为锁的文件和文件锁定 174
7.4 文件系统利用 176
7.4.1 符号链接利用 176
7.4.2 临时文件打开利用 178
7.4.3 unlink()竞争利用 180
7.4.4 受信文件名 180
7.4.5 非唯一的临时文件名 181
7.5 缓解策略 181
7.5.1 关闭竞争窗口 182
7.5.2 消除竞争对象 184
7.5.3 控制对竞争对象的访问 187
7.5.4 竞争侦测工具 188
7.6 本章小结 189
第8章 推荐的实践 190
8.1 安全的软件开发原则 191
8.1.1 机制经济性原则 192
8.1.2 失败-保险默认原则 192
8.1.3 完全仲裁原则 192
8.1.4 开放式设计原则 192
8.1.5 特权分离原则 192
8.1.6 最小特权原则 193
8.1.7 最少公共机制原则 193
8.1.8 心理可接受性原则 194
8.2 系统质量需求工程 194
8.3 威胁建模 195
8.4 使用/误用案例 196
8.5 架构与设计 196
8.6 现成软件 198
8.6.1 现有代码中的漏洞 198
8.6.2 安全的包装器 199
8.7 编译器检查 199
8.8 输入验证 200
8.9 数据净化 201
8.9.1 黑名单 201
8.9.2 白名单 202
8.9.3 测试 203
8.10 静态分析 203
8.10.1 Fortify 203
8.10.2 Prexis 204
8.10.3 Prevent 204
8.10.4 PREfix和PREfast 205
8.11 质量保证 205
8.11.1 渗透测试 205
8.11.2 模糊测试 206
8.11.3 代码审计 206
8.11.4 开发人员准则与检查清单 206
8.11.5 独立安全审查 207
8.12 内存权限 207
8.12.1 W^X 207
8.12.2 PaX 208
8.12.3 数据执行防护 208
8.13 深层防御 209
8.14 TSP-Secure 209
8.14.1 计划和跟踪 209
8.14.2 质量管理 210
8.15 本章小结 211
8.16 阅读材料 211
参考文献 212
缩略语 223
《Python一行流:像专家一样写代码》内容简介:本书专注于从初学迈向进阶的Python编码技术:如何像专家一样写出优雅、准确、简洁高
《插画设计高级教程Illustration》以国际的视角检验了现代插画艺术中插画题材的运用尺度,并提供了制作一件插画作品所需的理论及
《网站开发案例课堂:HTML5+CSS3+JavaScript网页设计案例课堂》作者根据在长期教学中积累的网页设计教学经验,完整、详尽地介绍H
作为引领移动技术潮流的软件平台,Android发布了NDK以支持Java和C的混合开发,使PC游戏可以在Android平台上焕发更多魅力。本书是
《疯狂XML讲义》主要以XML为核心,深入地介绍了XML的各种相关知识。《疯狂XML讲义》作为疯狂Java体系图书之一,依然保持该体系图
《神神鬼鬼》内容简介:《神神鬼鬼》堪称名人谈鬼神的合集,由陈平原选编而成。节录了现当代文学史上如茅盾、周作人、梁实秋、老舍
《文字设计的原理》内容简介:在平面设计中,文字设计的重要性无需多说。各种设计作品中都要添加文字。而文字又是信息传递的重要
为了彻底理解是什么使得Linux能正常运行以及其为何能在各种不同的系统中运行良好,你需要深入研究内核最本质的部分。内核处理CPU
《辽金元诗鉴赏》内容简介:本书是以辽金元三代的诗歌作品——包含诗、词、曲为基础,而编选、注释、鉴赏的广义诗选。共选择经典作
《数据化运营速成手册》内容简介:《数据化运营速成手册》用于提升互联网公司员工的数据应用能力,即数据化运营能力。首先,从最常
经典实例学设计-UG NX 10.0从入门到精通-(含1DVD) 本书特色 《经典实例学设计UG NX10.0从入门到精通》基于UGNX10.0中文版编写,共9...
《时光与你:唯美人像摄影与后期养成攻略》内容简介:关于摄影的知识纷繁而复杂,并没有一条特定的逻辑线贯穿始终,而本书所梳理的
《声学基础》声学是一门既古老又迅速发展着的学科,近年来已渗透到几乎所有重要的自然科学和工程技术领域,并已融入于当代科学技
本书介绍如何设计和构建自己的计算机游戏。书中从零开始,引导读者开发一个“即插即用”的游戏引擎,并基于该引擎,循序渐进地开
《犯罪参与论》内容简介:本书是对犯罪参与这一刑法学中复杂的重要基础理论问题进行全面系统深入论述的学术专著。其在对我国刑法采
《设计思维:有效的设计沟通和创意策略》旨在介绍设计思维的概况.包括设计进程的每一个阶段:设计师在产生和完善构思时,主要考虑
本书以IEEE802系列标准为主介绍局域网与城域网的相关技术,涉及lOMbps以太网、快速以太网、千兆位以太网、万兆位以太网、交换式以
《DirectX9.03D游戏开发编程基础》主要介绍如何使用DirectX9.0开发交互式3D图形程序,重点是游戏开发。全书首先介绍了必要的数学
◆腾讯P4专家产品经理倾力推荐!◆揭开腾讯内部亿级产品的“产品内功”。◆解密腾讯如何成为“产品经理的黄埔军校”。◆向腾讯学
本书是日本平面设计师小矶裕司在自己所参与的设计项目过程中,对设计理念、设计执行所发出的诚恳思考。全书分为三大篇章,分别介