《编写安全的代码 第2版》PDF下载

  • 购买积分:15 如何计算积分?
  • 作  者:(美)Michael Howard,(美)David LeBlanc著;程永敬等译
  • 出 版 社:北京:机械工业出版社
  • 出版年份:2005
  • ISBN:7111112105
  • 页数:480 页
图书介绍:本书分五部分介绍了应用程序为什么不安全,构建安全系统的意义及如何构建安全系统。

第一部分 现代安全 2

第1章 对安全系统的需求 2

1.1“疯狂的Web网”上的应用程序 3

1.2可信计算的需要 4

1.3让每个人都参与进来 5

1.3.1巧妙地向企业推销安全 5

1.3.2使用搞破坏的方法 7

1.4灌输安全意识的一些主意 8

1.4.1让老板发一封电子邮件 9

1.4.2任命安全宣传员 9

1.5攻击者的优势和防御者的劣势 12

1.5.1因素1:防御者必须对所有的环节都进行防御,而攻击者可以选择最薄弱的环节 12

1.6本章小结 13

1.5.4因素4:防御者的活动必须遵循相应的规则,而攻击者则可以采用一些卑鄙的手段 13

1.5.3因素3:防御者必须永远保持警惕,而攻击者却可以随意“罢工” 13

1.5.2因素2:防御者只能针对已知的攻击进行防御,而攻击者则可以探测未知的漏洞 13

第2章 主动的安全开发过程 14

2.1不断改进开发过程 15

2.2安全教育的角色 15

2.2.1强制培训的阻力 17

2.2.2不断更新的培训 18

2.2.3安全科学的进步 18

2.2.4教育证明“更多的眼睛”不代表更安全 18

2.2.5有力的证据! 19

2.3设计阶段 19

2.3.1面试期间的安全问题 19

2.3.2定义产品的安全目标 20

2.3.3安全是产品的一种特性 22

2.3.7设置bug门槛 24

2.3.6终结不安全的特性 24

2.3.5安全的设计源于威胁建模 24

2.3.4要有足够的时间考虑安全问题 24

2.3.8安全小组审查 25

2.4开发阶段 25

2.4.1只有核心成员能够查看新代码(签字确认) 25

2.4.2新代码的同级安全审查(签字确认) 25

2.4.3定义安全的编码准则 26

2.4.4审查旧的缺陷 26

2.4.5外部安全审查 26

2.4.6安全推动活动 26

2.4.7留心自己的错误数量 27

2.4.8记录错误 27

2.4.9没有惊喜,也没有圣诞节彩蛋! 27

2.6.2响应过程 28

2.6.1如何知道已完成 28

2.6发行和维护阶段 28

2.5测试阶段 28

2.6.3责任制 29

2.7本章小结 29

第3章 赖以生存的安全法则 30

3.1设计安全、默认安全和部署安全 30

3.1.1设计安全 30

3.2安全法则 31

3.1.3部署安全 31

3.1.2默认安全 31

3.2.1从错误中吸取教训 32

3.2.2尽可能缩小攻击面 33

3.2.3采用安全的默认设置 34

3.2.4纵深防御 35

3.2.5使用最小特权 36

3.2.6向下兼容总是不安全的 37

3.2.9失败时进入安全模式 38

3.2.8失败时的应对计划 38

3.2.7假设外部系统是不安全的 38

3.2.10切记:安全特性不等于安全的特性 40

3.2.11决不要将安全仅维系于隐匿 40

3.2.12不要将代码与数据混在一起 40

3.2.13正确地解决安全问题 40

3.3本章小结 41

第4章 威胁建模 42

4.1通过威胁建模进行安全的设计 42

4.1.1成立威胁建模小组 43

4.1.2分解应用程序 44

4.1.3确定系统所面临的威胁 49

4.1.4以风险递减的顺序给威胁分级 54

4.1.5选择应付威胁的方法 63

4.2安全技术 64

4.2.1身份认证 64

4.1.6选择缓和威胁的方法 64

4.2.2授权 68

4.2.3防篡改和增强保密性的技术 69

4.2.4保护秘密或最好不要保存秘密 69

4.2.5加密、散列、MAC和数字签名 69

4.2.6审核 70

4.2.7过滤、节流和服务质量 70

4.2.8最小特权 70

4.3缓和工资表范例程序的威胁 71

4.4各种威胁及解决方案 71

4.5本章小结 71

第二部分 安全的编码技术 76

第5章 头号公敌:缓冲区溢出 76

5.1堆栈溢出 77

5.2堆溢出 83

5.3数组下标错误 87

5.4格式字符串错误 89

