软件漏洞模型与安全工程流程
这是软件安全课程的第一讲。目标不是马上进入漏洞利用,而是先建立语言:什么是缺陷、漏洞、利用、风险、资产、攻击面和信任边界。
学习目标
- 区分 bug、vulnerability、exploit 和 risk,并能给出安全语境下的例子。
- 用资产、入口点、信任边界和攻击者能力描述一个小型软件系统的攻击面。
- 从一个漏洞公告中提取根因、影响、修复策略和回归测试需求。
- 解释为什么软件安全必须进入需求、设计、实现、测试和发布流程。
先备知识
- 软件工程中的质量属性。
- HTTP 请求、输入校验、后端服务和数据库的基本概念。
- Git、issue、pull request 和测试的基本使用。
课前准备
- 课前阅读:任意一篇简短 CVE 公告,标出受影响组件、攻击前提和修复版本。
- 课前思考:一个会导致程序崩溃的 bug 一定是安全漏洞吗?
- 准备环境:浏览器、文本编辑器,以及能打开课程仓库中的示例 advisory。
课堂流程
0-8复习:软件工程里的质量属性用可靠性、可维护性和安全性三个词开场,让学生先说这些质量属性分别保护什么。
review
用可靠性、可维护性和安全性三个词开场,让学生先说这些质量属性分别保护什么。
如果一个输入校验错误只能导致程序崩溃,它一定是安全漏洞吗?
预期回答:不一定。要看攻击者是否能触发、崩溃是否影响安全目标、是否能进一步利用。
追问:如果它是认证服务呢?如果崩溃后自动重启但会丢失内存中的会话状态呢?
开场
今天是软件安全的第一讲。我们先不写 exploit,也不急着看花哨的攻击。安全课最容易犯的错误,是把漏洞当成某种神秘技巧。我们这门课要反过来:漏洞首先是工程缺陷,只是这个缺陷刚好能被攻击者利用。今天我们要建立一套共同语言。
漏洞公告到工程任务
打开示例 advisory。
Bug、漏洞、利用和风险
8-18诊断问题:崩溃是否等于漏洞给出三个场景:本地 CLI 崩溃、公开 API 崩溃、认证服务崩溃。让学生判断风险是否相同。
diagnostic
给出三个场景:本地 CLI 崩溃、公开 API 崩溃、认证服务崩溃。让学生判断风险是否相同。
如果一个输入校验错误只能导致程序崩溃,它一定是安全漏洞吗?
预期回答:不一定。要看攻击者是否能触发、崩溃是否影响安全目标、是否能进一步利用。
追问:如果它是认证服务呢?如果崩溃后自动重启但会丢失内存中的会话状态呢?
复习
上节软件工程课里我们说过质量属性。可靠性问的是系统在正常或异常条件下能不能持续工作;可维护性问的是未来的人能不能理解和修改;安全性多了一个主动对抗者。请先想一个问题:一个程序崩溃,什么时候只是可靠性问题,什么时候变成安全问题?
漏洞公告到工程任务
假设系统允许用户上传头像。请列出至少 4 个资产、3 个入口点、3 条信任边界和 3 个安全测试。
Bug、漏洞、利用和风险
18-34bug、漏洞、利用和风险建立四个概念的层次:实现偏差、可被攻击者利用、利用路径、资产影响与可能性。
concept
建立四个概念的层次:实现偏差、可被攻击者利用、利用路径、资产影响与可能性。
漏洞公告中最重要的是 CVSS 分数,还是根因和攻击前提?
预期回答:CVSS 有排序价值,但工程修复更依赖根因、攻击前提、受影响版本和可回归测试的条件。
追问:如果分数高但产品没有暴露对应入口点,优先级应该怎么调整?
提问引导
我给三个场景。第一,一个本地命令行工具读到坏文件后崩溃。第二,一个公开 API 收到特殊请求后崩溃。第三,一个认证服务崩溃后所有用户都无法登录。三者都是 crash,但安全含义一样吗?这里不要急着回答 yes 或 no,先问:攻击者能不能触发?触发成本多高?影响哪个资产?有没有进一步利用的空间?
漏洞公告到工程任务
打开示例 advisory。
Bug、漏洞、利用和风险
34-48漏洞公告拆解共同阅读一份短 advisory,把 affected versions、root cause、impact、fixed versions、workaround 和 regression test 标出来。
case
共同阅读一份短 advisory,把 affected versions、root cause、impact、fixed versions、workaround 和 regression test 标出来。
漏洞公告中最重要的是 CVSS 分数,还是根因和攻击前提?
预期回答:CVSS 有排序价值,但工程修复更依赖根因、攻击前提、受影响版本和可回归测试的条件。
追问:如果分数高但产品没有暴露对应入口点,优先级应该怎么调整?
概念讲解
我们把四个词拆开。bug 是实现偏差。vulnerability 是攻击者可利用的缺陷。exploit 是利用路径或利用程序。risk 是资产影响和发生可能性的组合。所以不是每个 bug 都是漏洞,也不是每个漏洞都有稳定 exploit,更不是每个 exploit 都对应同样的业务风险。
漏洞公告到工程任务
假设系统允许用户上传头像。请列出至少 4 个资产、3 个入口点、3 条信任边界和 3 个安全测试。
如何读漏洞公告
48-63资产、入口点、信任边界和攻击面用一个登录服务画出数据流,标出浏览器、API、数据库、第三方依赖和管理员后台之间的信任边界。
concept
用一个登录服务画出数据流,标出浏览器、API、数据库、第三方依赖和管理员后台之间的信任边界。
信任边界和模块边界是不是同一件事?
预期回答:不是。模块边界是代码组织方式,信任边界是不同权限、身份、控制权或数据可信度之间的边界。
追问:一个模块内部是否可能跨越信任边界?一个微服务边界是否一定是信任边界?
案例过渡
接下来我们看一份漏洞公告。读公告不要只看标题和分数。我们要找六件事:受影响版本、攻击前提、根因、影响、修复版本、回归测试。以后你们做安全工程,看到公告后真正要交付的是这些工程动作,而不是转发一条链接。
漏洞公告到工程任务
打开示例 advisory。
如何读漏洞公告
63-75课堂练习:为一个上传接口建模学生两人一组,写出资产、入口点、攻击者能力、最可能的三个风险。
exercise
学生两人一组,写出资产、入口点、攻击者能力、最可能的三个风险。
信任边界和模块边界是不是同一件事?
预期回答:不是。模块边界是代码组织方式,信任边界是不同权限、身份、控制权或数据可信度之间的边界。
追问:一个模块内部是否可能跨越信任边界?一个微服务边界是否一定是信任边界?
总结
今天的核心句是:漏洞是攻击者可利用的工程缺陷。判断一个问题是不是安全问题,需要同时看攻击者、入口点、信任边界、资产和影响。下节课我们会进入工作坊,用同一套方法系统分析两篇公告,并把分析转成 issue、测试和修复计划。
漏洞公告到工程任务
假设系统允许用户上传头像。请列出至少 4 个资产、3 个入口点、3 条信任边界和 3 个安全测试。
如何读漏洞公告
75-84安全进入工程流程把刚才的风险转成 issue、测试、代码评审检查项和发布门禁。
discussion
把刚才的风险转成 issue、测试、代码评审检查项和发布门禁。
信任边界和模块边界是不是同一件事?
预期回答:不是。模块边界是代码组织方式,信任边界是不同权限、身份、控制权或数据可信度之间的边界。
追问:一个模块内部是否可能跨越信任边界?一个微服务边界是否一定是信任边界?
总结
今天的核心句是:漏洞是攻击者可利用的工程缺陷。判断一个问题是不是安全问题,需要同时看攻击者、入口点、信任边界、资产和影响。下节课我们会进入工作坊,用同一套方法系统分析两篇公告,并把分析转成 issue、测试和修复计划。
漏洞公告到工程任务
打开示例 advisory。
如何读漏洞公告
84-90总结和下节课钩子总结本节课核心句:漏洞是攻击者可利用的工程缺陷。下节课把这个方法用于漏洞公告分析工作坊。
summary
总结本节课核心句:漏洞是攻击者可利用的工程缺陷。下节课把这个方法用于漏洞公告分析工作坊。
信任边界和模块边界是不是同一件事?
预期回答:不是。模块边界是代码组织方式,信任边界是不同权限、身份、控制权或数据可信度之间的边界。
追问:一个模块内部是否可能跨越信任边界?一个微服务边界是否一定是信任边界?
总结
今天的核心句是:漏洞是攻击者可利用的工程缺陷。判断一个问题是不是安全问题,需要同时看攻击者、入口点、信任边界、资产和影响。下节课我们会进入工作坊,用同一套方法系统分析两篇公告,并把分析转成 issue、测试和修复计划。
漏洞公告到工程任务
假设系统允许用户上传头像。请列出至少 4 个资产、3 个入口点、3 条信任边界和 3 个安全测试。
如何读漏洞公告
课后作业
选择一篇公开 CVE 公告,提交一页分析:资产、攻击者能力、根因、影响、修复策略、回归测试建议。