C和C++安全编码

C和C++安全编码 pdf epub mobi txt 电子书 下载 2026

出版者:机械工业出版社
作者:Robert C. Seacord
出品人:
页数:377
译者:卢涛
出版时间:2013-12-24
价格:79.00
装帧:
isbn号码:9787111442790
丛书系列:华章程序员书库
图书标签:
  • C++
  • 编程
  • 安全
  • 软件漏洞
  • C
  • C语言
  • 程序员
  • 软件开发
  • C++
  • 安全编码
  • 缓冲区溢出
  • 代码安全
  • 漏洞分析
  • 安全编程
  • 内存安全
  • 静态分析
  • 动态分析
  • 软件安全
  • C语言
想要找书就要到 小哈图书下载中心
立刻按 ctrl+D收藏本页
你会得到大惊喜!!

具体描述

塞克德所著的《C和C++安全编码(原书第2版)》是C/C++安全编码领域的权威著作,被视为“标准”参考书,由国际资深软件安全专家撰写,美国CERT主管亲自作序推荐。本书结合国际标准C11和C++11,以及C和C++语言的最新发展,既详细阐述了C/C++语言及其相关库固有的安全问题和陷阱,系统总结了导致软件漏洞的各种常见编码错误,并给出了应对错误的解决方案;又对C/C++软件中常见漏洞的危害、被利用方式、检测方法和应对之道进行了全方位讲解,包含大量编码练习,实践性强。

《C和C++安全编码(原书第2版)》从C和C++语言的各个部分分别介绍了可能导致安全问题的软件漏洞:第1章介绍安全术语和概念,并指出为何C和C++程序中存在如此多的漏洞。第2章描述C和C++中的字符串操作、常见的安全缺陷以及由此导致的漏洞。第3章介绍任意内存写漏洞利用方式,它允许攻击者对内存中任意位置的一个地址进行写操作。第4章描述动态内存管理,讨论了动态分配的缓冲区溢出、写入已释放内存,以及重复释放漏洞。第5章讨论整数安全问题(即与整数操作相关的安全议题),包括整数溢出、符号错误以及截断错误等。第6章描述格式化输出函数的正确和错误的用法,对因这些函数的错误使用所导致的格式字符串和缓冲区溢出漏洞都有讨论。第7章重点介绍并发和可能导致死锁、竞争条件和无效的内存访问序列的漏洞。第8章描述和文件I/O相关的常见漏洞,包括竞争条件和检查时间与使用时间漏洞。第9章推荐一些可以整体改善C/C++应用程序安全性的具体开发实践,这些建议是对每一章中用于解决特定漏洞问题的推荐做法的补充。

作者简介

目录信息

译者序