5.5Unicode和ANSI缓冲区大小不匹配 93

5.6预防缓冲区溢出 95

5.6.1字符串处理方面的安全问题 96

5.6.2关于字符串处理函数的警告 103

5.7VisualC++.NET的/GS选项 104

5.8本章小结 106

第6章 确定适当的访问控制 107

6.1ACL何以如此重要 107

6.2ACL的组成 109

6.3选择好的ACL的方法 111

6.4创建ACL 113

6.4.1在WindowsNT4中创建ACL 113

6.4.2在Windows2000中创建ACL 116

6.4.3用活动模板库创建ACL 119

6.5对ACE进行正确的排序 120

6.6留意终端服务器和远程桌面的SID 122

6.7NULLDACL和其他的危险ACE类型 123

6.7.1NULLDACL和审核 124

6.7.2危险的ACE类型 124

6.7.3如果无法改变NULLDACL该怎么办 125

6.8其他的访问控制机制 125

6.8.1.NET框架角色 126

6.8.2COM+角色 127

6.8.3IP限制 127

6.8.4SQLServer触发器和权限 128

6.8.5一个医学方面的示例 128

6.8.6关于访问控制机制的重要说明 129

6.9本章小结 130

第7章 以最小特权运行 131

7.1现实中的最小特权 131

7.1.2破坏Web服务器 132

7.1.1病毒和特洛伊木马 132

7.3特权简介 133

7.2访问控制简介 133

7.3.1SeBackupPrivilege问题 134

7.3.2SeRestorePrivilege问题 136

7.3.3SeDebugPrivilege问题 136

7.3.4SeTcbPrivilege问题 136

7.3.5SeAssignPrimaryTokenPrivilege和SelncreaseQuotaPrivilege问题 137

7.3.6SeLoadDriverPrivilege问题 137

7.3.7SeRemoteShutdownPrivilege问题 137

7.3.8SeTakeOwnershipPrivilege问题 137

7.4令牌简介 137

7.5令牌、特权、SID、ACL和进程之间的关系 138

7.6应用程序要求提高特权的三个理由 139

7.6.1ACL问题 139

7.7解决提高特权的问题 140

7.7.1解决ACL问题 140

7.6.2特权问题 140

7.6.3使用LSA秘密 140

7.7.2解决特权问题 141

7.7.3解决LSA问题 141

7.8确定适当特权的过程 141

7.8.1步骤1:找到应用程序使用的资源 141

7.8.2步骤2:找到应用程序使用的特权API 142

7.8.3步骤3:哪一个帐户是必需的 142

7.8.4步骤4:获取令牌的内容 143

7.8.5步骤5:所有SID和特权是否都是必需的 147

7.8.6步骤6:调整令牌 148

7.9WindowsXP和WindowsServer2003中的低特权级服务帐户 158

7.10模拟特权和WindowsServer2003 159

7.11.2如何判断应用程序失败的原因 160

7.11.1为什么以普通用户运行时应用程序失败 160

7.11调试最小特权问题 160

7.12本章小结 165

第8章 加密的弱点 166

8.1使用不良的随机数 166

8.1.1问题:rand函数 166

8.1.2Win32中的加密随机数 168

8.1.3托管代码中的加密随机数 172

8.1.4Web页中的加密随机数 172

8.2使用口令生成加密密钥 173

8.3密钥管理问题 174

8.3.1长期密钥和短期密钥 175

8.3.2使用合适的密钥长度保护数据 176

8.3.3将密钥保存在靠近数据源的地方 176

8.3.4密钥交换问题 179

8.4创建自己的加密函数 180

8.5使用相同的流密码加密密钥 181

8.5.1人们为什么使用流密码 182

8.5.2流密码的缺陷 182

8.5.3如果必须使用相同的密钥怎么办 184

8.6针对流密码的位替换攻击 185

8.6.1解决位替换攻击 185

8.6.2何时使用散列、密钥散列或数字签名 186

8.7重用明文和密文的缓冲区 190

8.8使用加密技术缓和威胁 191

8.9在文档中说明你使用的加密算法 191

8.10本章小结 191

第9章 保护机密数据 192

9.1攻击机密数据 192

9.2有时并不需要保存秘密 193

9.2.1创建干扰散列 193

9.2.2使用PKCS#5增加攻击的难度 194

9.3获取用户的秘密信息 195

9.4保护Windows2000及其以后版本中的秘密信息 196

9.5保护WindowsNT4中的秘密信息 199

9.6保护Windows95/98/ME/CE中的秘密 202

9.7不要选择最低共同点解决方案 205

