知识卡片

软件脆弱性的产生原因分类与生命周期模型

普通读书笔记卡

内容

软件脆弱性有四个共同特点:本身不直接造成危害、但一旦被利用就会产生严重后果;开发过程中自觉或不自觉引入的逻辑错误是绝大多数脆弱性的根本来源;与具体系统环境高度绑定,环境的任何差异都可能导致不同的脆弱性表现;旧脆弱性被修补的同时往往会引入新脆弱性,所以脆弱性问题是长期存在、无法一次性根除的。Aslam等人从产生原因出发对脆弱性做了分类:系统配置错误(安装位置错误、启动参数不对、权限设置不正确等)、变量设置错误(环境变量/内部变量设置及其相互兼容性问题)、以及需求分析/软件设计/程序编码过程中的错误(验证错误、程序设计错误、同步错误、条件有效性错误、原子性错误等)——这个三分类的价值在于把”脆弱性从哪来”这个笼统问题,落到了配置、变量、开发过程三个可以分别对应不同责任人和修复手段的具体环节上。书中用一个真实的xterm漏洞案例演示了脆弱性如何从”错误”变成”可被利用的攻击”:xterm在处理日志记录权限检查和日志记录实际开始之间存在一个计时窗口(timing window),攻击者可以先创建一个FIFO文件并让xterm开始向它写日志,再把这个文件改名、并创建一个指向/etc/passwd的符号链接顶替原名——由于权限检查和实际写入之间存在时间差,日志写入操作最终会通过符号链接写到系统的passwd文件上;同一个漏洞从三个角色看是三种不同性质的错误:从攻击程序角度是”安装目标权限不正确”,从xterm程序角度是”没有正确验证文件、导致条件有效性错误”,从操作系统角度是”非法删除和连接操作插入了本不该出现的位置,导致操作序列化错误”——这说明同一个脆弱性往往可以在多个层次上被归因,修补时也需要在恰当的层次上下手,而不只是头痛医头。Wenliang等人则提出了脆弱性的生命周期模型:引入阶段(输入验证错误、权限检查错误、操作序列化错误、边界检查错误、设计缺陷等)→产生破坏效果阶段(非法执行代码、非法修改目标对象、非法访问数据对象、拒绝服务攻击)→修补阶段(删除伪造实体、增加新实体、修改实体不正确的位置)——这个三阶段模型把脆弱性从静态的”缺陷清单”,重新定位成了一个有始有终、可以在每个阶段分别设计对策的动态过程。

参考来源

- 位置:《软件架构理论与实践》第21章《软件架构脆弱性》"21.2.2 软件脆弱性的特点和产生的原因"及"21.2.3 软件脆弱性的生命周期"节(源文件:_epub-src/OEBPS/text00177.html) - 结论依据:原文给出xterm案例的完整攻击代码及三种角色的归因分析("从攻击程序的角度……从xterm程序的角度……从操作系统角度……"),并说明"由此形成了软件脆弱性的生命周期,它包含了引入、产生破坏效果、被修补和消失等阶段",直接支撑本卡片结论。 - 原始内容:由于在日志文件访问权限检查和日志记录的实际开始之间存在一个计时窗口(timing window),而这个窗口很可能被黑客用来创建一个从日志记录文件到系统的某个目标文件之间的符号链接(symbolic link),以此发生攻击。