前言
致谢
第1章 夹缝求生 1
1.1 衡量危险 4
1.1.1 损失的现状 4
1.1.2 威胁的来源 6
1.1.3 软件安全 7
1.2 安全概念 8
1.2.1 安全策略 9
1.2.2 安全缺陷 10
1.2.3 漏洞 10
1.2.4 漏洞利用 11
1.2.5 缓解措施 12
1.3 C和C++ 12
1.3.1 C和C++简史 13
1.3.2 C存在的问题 14
1.3.3 遗留代码 17
1.3.4 其他语言 17
1.4 开发平台 17
1.4.1 操作系统 18
1.4.2 编译器 18
1.5 小结 18
1.6 阅读材料 19
第2章 字符串 20
2.1 字符串 20
2.1.1 字符串数据类型 20
2.1.2 UTF-8 22
2.1.3 宽字符串 23
2.1.4 字符串字面值 23
2.1.5 C++中的字符串 25
2.1.6 字符类型 26
2.1.7 计算字符串大小 27
2.2 常见的字符串操作错误 29
2.2.1 无界字符串复制 29
2.2.2 差一错误 32
2.2.3 空字符结尾错误 33
2.2.4 字符串截断 34
2.2.5 与函数无关的字符串错误 34
2.3 字符串漏洞及其利用 35
2.3.1 被污染的数据 35
2.3.2 IsPasswordOK()的安全缺陷 36
2.3.3 缓冲区溢出 37
2.3.4 进程内存组织 37
2.3.5 栈管理 38
2.3.6 栈溢出 40
2.3.7 代码注入 44
2.3.8 弧注入 47
2.3.9 返回导向编程 48
2.4 字符串漏洞缓解策略 49
2.4.1 字符串处理 49
2.4.2 C11附录K边界检查接口 50
2.4.3 动态分配函数 52
2.4.4 C++ std::basic_string 54
2.4.5 使字符串对象的引用失效 55
2.4.6 使用basic_string的其他常见错误 57
2.5 字符串处理函数 57
2.5.1 gets() 57
2.5.2 C99 57
2.5.3 C11附录K边界检查接口:gets_s() 59
2.5.4 动态分配函数 60
2.5.5 strcpy()和strcat() 61
2.5.6 C99 61
2.5.7 strncpy()和strncat() 64
2.5.8 memcpy()和memmove() 68
2.5.9 strlen() 68
2.6 运行时保护策略 69
2.6.1 检测和恢复 69
2.6.2 输入验证 70
2.6.3 对象大小检查 70
2.6.4 Visual Studio中编译器生成的运行时检查 73
2.6.5 栈探测仪 74
2.6.6 栈溢出保护器 75
2.6.7 操作系统策略 76
2.6.8 检测和恢复 76
2.6.9 不可执行栈 77
2.6.10 W^X 77
2.6.11 PaX 79
2.6.12 未来发展方向 79
2.7 著名的漏洞 80
2.7.1 远程登录 80
2.7.2 Kerberos 81
2.8 小结 81
2.9 阅读材料 82
第3章 指针诡计 83
3.1 数据位置 83
3.2 函数指针 84
3.3 对象指针 85
3.4 修改指令指针 86
3.5 全局偏移表 87
3.6 .dtors区 89
3.7 虚指针 90
3.8 atexit()和on_exit()函数 91
3.9 longjmp()函数 93
3.10 异常处理 94
3.10.1 结构化异常处理 94
3.10.2 系统默认异常处理 96
3.11 缓解策略 96
3.11.1 栈探测仪 96
3.11.2 W^X 97
3.11.3 对函数指针编码和解码 97
3.12 小结 98
3.13 阅读材料 98
第4章 动态内存管理 99
4.1 C内存管理 100
4.1.1 C标准内存管理函数 100
4.1.2 对齐 101
4.1.3 alloca()和变长数组 102
4.2 常见的C内存管理错误 103
4.2.1 初始化错误 103
4.2.2 未检查返回值 104
4.2.3 Null或无效指针解引用 106
4.2.4 引用已释放内存 106
4.2.5 多次释放内存 107
4.2.6 内存泄漏 108
4.2.7 零长度分配 108
4.2.8 DR # 400 110
4.3 C++的动态内存管理 110
4.3.1 分配函数 111
4.3.2 释放函数 115
4.3.3 垃圾回收 115
4.4 常见的C++内存管理错误 117
4.4.1 未能正确检查分配失败 117
4.4.2 不正确配对的内存管理函数 118
4.4.3 多次释放内存 120
4.4.4 释放函数抛出一个异常 123
4.5 内存管理器 123
4.6 Doug Lea的内存分配器 124
4.7 双重释放漏洞 131
4.7.1 写入已释放的内存 134
4.7.2 RtlHeap 135
4.7.3 缓冲区溢出(终极版) 140
4.8 缓解策略 146
4.8.1 空指针 146
4.8.2 一致的内存管理约定 146
4.8.3 phkmalloc 147
4.8.4 随机化 148
4.8.5 OpenBSD 148
4.8.6 jemalloc内存管理器 149
4.8.7 静态分析 149
4.8.8 运行时分析工具 150
4.9 值得注意的漏洞 153
4.9.1 CVS缓冲区溢出漏洞 153
4.9.2 Microsoft数据访问组件 153
4.9.3 CVS服务器双重释放漏洞 154
4.9.4 MIT Kerberos 5中的漏洞 154
4.10 小结 154
第5章 整数安全 155
5.1 整数安全导论 155
5.2 整数数据类型 156
5.2.1 无符号整数类型 156
5.2.2 回绕 157
5.2.3 有符号整数类型 159
5.2.4 有符号整数的取值范围 162
5.2.5 整数溢出 163
5.2.6 字符类型 165
5.2.7 数据模型 165
5.2.8 其他整数类型 166
5.3 整数转换 169
5.3.1 转换整数 169
5.3.2 整数转换级别 169
5.3.3 整数类型提升 170
5.3.4 普通算术转换 171
5.3.5 由无符号整数类型转换 171
5.3.6 由有符号整数类型转换 173
5.3.7 转换的影响 176
5.4 整数操作 176
5.4.1 赋值 177
5.4.2 加法 179
5.4.3 减法 183
5.4.4 乘法 185
5.4.5 除法和求余 188
5.4.6 移位 192
5.5 整数漏洞 194
5.5.1 漏洞 194
5.5.2 回绕 194
5.5.3 转换和截断错误 196
5.5.4 非异常的整数逻辑错误 197
5.6 缓解策略 198
5.6.1 整数类型的选择 198
5.6.2 抽象数据类型 200
5.6.3 任意精度算术 200
5.6.4 范围检查 201
5.6.5 前提条件和后验条件测试 203
5.6.6 安全整数库 204
5.6.7 溢出检测 205
5.6.8 编译器生成的运行时检查 206
5.6.9 可验证范围操作 207
5.6.10 仿佛无限范围整数模型 208
5.6.11 测试与分析 208
5.7 小结 210
第6章 格式化输出 211
6.1 变参函数 212
6.2 格式化输出函数 214
6.2.1 格式字符串 215
6.2.2 GCC 216
6.2.3 Visual C++ 217
6.3 对格式化输出函数的漏洞利用 217
6.3.1 缓冲区溢出 218
6.3.2 输出流 219
6.3.3 使程序崩溃 219
6.3.4 查看栈内容 219
6.3.5 查看内存内容 221
6.3.6 覆写内存 222
6.3.7 国际化 226
6.3.8 宽字符格式字符串漏洞 226
6.4 栈随机化 226
6.4.1 阻碍栈随机化 227
6.4.2 以双字的格式写地址 227
6.4.3 直接参数访问 228
6.5 缓解策略 230
6.5.1 排除用户输入的格式字符串 230
6.5.2 静态内容的动态使用 230
6.5.3 限制字节写入 231
6.5.4 C11附录K边界检查接口 232
6.5.5 iostream与stdio 233
6.5.6 测试 234
6.5.7 编译器检查 234
6.5.8 静态污点分析 234
6.5.9 调整变参函数的实现 235
6.5.10 Exec Shield 236
6.5.11 FormatGuard 236
6.5.12 静态二进制分析 237
6.6 著名的漏洞 238
6.6.1 华盛顿大学FTP Daemon 238
6.6.2 CDE ToolTalk 238
6.6.3 Ettercap NG-0.7.2版 238
6.7 小结 239
6.8 阅读材料 240
第7章 并发 241
7.1 多线程 241
7.2 并行 242
7.2.1 数据并行 243
7.2.2 任务并行 245
7.3 性能目标 245
7.4 常见错误 247
7.4.1 竞争条件 247
7.4.2 损坏的值 248
7.4.3 易变的对象 249
7.5 缓解策略 250
7.5.1 内存模型 251
7.5.2 同步原语 253
7.5.3 线程角色分析(研究) 259
7.5.4 不可变的数据结构 260
7.5.5 并发代码属性 261
7.6 缓解陷阱 261
7.6.1 死锁 262
7.6.2 过早释放锁 266
7.6.3 争用 267
7.6.4 ABA问题 268
7.7 值得注意的漏洞 272
7.7.1 在多核动态随机访问存储器系统中的DoS攻击 272
7.7.2 系统调用包装器中的并发漏洞 272
7.8 小结 273
第8章 文件I/O 275
8.1 文件I/O基础 275
8.1.1 文件系统 275
8.1.2 特殊文件 277
8.2 文件I/O接口 278
8.2.1 数据流 278
8.2.2 打开和关闭文件 279
8.2.3 POSIX 280
8.2.4 C++中的文件I/O 281
8.3 访问控制 282
8.3.1 UNIX文件权限 282
8.3.2 进程特权 284
8.3.3 更改特权 285
8.3.4 管理特权 288
8.3.5 管理权限 292
8.4 文件鉴定 295
8.4.1 目录遍历 295
8.4.2 等价错误 297
8.4.3 符号链接 298
8.4.4 规范化 300
8.4.5 硬链接 302
8.4.6 设备文件 304
8.4.7 文件属性 306
8.5 竞争条件 308
8.5.1 检查时间和使用时间 308
8.5.2 创建而不替换 309
8.5.3 独占访问 312
8.5.4 共享目录 313
8.6 缓解策略 315
8.6.1 关闭竞争窗口 315
8.6.2 消除竞争对象 319
8.6.3 控制对竞争对象的访问 320
8.6.4 竞争检测工具 322
8.7 小结 322
第9章 推荐的实践 324
9.1 安全开发生命周期 324
9.1.1 TSP-Secure 326
9.1.2 计划和跟踪 327
9.1.3 质量管理 328
9.2 安全培训 329
9.3 要求 330
9.3.1 安全编码标准 330
9.3.2 安全质量需求工程 330
9.3.3 用例/误用例 332
9.4 设计 333
9.4.1 安全的软件开发原则 334
9.4.2 威胁建模 337
9.4.3 分析攻击面 338
9.4.4 现有代码中的漏洞 338
9.4.5 安全包装器 339
9.4.6 输入验证 339
9.4.7 信任边界 340
9.4.8 黑名单 342
9.4.9 白名单 343
9.4.10 测试 343
9.5 实现 344
9.5.1 编译器检查 344
9.5.2 仿佛无限范围整数模型 345
9.5.3 有安全保证的C/C++ 345
9.5.4 静态分析 346
9.5.5 源代码分析实验室 348
9.5.6 深层防御 349
9.6 验证 350
9.6.1 静态分析 350
9.6.2 渗透测试 350
9.6.3 模糊测试 351
9.6.4 代码审计 352
9.6.5 开发人员准则与检查清单 352
9.6.6 独立安全审查 353
9.6.7 攻击面回顾 353
9.7 小结 354
9.8 阅读材料 354
参考文献 355
缩略语 373
· · · · · · (收起)