9.8管理内存中的秘密 206

9.8.1编译器优化警告 207

9.8.2对内存中的机密数据进行加密 210

9.9锁定内存以防敏感数据被分页 211

9.10保护托管代码中的机密数据 211

9.11提高安全门槛 217

9.11.1把数据存储在FAT系统的文件中 217

9.11.2使用嵌入密钥和XOR对数据进行编码 217

9.11.6使用3DES加密数据,把强密钥存储在注册表中,并使用ACL控制文件和注册表项 218

9.12保护机密数据时的折衷方案 218

9.11.7使用3DES加密数据,把强密钥存储在注册表中,要求用户输入密码,并使用ACL控制文件和注册表项 218

9.11.4使用3DES加密数据并把密码存放在注册表中 218

9.11.5使用3DES加密数据并把强密钥存储在注册表中 218

9.11.3使用嵌入密钥和3DES加密数据 218

9.13本章小结 219

第10章 一切输入都是有害的 220

10.1问题 220

10.2误信他人 221

10.3防御输入攻击的策略 222

10.4如何检查合法性 223

10.5Perl中被污染的变量 225

10.6使用正则表达式检查输入 225

10.7正则表达式和Unicode 228

10.8.1Perl中的正则表达式 231

10.8.2托管代码中的正则表达式 231

10.8正则表达式的“罗塞塔石碑” 231

10.8.3脚本中的正则表达式 232

10.8.4C++中的正则表达式 232

10.9不使用正则表达式的最佳做法 233

10.10本章小结 234

第11章 规范表示的问题 235

11.1规范的含义及其存在的问题 235

11.2规范文件名的问题 235

11.2.1绕过Napster名称过滤 235

11.2.2AppleMacOSX和Apache的漏洞 236

11.2.3DOS设备名漏洞 236

11.2.4Sun公司的StarOffice/tmp目录的符号链接漏洞 236

11.2.5常见的Windows规范文件名错误 237

11.3.1绕过AOL的父母控制 241

11.3.2绕过eEye的安全检查 241

11.3基于Web的规范问题 241

11.3.3安全区域和IE4的“无点IP地址”错误 242

11.3.4IIS4.0的∷$DATA漏洞 242

11.3.5何时一行变成了两行 244

11.3.6另一个Web问题——转义 244

11.4视觉等效攻击和同形异义词攻击 247

11.5预防规范化错误 247

11.5.1不要根据文件名进行决策 247

11.5.2使用正则表达式限制文件名的格式 248

11.5.3停止生成8.3格式的文件名 249

11.5.4不要相信PATH环境变量,要使用完整的路径名 249

11.5.5尝试规范化文件名 249

11.5.6安全地调用CreateFile 252

11.6基于Web的规范化问题的补救措施 253

11.6.1限制合法输入 253

11.6.2处理UTF-8字符时要谨慎 253

11.7最后的考虑:非基于文件的规范化问题 254

11.7.1服务器名 254

11.6.3ISAPI—岩石和硬地之间 254

11.7.2用户名 255

11.8本章小结 257

第12章 数据库输入问题 258

12.1问题 258

12.2伪补救措施1:用引号将输入括起来 260

12.3伪补救措施2:使用存储过程 260

12.4补救措施1:永不以sysadmin身份连接 261

12.5补救措施2:以安全的方式创建SQL语句 262

12.6纵深防御示例 263

12.7本章小结 266

第13章 Web特有的输入问题 267

13.1跨网站脚本:输出何时变坏了 267

13.2与XSS有关的其他攻击 270

13.2.1针对本地文件的XSS攻击 270

13.1.2攻击者不需要用户点击链接! 270

13.1.1有时攻击者不需要〈SCRIPT〉块 270

13.2.2针对HTML资源的XSS攻击 272

13.3XSS的补救措施 272

13.3.1将输出编码 272

13.3.2为所有的标签属性加上双引号 272

13.3.3将数据插入innerText属性 273

13.3.4强制使用代码页 273

13.3.5IE6.0SPI的cookie选项HttpOnly 274

13.3.6IE的“Web标记” 275

13.3.7IE的〈FRAMESECURITY〉属性 276

13.3.8ASP.NET1.1的ValidateRequest配置选项 276

13.4不要只是寻找不安全的结构 277

13.5我只是想让用户向我的Web站点发送HTML 278

13.7.2HTTP信任问题 279

13.7.1eval()可能是坏的 279

13.6如何审查代码中的XSS错误 279

13.7基于Web的其他安全主题 279

13.7.3ISAPI应用程序和过滤器 280

13.7.4警惕“可预知的Cookie” 282

