Chapter 12 构建安全的软件
12.1 软件开发生命周期
- 分析阶段:软件需求分析。通过研讨或调查研究,对用户的需求进行收集,最后把它用标准的软件工程开发语言(需求规格说明书)表达出来。即建立软件的逻辑模型、编写需求规格说明书文档。
- 设计阶段:概要设计和详细设计两个阶段。将软件分解成一个个模块并将模块内部的结构设计出来。
- 结构化分析方法、数据流程图和数据字典等方法设计建 立相应的软件系统的体系结构
- 模块设计,给出软件的模块结构,将整个系统分解成若干个子 系统或模块
- 设计模块的程序流程、算法和数据结构,设计数据库
- 编写软件概要设计和详细设计说明书,数据库或数据结构设计说明书
- 编码阶段:把软件设计转换成计算机可以接受的程序
- 基于软件产品的开发质量的要求,充分了解软件开发语言、工具的特性和编程风格
- 编码并提供源程序清单
- 测试阶段:
- 白盒测试:依据的是程序内部的的逻辑结构来发现软件的编程错误、结构错误和数据错误,以较少的用例覆盖尽可能多的内部程序逻辑结果
- 黑盒测试:依据的是软件的功能或软件行为描述,发现软件的接口、功能和结构错误,以较少的用例覆盖模块输出和输入接口
- 维护阶段:根据软件运行的情况,对软件进行适当修改,成本较高
12.2 软件设计阶段威胁建模
- 在项目组中成立一个小组专门研究安全问题
- 分解系统需求,按照需求规格说明书和设计文档中的内容,站在安全角度,分析系统在安全方面的需求
- 确定系统可能面临哪些威胁
- 画出威胁树,对软件可能收到的威胁进行表达。
威胁树一般画3层:- 第一层写受到的攻击种类
- 第二层写被攻击的原因
- 第三层写具体攻击的处理方式
- 选择应付威胁或者缓和威胁的方法:告知用户、排查与修复问题等
- 确定最终技术:将最终选用的技术,直接在威胁树中描述或者用图表画出来
12.3 安全代码的编写
在编写代码的过程中考虑安全问题。如内存安全、线程安全、处理异常等
12.4 软件安全性测试
- 确保软件不会去完成没有预先设计的功能
- 确保软件能够完成预先设计的功能
进行安全测试,需要精湛的系统分析技术和反攻击技术。其特点是:
- 非常灵活,测试用例没有太多的预见性
- 没有固定的步骤可以遵循
- 工作量大,并且不能保证完全地加以解决
12.5 漏洞响应和产品的维护
在发现漏洞时,要确保能够迅速确认、响应、修复漏洞,在发现漏洞后的第一时间采取措施
漏洞相应常规阶段:
- 发现漏洞通知厂商
- 确认漏洞和风险评估
- 修复漏洞
- 发布补丁及安全简报对外公布安全补丁
练习题:
1. 某公司收到安全人员的报告,发现有一种恶意代码利用该公司编写的一款软件(需要网络连接)进行网络蠕虫传播,试画出威胁树进行分析。
解题技巧: 威胁树不同层级常用术语汇总
第一层:受到的攻击种类
- 网络相关:SQL注入攻击、跨站脚本攻击、木马攻击、蠕虫攻击、DDoS攻击等
- 非网络相关:缓冲区溢出等二进制漏洞攻击,病毒攻击等
第二层:受到攻击的原因
- 存在零日漏洞(万能句)、安全测试覆盖面不足、软件设计缺陷、内部人员不当操作(如被社工)、工程师缺乏安全意识、没有及时安装补丁等
第三层:解决方案
- 及时上报安全漏洞并做出应对措施、重新进行安全测试、重新审视软件设计方案,必要时需要停服解决设计缺陷、安装最新补丁,更新软件、进行流量捕获与分析,完善服务器相关代码等