读后感

评分

看到有友人评论这本书卖得太贵,忍不住说几句。这本书作者是CERT专门负责分析漏洞的研究人员,书里面很清晰的整理了各类软件漏洞成因,给的例子非常的合适,应该是一看就能看懂,但是又不失深度。如果把里面的基本内容都烂熟于心,基本上可以去开始CTF或者初级漏洞挖掘了。 再...

评分

书很好,翻译很垃圾,垃圾到我特意来评论。举例:在软件安全领域,一个值称作被污染的,如果他的来源是不受信任的(程序的控制之外),并且没有背景画,以确保它符合该值的使用者要求的任何约束,例如,所有的字符串都要求是空字符结尾的约束。一字不差,你翻译的是个屁。推荐...  

评分

书很好,翻译很垃圾,垃圾到我特意来评论。举例:在软件安全领域,一个值称作被污染的,如果他的来源是不受信任的(程序的控制之外),并且没有背景画,以确保它符合该值的使用者要求的任何约束,例如,所有的字符串都要求是空字符结尾的约束。一字不差,你翻译的是个屁。推荐...  

评分

书很好,翻译很垃圾,垃圾到我特意来评论。举例:在软件安全领域,一个值称作被污染的,如果他的来源是不受信任的(程序的控制之外),并且没有背景画,以确保它符合该值的使用者要求的任何约束,例如,所有的字符串都要求是空字符结尾的约束。一字不差,你翻译的是个屁。推荐...  