13.7.5SSL/TLS客户端的问题 283

13.8本章小结 283

第14章 国际化问题 284

14.1I18N安全的黄金准则 284

14.2在应用程序中使用Unicode 284

14.3预防I18N缓冲区溢出 285

14.4验证I18N 286

14.4.1视觉验证 286

14.4.2不要使用LCMapString验证字符串 286

14.4.3使用CreateFile验证文件名 286

14.6调用MultiByteToWideChar时使用MB_PRECOMPOSED和MB_ERR_INVALID_CHARS 287

14.7调用WideCharToMultiByte时使用WC_NO_BEST_FIT_CHARS445 287

14.5字符集转换问题 287

14.8比较和排序 289

14.9Unicode字符属性 290

14.10规范化 291

14.11本章小结 291

第三部分 更安全的编码技术 294

第15章 Socket安全 294

15.1避免服务器被劫持 294

15.4接受连接 300

15.2TCP窗口攻击 300

15.3选择服务器接口 300

15.5编写防火墙友好的应用程序 304

15.5.1只用一个连接工作 305

15.5.2不要要求服务器连接回客户端 305

15.5.3使用基于连接的协议 305

15.6欺骗、基于主机和基于端口的信任 306

15.5.6让你的应用程序可配置 306

15.5.5不要在应用层数据中嵌入主机IP地址 306

15.5.4不要通过另外一个协议使你的应用程序进行多路复用 306

15.7IPv6即将到来 307

15.8本章小结 308

第16章 RPC、ActiveX控件和DCOM安全 309

16.1RPC入门 309

16.1.1什么是RPC 310

16.1.2创建RPC应用程序 310

16.1.3RPC应用程序的通信原理 311

16.2RPC安全最佳实践 312

16.2.1使用/robustMIDL开关参数 312

16.2.2使用[range]属性 313

16.2.3要求对连接进行验证 313

16.2.4使用数据包的保密性和完整性 317

16.2.5使用严格的上下文句柄 318

16.2.6不要依靠上下文句柄来进行访问检查 319

16.2.7注意空的上下文句柄 320

16.2.8不要信任你的对等端 321

16.2.9使用安全回调 321

16.2.10在单一进程中驻留多个RPC服务器 323

16.2.11使用主流的协议 324

16.3DCOM安全最佳实践 325

16.3.1DCOM基础 325

16.3.2应用层的安全 326

16.3.3DCOM用户上下文环境 326

16.3.4可编程实现的安全性 328

16.3.5源端和接收端 331

16.4ActiveX入门 331

16.5ActiveX安全最佳实践 331

16.5.1什么样的ActiveX组件是初始化安全和脚本安全的 332

16.5.2初始化安全和脚本安全的最佳实践 333

16.6本章小结 335

第17章 拒绝服务攻击的防范 336

17.1应用程序失败攻击 336

17.2CPU不足攻击 339

17.3内存不足攻击 344

17.4资源不足攻击 345

17.5网络带宽攻击 346

17.6本章小结 346

第18章 编写安全的.NET代码 348

18.1代码访问安全概述 349

18.2FxCop:“必备的”工具 350

18.3程序集是强命名的 351

18.4指定程序集权限需求 352

18.4.1请求最小的权限集 353

18.4.2拒绝不必要的权限 353

18.4.3请求可选的权限 353

18.5过分热衷于使用Assert方法 354

18.6关于Demand和Assert方法的进一步信息 355

18.7及时禁用断言 356

18.8请求和链接请求 357

18.9慎用SuppressUnmanagedCodeSecurityAttribute属性 358

18.10远程请求 359

18.11限制代码的使用范围 359

18.12不要在XML或配置文件中存储敏感数据 360

18.13审查允许部分信任的程序集 361

18.14检查非托管代码的托管包装的正确性 362

18.15委托的问题 362

18.16序列化的问题 362

18.17隔离存储的作用 363

18.18在部署ASP.NET应用程序之前禁用跟踪和调试 364

18.19不要远程发布冗长的错误信息 364

18.21失败时不要让攻击者知道太多 365

18.20对来源不可信的数据进行反序列化 365

18.22本章小结 366

第四部分 特殊的安全问题 368

第19章 安全性测试 368

19.1安全性测试人员的角色 368

19.2安全性测试与一般测试的区别 368

19.3根据威胁模型制定安全性测试计划 369

19.3.1分解应用程序 369

19.3.2确定组件接口 370

19.3.3按照潜在的漏洞对接口进行分级 371

19.3.4确定每一个接口使用的数据结构 371

19.3.5STRIDE类型的攻击程序 372

