软件安全的二十四宗罪 - Howard, LeBlanc, Viega

基本信息

  • 原书: 《24 Deadly Sins of Software Security: Programming Flaws and How to Fix Them》
  • 作者: Michael Howard, David LeBlanc, John Viega
  • 云盘路径: /田浩然上传的资料/电子书/Security/[软件安全的二十四宗罪编程瑕疵与如何纠正].24.Deadly.Sins.of.Software.Security.Programming.Flaws.and.How.to.Fix.Them.pdf
  • 文件大小: 2.76 MB
  • 页数: 433页(mixed类型)
  • 处理日期: 2026-09-03
  • 处理方法: PDF文本提取+目录分析

核心观点

本书由微软、McAfee等安全专家撰写,系统地总结了软件开发中最常见的24类安全漏洞(“罪”)。每一章都采用统一的结构:罪的定义→CWE参考→受影响语言→罪的解释→代码示例→检测方法→救赎步骤(修复方案)→额外防御措施。这是一本面向开发者的实战手册,而非理论著作。


内容结构

Part I: Web Application Sins(Web应用之罪)

第1章 SQL注入(SQL Injection)

  • 核心问题:未验证的用户输入直接拼接到SQL语句
  • 典型攻击:' OR '1'='1 绕过认证
  • 救赎方案:使用参数化查询(Prepared Statements)、输入验证、存储过程
  • 覆盖语言:C#、PHP、Python、Ruby、Java、C/C++

第2章 Web服务器相关漏洞(XSS、XSRF、响应分裂)

  • DOM型XSS(Type 0):通过HTML属性注入恶意脚本
  • 反射型XSS(Type 1):用户输入直接返回到页面
  • 存储型XSS(Type 2):恶意脚本存储在服务器数据库中
  • XSRF(跨站请求伪造):利用用户已登录状态执行非预期操作
  • 救赎方案:HTML编码输出、HttpOnly Cookie、CSRF Token验证

第3章 Web客户端相关漏洞(XSS)

  • 浏览器端JavaScript注入
  • 隐私泄露:恶意Gadget读取用户数据
  • 救赎方案:不要信任任何客户端输入、使用沙箱技术

第4章 使用Magic URL、可预测Cookie和隐藏表单字段

  • Magic URL:通过URL参数传递敏感状态
  • 可预测Cookie:如顺序ID、时间戳
  • 隐藏表单字段:前端可见,易被篡改
  • 救赎方案:服务端验证所有状态、使用加密Cookie

Part II: Implementation Sins(实现之罪)

第5章 缓冲区溢出(Buffer Overruns)

  • 核心问题:写入超出缓冲区边界的数据
  • 经典案例:Code Red、Nimda蠕虫
  • 救赎方案:使用安全的字符串函数(strncpy、snprintf)、静态分析工具、栈保护
  • 额外防御:ASLR、DEP/NX位

第6章 格式化字符串问题(Format String Problems)

  • 漏洞:printf(user_input) 而非 printf("%s", user_input)
  • 攻击效果:读取/写入任意内存地址
  • 救赎方案:永远不要将用户输入作为格式字符串

第7章 整数溢出(Integer Overflows)

  • 漏洞:算术运算结果超出变量范围
  • 后果:导致缓冲区分配过小,引发溢出
  • 救赎方案:使用安全的整数运算库、检查边界条件

第8章 C++灾难(C++ Catastrophes)

  • 虚函数表覆盖、RTTI注入、异常安全
  • 救赎方案:使用RAII模式、智能指针、异常规范

第9章 异常处理不当

  • 忽略异常、异常被静默吞掉、异常信息泄露
  • 救赎方案:始终处理异常、日志安全、不要暴露内部信息

第10章 命令注入(Command Injection)

  • 漏洞:将用户输入拼接到系统命令
  • 典型攻击:; rm -rf /
  • 救赎方案:避免调用系统命令、使用白名单验证、转义特殊字符

