软件安全的二十四宗罪 - 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:
- 安全培训
- 需求(安全需求)
- 设计(威胁建模)
- 实现(安全编码规范、代码审查)
- 测试(模糊测试、安全扫描)
- 发布(应急响应计划)
- 响应(事件处理)
2. 核心安全原则
- 最小权限原则:程序只应拥有完成其任务所需的最小权限
- 纵深防御:不依赖单一安全措施
- 默认安全:默认配置应该是安全的
- Fail-Secure:故障时应拒绝访问而非允许访问
3. 输入验证的三重保障
- 白名单验证(而非黑名单)
- 输出编码(根据上下文选择编码方式)
- 输入长度限制
4. 密码学最佳实践
- 永远不要自己实现加密算法
- 使用经过验证的库(如OpenSSL、libsodium)
- 密码使用bcrypt/argon2哈希
- 使用AES-GCM模式而非ECB
- 定期轮换密钥
与其他知识的关联
- SICP-计算机程序的构造和解释-Harold-Abelson:编程思维与安全编码的结合
- LINUX内核源代码情景分析-李强.md:内核中的安全机制(权限、IPC)
- Effective-C++-第三版-55条指南:C++安全编程的补充
可行动点
- 阅读本书时,对照自己项目中的代码,检查是否存在这24类”罪”
- 建立项目的代码审查清单,将本章内容纳入审查标准
- 为团队安排安全编码培训,重点讲解SQL注入、缓冲区溢出、XSS
- 引入静态分析工具(如Coverity、Fortify)自动检测常见漏洞
备注
- 本书基于2010年出版,部分技术细节可能已过时,但核心安全原则依然适用
- 每个”罪”都配有多个语言的代码示例(C#、C++、Java、PHP、Python、Ruby等)
- 本书适合作为开发者的安全手册,建议反复查阅