19.3.6用数据变种攻击应用程序 373

19.3.7测试之前 381

19.3.8开发查找缺陷的工具 381

19.4用欺诈性的服务程序测试客户软件 394

19.5用户是否应看到或修改数据 395

19.6用安全模板进行测试 395

19.7发现一个错误时测试并未结束 396

19.8测试码应有很高的质量 397

19.9测试端到端解决方案 397

19.10确定攻击面 397

19.10.1确定根攻击向量 398

19.10.2确定攻击向量的偏差 398

19.10.3统计产品中有偏差的攻击向量 398

19.11本章小结 399

第20章 审查安全代码 400

20.1处理大型应用程序 401

20.2多遍审查方法 401

20.3从易处着手 402

20.4整数溢出 403

20.5检查返回结果 405

20.7绝不要相信网络上的数据 406

20.6对指针代码进行额外的审查 406

20.8本章小结 407

第21章 安全的软件安装 408

21.1最小特权原则 408

21.2安装后立即清除密码 410

21.3使用安全配置编辑器 410

21.4低层的安全API 415

21.5使用WindowsInstaller 416

21.6本章小结 416

第22章 在应用程序中加入隐私策略 417

22.1对隐私的恶意侵犯和令人讨厌的侵犯 417

22.2主要的隐私立法 417

22.2.2关于数据保护的欧盟法令 418

22.2.3安全海港原则 418

22.2.1个人身份信息 418

22.2.4其他隐私立法 419

22.3隐私与安全 419

22.4建立隐私基础设施 420

22.4.1首席隐私官的作用 420

22.4.2隐私倡导者的作用 421

22.5设计尊重隐私的应用程序 421

22.5.1在开发过程中加入隐私策略 421

22.5.2了解隐私的特点 423

22.6本章小结 429

第23章 常用的好做法 430

23.1不要向攻击者透露任何信息 430

23.2关于服务的最佳做法 430

23.2.1安全、服务和交互式桌面 430

23.2.2服务帐户准则 431

23.7核心态错误 433

23.6让它保持关闭 433

23.7.1高级安全问题 433

23.4在补丁中改变错误信息时要谨慎 433

23.3不要以标志字符串的形式泄漏信息 433

23.5复查错误路径 433

23.7.2句柄 434

23.7.3符号链接 434

23.7.4配额 435

23.7.5序列化原语 435

23.7.6缓冲区处理问题 435

23.7.7IRP取消 436

23.8在代码中添加关于安全的注释 437

23.9借助于操作系统的功能 437

23.10不要依赖用户去做正确的选择 437

23.11安全地调用CreateProcess函数 438

23.11.2用引号把IpCommandLine中可执行文件的路径括起来 439

23.12不要创建共享的/可写的代码段 439

23.11.1不要将IpApplicationName设置为NULL 439

23.13正确使用模拟函数 440

23.14不要将用户文件写入\ProgramFiles目录 440

23.15不要把用户数据写入HKLM 440

23.16不要以“完全控制”权限打开对象 441

23.17对象创建错误 441

23.18慎用CreateFile 442

23.19安全地创建临时文件 443

23.20Setup程序和EFS文件系统的问题 445

23.21文件系统重解析点问题 445

23.22客户端安全是自相矛盾的说法 446

23.23范例就是模板 446

23.24以身作则,亲身体验 447

23.25你得向用户负责 447

23.26基于管理员SID确定访问权限 447

23.28慎用_alloca 448

23.27允许使用长口令 448

23.30不要嵌入公司的名称 449

23.29ATL转换宏 449

23.31将字符串移至资源DLL中 450

23.32应用程序日志 450

23.33从危险的C/C++迁移到托管代码 450

第24章 编写安全文档和错误消息 451

24.1文档中的安全问题 451

24.1.1关于文档的基础知识 451

24.1.2通过文档缓和威胁 452

24.1.3编写安全性文档的最佳做法 452

24.2错误消息中的安全问题 453

24.3典型的安全消息 454

24.4信息泄漏问题 454

24.4.1知情同意 455

24.4.3消息要具体 456

24.4.2累进泄漏 456

24.4.4最好不要提问 457

24.5对安全消息进行可用性测试 458

24.6审阅产品说明书时的注意事项 458

24.7安全设置的可用性 458

24.8本章小结 459

第五部分 附录 462

附录A 危险的API 462

附录B 安全误区 469

附录C 设计人员的安全措施核对清单 473

附录D 开发人员的安全措施核对清单 474

附录E 测试人员的安全措施核对清单 477

最后的一点思考 478

参考文献 479