第11章 错误处理不当

  • 静默失败、错误信息泄露内部细节
  • 救赎方案:统一的错误处理框架、友好的错误页面

第12章 信息泄露(Information Leakage)

  • 调试信息暴露、错误消息泄露堆栈
  • 救赎方案:生产环境关闭调试、通用错误消息

第13章 竞态条件(Race Conditions)

  • TOCTOU(Time-of-Check to Time-of-Use)漏洞
  • 救赎方案:原子操作、文件锁定、服务端验证

第14章 可用性差(Poor Usability)

  • 安全设置过于复杂导致用户绕过
  • 救赎方案:默认安全、用户友好的安全设计

第15章 难以更新(Not Updating Easily)

  • 补丁困难、版本混乱
  • 救赎方案:自动更新机制、版本管理

第16章 以过多权限执行代码(Executing Code with Too Much Privilege)

  • 原则:最小权限原则
  • 救赎方案:分权架构、用户态服务

第17章 未妥善保护存储数据(Failure to Protect Stored Data)

  • 明文存储密码、敏感数据未加密
  • 救赎方案:bcrypt/argon2哈希、透明数据加密(TDE)

第18章 移动代码之罪(The Sins of Mobile Code)

  • Java Applet、ActiveX、Flash的安全问题
  • 救赎方案:代码签名、沙箱限制

Part III: Cryptographic Sins(密码学之罪)

第19章 使用弱密码系统

  • 短密码、常见密码、密码复用
  • 救赎方案:密码策略、多因素认证

第20章 弱随机数(Weak Random Numbers)

  • 使用rand()生成密钥
  • 救赎方案:使用密码学安全的随机数生成器(CSPRNG)

第21章 错误使用密码学

  • 自定义加密算法、ECB模式、硬编码密钥
  • 救赎方案:使用标准库、正确的模式(GCM、CBC with HMAC)

Part IV: Networking Sins(网络之罪)

第22章 未保护网络流量

  • 明文传输敏感数据
  • 救赎方案:TLS/SSL、证书固定

第23章 错误使用PKI和SSL

  • 证书验证不严格、允许自签名证书
  • 救赎方案:完整的证书链验证、HSTS

第24章 信任网络名称解析

  • DNS欺骗、缓存投毒
  • 救赎方案:DNSSEC、IP绑定

关键知识点

1. 安全开发生命周期(SDL)

Microsoft提出的七步SDL:

  1. 安全培训
  2. 需求(安全需求)
  3. 设计(威胁建模)
  4. 实现(安全编码规范、代码审查)
  5. 测试(模糊测试、安全扫描)
  6. 发布(应急响应计划)
  7. 响应(事件处理)

2. 核心安全原则

  • 最小权限原则:程序只应拥有完成其任务所需的最小权限
  • 纵深防御:不依赖单一安全措施
  • 默认安全:默认配置应该是安全的
  • Fail-Secure:故障时应拒绝访问而非允许访问

3. 输入验证的三重保障

  1. 白名单验证(而非黑名单)
  2. 输出编码(根据上下文选择编码方式)
  3. 输入长度限制

4. 密码学最佳实践

  • 永远不要自己实现加密算法
  • 使用经过验证的库(如OpenSSL、libsodium)
  • 密码使用bcrypt/argon2哈希
  • 使用AES-GCM模式而非ECB
  • 定期轮换密钥

与其他知识的关联


可行动点

  1. 阅读本书时,对照自己项目中的代码,检查是否存在这24类”罪”
  2. 建立项目的代码审查清单,将本章内容纳入审查标准
  3. 为团队安排安全编码培训,重点讲解SQL注入、缓冲区溢出、XSS
  4. 引入静态分析工具(如Coverity、Fortify)自动检测常见漏洞

备注

  • 本书基于2010年出版,部分技术细节可能已过时,但核心安全原则依然适用
  • 每个”罪”都配有多个语言的代码示例(C#、C++、Java、PHP、Python、Ruby等)
  • 本书适合作为开发者的安全手册,建议反复查阅