评分

看到有友人评论这本书卖得太贵,忍不住说几句。这本书作者是CERT专门负责分析漏洞的研究人员,书里面很清晰的整理了各类软件漏洞成因,给的例子非常的合适,应该是一看就能看懂,但是又不失深度。如果把里面的基本内容都烂熟于心,基本上可以去开始CTF或者初级漏洞挖掘了。 再...

用户评价

评分

这本书对现代C++特性(如RAII、智能指针)在提升安全性方面的贡献给予了高度的肯定,但同时也毫不留情地指出了过度依赖这些抽象层可能带来的新陷阱。作者的观点是:工具是好东西,但理解工具背后的原理才是关键。我特别欣赏它对移动语义和异常安全性的深入分析,这在C++11/14/17标准发布后显得尤为重要。比如,它探讨了在异常抛出时,自定义的内存分配器或资源管理器如何可能导致双重释放或资源泄漏的复杂场景。这已经超出了普通C++教程的范畴,直接触及到了高性能、高可靠性软件的核心。总而言之,这本书不仅帮你修复旧代码中的错误,更重要的是,它塑造了一种全新的、以安全为先验条件的编程思维模式,让我在未来编写任何C或C++代码时,都能自然而然地考虑到潜在的风险点。

评分

作为一个从业多年的嵌入式系统工程师,我一直在寻找一本能够桥接底层硬件交互与高层安全逻辑的参考书,这本书正好填补了我的空白。它对I/O操作的安全处理,尤其是竞态条件(Race Condition)的分析,简直是教科书级别的。作者展示了如何使用原子操作、锁和无锁数据结构来确保多线程环境下的数据一致性和安全性,并且清晰地指出了在不同操作系统API下实现这些机制的细微差别。我尤其对它讨论的资源管理,比如文件描述符泄漏和内存池碎片化对安全性的潜在影响印象深刻。很多时候,我们忙于修复明显的缓冲区溢出,却忽略了这些缓慢积累的“慢性病”。这本书的视角非常全面,它教会你如何构建一个具有韧性的系统,而不是仅仅打补丁。如果你在开发操作系统内核模块、驱动程序或者任何需要直接与硬件打交道的代码,这本书绝对能为你节省无数个排查Bug的夜晚。

