具体描述
本书被誉为安全技术领域的“黄帝内经”,由安全技术大师亲力打造,畅销全球,数位安全技术专家联袂推荐。综合论述如何在软件开发整个生命周期内建立安全屏障,对于设计安全的软件给出了高屋建瓴的指南,全面翔实,深入浅出。对于任何关注安全软件开发的人来说,都是一本必备之书。
本书分为两大部分。第一部分介绍在编写代码之前应该了解的软件安全知识,讲解如何在软件工程的实践中引入安全性,任何涉及软件开发的人都应该阅读。主要内容包括:软件安全概论、软件安全风险管理、技术的选择、开放源代码和封闭源代码、软件安全的指导原则、软件审计。第二部分涉及软件开发实现的细节,介绍如何在编程中避免一些常见的安全问题,适合编程一线的技术人员参考。主要内容包括:缓冲区溢出、访问控制、竞争条件、随机性和确定性、密码学的应用、信任管理和输入验证、口令认证、数据库安全、客户端安全、穿越防火墙等。
作者简介
作者简介
John Viega 美国安全软件解决方案公司(www.securesw.com)的CTO,是软件安全领域知名的专家。他设计并发布了安全领域内的许多工具,包括代码扫描器(ITS4和RATS)、随机数套件(EGADS)、自动修补工具以及安全编程库等。他还是Mailman的原始开发者、GNU邮件列表的管理者。
Gary McGraw 美国Cigital公司的CTO,在安全风险管理领域从事软件安全性研究和技术规划工作。他是美国空军研究实验室、DARPA、美国国家科学基金以及NIST高级技术项目的资助对象和首席调研员。曾经撰写了多本信息安全技术图书。
译者简介
殷丽华 博士,IEEE会员,现任职于中国科学院信息工程研究所。主持和参加国家973、863、自然科学基金、发改委安全产品专项等多项国家级重大项目,具有丰富的软件开发与组织管理经验。研究领域包括网络与信息安全、安全性分析、物联网安全技术等。
张冬艳 博士,计算机学会会员,任职于北京科技大学计算机与通信工程学院,承担或参与了多项相关领域的重大课题,积累了丰富的项目开发与管理经验。主要研究方向是网络与信息安全、基于P2P网络的多媒体传输等。
郭云川 博士,曾参与多项国家级网络与信息安全项目建设,目前主要从事物联网隐私保护研发工作。主要研究方向为安全分析、物联网安全技术、形式化方法等。
颜子夜 博士,曾参与分布式、嵌入式、高性能计算等类型的多个软件系统的开发工作,目前主要从事医学图像处理研究和大型医疗装备系统的开发工作。
目录信息
对本书的赞誉
序
前言
致谢
第1章 软件安全概论 1
1.1 都是软件惹的祸 1
1.2 对安全问题的处理 4
1.2.1 Bugtraq 5
1.2.2 CERT 公告 5
1.2.3 RISKS文摘 6
1.3 影响软件安全的技术趋势 6
1.4 非功能性需求 9
1.4.1 什么是安全 10
1.4.2 难道只是可靠性 10
1.5 “渗透-修补”是个坏方法 11
1.6 艺术和工程 12
1.7 安全目标 12
1.7.1 预防 13
1.7.2 跟踪与审计 13
1.7.3 监控 13
1.7.4 隐私和保密 14
1.7.5 多级安全 14
1.7.6 匿名 14
1.7.7 认证 15
1.7.8 完整性 16
1.8 常见软件安全缺陷 16
1.9 软件项目目标 17
1.10 结论 18
第2章 软件安全风险管理 19
2.1 软件安全风险管理概述 19
2.2 安全人员的任务 21
2.3 软件生命周期中的软件安全人员 22
2.3.1 获取需求 22
2.3.2 风险评估 23
2.3.3 安全设计 24
2.3.4 实现 25
2.3.5 安全测试 25
2.4 现实的权衡 26
2.5 让人们去思考安全性 26
2.6 软件风险管理实践 26
2.6.1 当开发走向歧途 27
2.6.2 当安全分析走向歧途 27
2.7 通用准则 28
2.8 结论 30
第3章 技术的选择 31
3.1 语言的选择 31
3.2 分布式对象平台的选择 34
3.2.1 COBRA 34
3.2.2 DCOM 35
3.2.3 EJB和RMI 37
3.3 操作系统的选择 37
3.4 认证技术 38
3.4.1 基于主机的认证 39
3.4.2 物理令牌 40
3.4.3 生物认证 40
3.4.4 密码认证 41
3.4.5 深度防御与认证 41
3.5 结论 42
第4章 开放源代码和封闭源代码 43
4.1 通过隐藏实现安全 43
4.1.1 逆向工程 45
4.1.2 代码混淆 46
4.1.3 紧包软件的安全 47
4.1.4 通过隐藏实现安全并非万能 47
4.2 开源软件 47
4.3 “多眼球现象”是真的吗 47
4.3.1 漏洞检测是困难的 49
4.3.2 其他的忧虑 50
4.4 关于发布加密算法 51
4.5 另外两个关于开源的谬论 51
4.5.1 微软谬论 51
4.5.2 Java谬论 52
4.6 例子:GNU Mailman的安全 52
4.7 证据:特洛伊木马 53
4.8 开放源码还是不开放源码 54
4.9 另一个来自于缓冲区溢出的安全教训 54
4.10 忠告 55
4.11 结论 55
第5章 软件安全的指导原则 56
5.1 确保最薄弱环节的安全 57
5.2 深度防御 59
5.3 失效安全 60
5.4 最小特权 62
5.5 分割 63
5.6 尽可能简单 64
5.7 提升隐私权 66
5.8 记住隐藏信息很困难 68
5.9 不要轻信 69
5.10 使用社会资源 70
5.11 结论 70
第6章 软件审计 71
6.1 架构的安全性分析 73
6.1.1 攻击树 74
6.1.2 报告分析结果 78
6.2 实现安全性分析 79
6.2.1 审计源代码 79
6.2.2 源码级的安全审计工具 80
6.2.3 在分析中使用RATS 81
6.2.4 安全扫描软件的有效性 82
6.3 结论 83
第7章 缓冲区溢出 84
7.1 什么是缓冲区溢出 86
7.2 为什么缓冲溢出是安全问题 87
7.3 缓冲区溢出的防御 89
7.4 主要的陷阱 89
7.5 内部缓冲区溢出 93
7.6 更多的输入溢出 93
7.7 其他风险 94
7.8 帮助工具 94
7.9 堆破坏和栈破坏 96
7.10 堆溢出 98
7.11 栈溢出 101
7.11.1 破译堆栈 101
7.11.2 陷入无限循环……并更糟 105
7.12 代码攻击 113
7.12.1 UNIX漏洞利用 114
7.12.2 关于Windows 119
7.13 结论 119
第8章 访问控制 120
8.1 UNIX访问控制模型 120
8.1.1 UNIX权限工作原理 121
8.1.2 修改文件属性 122
8.1.3 修改文件的所有权 124
8.1.4 umask命令 125
8.1.5 编程接口 125
8.1.6 Setuid编程 127
8.2 Windows NT的访问控制 130
8.3 分割 132
8.4 细粒度权限 134
8.5 结论 134
第9章 竞争条件 135
9.1 什么是竞争条件 135
9.2 检查时间与使用时间 138
9.2.1 攻破passwd 139
9.2.2 避免 TOCTOU 问题 142
9.3 安全的文件访问 143
9.4 临时文件 146
9.5 文件锁定 146
9.6 其他竞争条件 147
9.7 结论 148
第10章 随机性和确定性 149
10.1 伪随机数发生器 149
10.1.1 伪随机数发生器实例 151
10.1.2 Blum-Blum-ShubPRNG 152
10.1.3 Tiny PRNG 153
10.1.4 对PRNG的攻击 153
10.1.5 在网络赌博游戏中作弊 153
10.1.6 PRNG的统计测试 155
10.2 熵的收集和估计 155
10.2.1 硬件解决方案 156
10.2.2 软件解决方案 158
10.2.3 糟糕的熵收集示例 163
10.3 处理熵 164
10.4 实用的随机数据来源 166
10.4.1 Tiny 166
10.4.2 Windows的随机数据 167
10.4.3 Linux的随机数 167
10.4.4 Java中的随机数 169
10.5 结论 171
第11章 密码学的应用 172
11.1 一般性建议 172
11.1.1 开发者并不是密码专家 173
11.1.2 数据完整性 174
11.1.3 密码出口的有关法律 174
11.2 常用密码库 175
11.2.1 Cryptlib 175
11.2.2 OpenSSL 176
11.2.3 Crypto++ 177
11.2.4 BSAFE 178
11.2.5 Cryptix 179
11.3 利用密码学编程 180
11.3.1 加密 180
11.3.2 散列算法 184
11.3.3 公共密钥加密 185
11.3.4 多线程 189
11.3.5 cookie加密 189
11.4 加密散列更多的应用 191
11.5 SSL和TLS 192
11.6 Stunnel 194
11.7 一次一密 195
11.8 结论 198
第12章 信任管理和输入验证 199
12.1 关于信任 200
12.2 不恰当信任的例子 201
12.2.1 信任是传递的 201
12.2.2 预防恶意的调用者 204
12.2.3 安全地调用其他程序 208
12.2.4 源自Web的问题 210
12.2.5 客户端安全 212
12.2.6 Perl问题 214
12.2.7 格式字符串攻击 215
12.3 自动检测输入问题 216
12.4结论 219
第13章 口令认证 220
13.1?口令存储 220
13.2?向口令数据库中添加用户 222
13.3?口令认证的方式 231
13.4?口令选择 235
13.4.1?更多的建议 236
13.4.2?掷骰子 237
13.4.3?口令短语 240
13.4.4?应用程序选择的口令 241
13.5?一次性口令 242
13.6?结论 252
第14章 数据库安全 253
14.1?基础知识 253
14.2?访问控制 254
14.3?在访问控制中使用视图 256
14.4?字段保护 257
14.5?针对统计攻击的安全防卫 260
14.6?结论 263
第15章 客户端安全 264
15.1?版权保护方案 266
15.1.1?许可证文件 273
15.1.2?防范偶然性盗版 274
15.1.3?其他的许可证特性 275
15.1.4?其他的版权保护方案 275
15.1.5?对不可信客户端的身份认证 276
15.2?防篡改 277
15.2.1?反调试措施 277
15.2.2?校验和 279
15.2.3?应对滥用 279
15.2.4?诱饵 280
15.3?代码混淆 280
15.3.1?基本的代码混淆技术 281
15.3.2?加密部分程序 282
15.4?结论 284
第16章 穿越防火墙 285
16.1?基本策略 285
16.2?客户端代理 287
16.3?服务器代理 288
16.4?SOCKS 289
16.5?对等网络 290
16.6?结论 292
附录A 密码学基础 293
参考文献 310
· · · · · · (收起)
读后感
用户评价
这本书的叙事风格非常跳跃,仿佛是多位作者在不同时间点、针对不同受众仓促拼凑而成。我特别感到困惑的是,书中关于加密算法的选择和应用部分。它非常详尽地描述了AES和RSA的工作原理,这部分内容本来是很好的基础知识铺垫。但紧接着,在讨论密钥管理时,作者似乎突然切换了频道,直接跳跃到了讨论使用硬件安全模块(HSM)的必要性,却完全忽略了在资源受限的嵌入式环境或移动应用中,如何安全地存储和使用非对称密钥对这一中间地带的关键实践。这种“要么不用,要么用最顶级的企业级方案”的二元论,使得对于大多数中小型项目开发者来说,实用性大打折扣。更令人不解的是,在讨论代码审计时,它花了大量的篇幅介绍了一些非常小众且已经不再是主流依赖的安全扫描工具的命令行参数,而不是聚焦于如何利用静态分析(SAST)的结果进行有效的故事化(triaging)和优先级排序,比如如何区分真正的安全漏洞和噪音报告,或者如何将SAST的报告结果与业务风险等级挂钩。这种对具体工具的过度聚焦,却对更高层面的决策艺术避而不谈,让这本书显得不够成熟和全面。
这本书的语言风格在不同段落之间存在着巨大的差异,有些段落写得过于学术化,充满了晦涩难懂的缩写,需要频繁查阅附录(如果附录里有的话,这本书的附录也极其简单);而另一些段落则使用了一种过于随意的、甚至带有明显口语化的表达方式,仿佛作者在跟一位新手朋友聊天。这种不一致性极大地干扰了阅读的专注度。尤其是在处理漏洞披露和责任界定时,书中对法律和合规性的描述过于模糊,没有明确区分GDPR、CCPA这类数据隐私法规对软件设计提出的具体强制性要求,而是笼统地提了一句“遵守当地法规”。对于一个自称涵盖“之道”的书籍,这种对合规性要求的轻描淡写是不可接受的,因为在很多行业中,合规性本身就是安全开发的首要驱动力。我希望看到的是如何将这些法规要求,转化为具体的代码实现约束和自动化检查规则,而不是停留在概念层面。总而言之,这本书像是一份缺乏统一编辑指导的、包含了各种零散见解的笔记集合,而不是一本结构严谨的、能够指导实践的专业著作。
这本书的标题《安全软件开发之道》着实吸引了我,我本来对安全编程领域抱有极大的兴趣,希望能找到一本系统、深入地剖析现代软件安全实践的指南。然而,读完之后,我发现这本书的内容与我预期的“道”——那种强调底层原理、设计哲学和长期实践的深度论述——相去甚远。它似乎更像是一本零散的安全工具介绍手册,而不是一本关于如何建立安全心智模型的著作。例如,书中对输入验证的讨论,停留在基本的字符集过滤和长度限制层面,对于更深层次的上下文感知验证、以及如何利用现代框架内置的安全机制来构建健壮的防御体系,几乎没有触及。在Web安全方面,虽然提到了XSS和CSRF,但讲解方式更像是对OWASP Top 10列表的简单复述,缺乏对攻击链的细致分解,以及如何通过安全设计模式(如最小权限原则、纵深防御)来系统性地规避这些风险的指导。读到后面关于模糊测试的部分,我希望能看到一些关于构造有效模糊输入、分析覆盖率和高效处理崩溃报告的实战技巧,但书中仅仅是罗列了几个开源工具的名字,对于如何将这些工具融入持续集成/持续部署(CI/CD)流程以实现“安全左移”,则语焉不详。总体而言,它提供了一些基础知识的碎片,但未能构建起一个连贯、可操作的安全开发蓝图。
这本书的编辑和组织结构实在令人费解,阅读体验极差。不同章节之间逻辑衔接非常生硬,有时甚至会出现概念的重复介绍,但每次介绍的侧重点却不一致,让人怀疑这是否经过了统一的审校。比如,在讲解“最小权限原则”时,某一章强调数据库连接字符串不应包含DROP权限,而另一章在讨论API网关配置时,又以一个与数据库无关的例子来重复说明相同原则,但措辞和示例代码却显得更加过时。我原本期待能找到一个关于“威胁建模”的连贯流程,从资产识别到威胁假设,再到缓解措施的设计与验证。然而,书中对威胁建模的描述被拆散在了好几个不相关的章节中,一会儿是在需求分析时被提及,一会儿又被归类到渗透测试的准备阶段。这使得读者难以形成一个系统的、可复制的威胁建模工作流。此外,书中引用的许多代码示例,比如涉及内存管理和缓冲区操作的部分,使用的是非常老旧的C语言标准库函数,完全没有提及使用现代语言(如Rust或Go)在语言层面提供的内存安全保障,这对于指导当代开发者来说,显得有些脱离实际应用场景。
从技术深度上来看,这本书在我阅读过的相关专业书籍中,处于一个非常尴尬的位置。它既不够入门,因为它假设读者已经了解基本的编程范式和网络协议知识;但它又远不够深入,无法满足专业安全工程师的需求。我最失望的部分是它在“安全文化建设”这一宏大主题下的阐述。标题暗示了“道”的境界,意味着深层次的组织变革和思维模式的转变。然而,书中关于建立安全文化的章节,无非是强调“管理层需要支持”和“培训很重要”这类陈词滥调。它完全没有提供任何可量化的指标(Metrics)来衡量安全成熟度的提升,也没有给出如何在敏捷开发周期中嵌入“安全冠军”(Security Champions)角色、并激励他们持续贡献的有效激励机制。此外,书中对DevSecOps的讨论更是流于表面,仅仅提到了将安全测试集成到Jenkins流水线中,但对于如何处理自动化测试中的假阳性报告、如何确保安全审批环节不成为DevOps流程的瓶颈,这些DevSecOps实践中的核心痛点,都避开了。这本书更像是一个高层汇报的PPT大纲,而非一本可供一线工程师深入研读的指南。
翻译一般。
翻译一般。
翻译一般。
翻译一般。
翻译一般。