评分

天呐,我简直不敢相信这本书的深度和广度!这本书对现代软件开发中的安全漏洞的剖析细致入微,从最基础的内存管理错误,到更高级别的并发问题,几乎涵盖了所有你可能在C/C++项目中遇到的安全陷阱。作者的讲解方式不是那种干巴巴的理论堆砌,而是通过大量的实际代码示例和攻击场景来演示问题所在。我记得有一章专门讲缓冲区溢出的防御,不仅仅是停留在 `strcpy` 这种老生常谈的函数上,而是深入到栈保护机制(如 Canary)的原理,以及如何通过编译器优化和链接器设置来加强二进制的安全性。阅读体验非常棒,感觉就像是跟着一位经验极其丰富的安全架构师进行一对一的辅导。对于希望将代码质量提升到工业级安全标准的开发者来说,这本书无疑是一本必备的圣经。它强迫你重新审视那些你以为自己已经掌握了的底层知识,每一次阅读都能带来新的顿悟。这本书的价值远超其定价,绝对物超所值。

评分

这本书的结构安排得极其精巧,它成功地在“理论深度”和“实践指导”之间找到了完美的平衡点。我特别欣赏它对“最小权限原则”在系统编程中应用的探讨,这一点在很多安全书籍中往往被一带而过。作者不仅解释了为什么应该遵循这个原则,还用具体的Linux系统调用(如 `chroot`、Setuid/Setgid 位)演示了如何在应用程序层面实现精细的权限控制。更不用说,关于整数溢出和下溢的章节,它没有止步于简单的加减法检查,而是深入到了不同位宽的算术运算在不同架构下的微妙差异,这对于编写跨平台代码的工程师来说简直是雪中送炭。我甚至发现了一些我过去在项目中为了追求性能而牺牲安全性的地方,这本书给了我一个强有力的理由去重构那些代码。读完之后,我感觉自己对程序执行模型的理解又深了一层,不再仅仅是把C/C++当作一门“写完就走”的语言,而是将其视为一个需要时刻保持警惕的精密仪器。

评分

我必须说,这本书的排版和示例代码的质量令人赞叹。通常,技术书籍的代码示例要么过于简化,要么就是晦涩难懂的大段粘贴。然而,这里的每一个代码片段都像是精心雕琢过的艺术品,它们不仅能跑起来,而且每一个变量的命名、每一个函数的结构都清晰地服务于它想要展示的安全概念。例如,在讨论格式化字符串漏洞时,作者不仅展示了如何利用它来泄露栈信息,还详细解释了底层`printf`函数内部处理格式化指令的过程,这对于理解攻击链的每一步至关重要。这本书的风格非常务实,它避免了过多的学术术语,而是用直观的语言将复杂的概念转化为工程师可以立即应用到工作中的策略。读起来完全没有压力,反而有一种“茅塞顿开”的愉悦感,极大地提高了我的编程自信心。

评分

书很好,翻译很垃圾,垃圾到我特意来评论。举例:在软件安全领域,一个值称作被污染的,如果他的来源是不受信任的(程序的控制之外),并且没有背景画,以确保它符合该值的使用者要求的任何约束,例如,所有的字符串都要求是空字符结尾的约束。一字不差,你翻译的是个屁。

评分

对C/C++的编码漏洞有非常详细的说明,后续针对每一个知识点需要深入研究。

评分

挺不错,里面总结的很到位,而且对漏洞的演示举例很不错

评分

挺不错,里面总结的很到位,而且对漏洞的演示举例很不错

评分

对C/C++的编码漏洞有非常详细的说明,后续针对每一个知识点需要深入研究。

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2026 qciss.net All Rights Reserved. 小哈图书下载中心 版权所有