1、写在前面
1.1 什么是威胁建模?
1.2 威胁建模的价值
- 识别体系化的结构缺陷:大多数安全问题是设计缺陷问题,而不是安全性错误。威胁建模能帮助识别这些设计缺陷,从而减少风险敞口,指导安全测试,并降低因安全漏洞而造成的品牌损害或财务损失的可能性。
- 节约组织安全成本:通过对威胁进行建模,并在设计阶段建立安全性需求,降低安全设计缺陷导致的修复成本。在需求管理和威胁分析阶段与业务开发团队高效互动,释放安全团队的专业能力,专注于高性价比的安全建设。
- 落地DevSecOps文化:通过威胁建模跑通开发和安全工具的流程集成,把风险管理嵌入产品的完整生命周期,从而推动形成完整的DevSecOps工具链。
- 满足合规要求:威胁建模是国际安全行业通用的方法论,通过向管理层和监管机构提供产品的风险管理活动的完整记录,帮助团队遵守全球法律法规要求如PCI DSS、GDPR、HIPAA、CSA STAR等。
1.3 遇到的挑战
- 缺乏优秀的自动化建模工具;
- 安全团队没有时间和精力对每个应用都实施建模;
- 缺乏对威胁建模足够的了解,知识库涉及不同领域、专家经验难以共享;
- 建模活动、输出结果没有融入业务的敏捷研发流程;
- 简易的建模活动基于问卷或者表格记录分析,并没有实际的更新、积累和进一步分析。
2、准备威胁建模
2.1 能力要求
- 懂常用的安全技术,安全机制,攻击方法,危害,加密算法;
- 懂业务,流程,内部技术服务,产品与产品之间,组件和组件之间的关系;
- 组织人员策略资源来推动项目实施;
- 将安全规划,安全流程、治理模型组合来符合纵深防御原则。
威胁评审,重点是评和审,对参与威胁评审的人员软实力要求有:
- 一定程度了解业务;
- 合格的文档编写能力;
- 有意识地优化企业体系结构中的研发安全流程;
- 有意愿传播安全能力,以支持增强安全团队话语能力。
2.2 评估流程
- 准备
实施威胁评估时,首先要取得业务团队负责人的认同:不管有没有事件驱动,安全团队的参与都将为业务系统提供产品竞争力。哪怕现阶段安全并不能完全赋能给业务,但长期来看,威胁建模应该在业务技术迭代的每个环节都去自助实施,随着技术的积累,业务团队独立完成威胁技术安全分析是有可能的。
- 团队
参与团队以”two-pizza teams”团队最佳,建立工作团队后,按需引入相关人,以后这个工作组聚焦为业务提供安全能力。保持沟通是构建产品安全的诀窍,实施威胁建模的效果深受团队如何组织和交流的影响。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 周期
实施这项活动的整个周期除了解决风险的阶段稍长,从问卷调查到给出威胁评估报告,建议持续时间为1到2周,如时间太短,团队成员之间不能建立足够的信任,不能充分给出安全评估的结果;如时间太长,会忘记之前讨论的结果,耗费双方团队精力。威胁评估迭代的周期保持灵活,在人力充足的情况下以重大变更、功能模块迭代的数月、半年一轮为佳,人力不足的时候应尽量把评审过程由人力到工具化、自动化、服务化。
- 流程
安全架构评审的核心是威胁建模,详细参考可以参考 《安全架构评审实战》 ,当然传统的建模流程太重了,虽然尊重业务的设计过程很复杂,威胁分析也没有理由取巧走捷径,是改善安全必须付出的成本,尽量复用现有流程的同时针对敏捷开发做出适当精简——通过问卷简化核心安全要素的分析、通过组织流程优化沟通方式、通过融入研发流程快速闭环。总结出比较适合互联网企业的评估工作流程如下:
- 访谈由安全评审人主持,时间尽量控制在40分钟以内,人数最小是4人左右。第一次访谈可以从问卷的内容开始,就每一个问卷选项进行交流,确保业务正确理解问卷中提到的问题,确保问卷的填写结果是业务想要表达的意思,确保业务不清楚的、有分歧的可以通过讨论给出一致结论。问卷访谈时不用过于讨论技术细节、系统不足和实际修复方案,主要是了解业务的基本安全情况。访谈的第二个议题是邀请业务方对软件设计文档、架构图进行讲解。最后的总结5分钟左右,会后遗留三项todo:一、填写应用信息收集表,包括技术文档地址、代码仓库地址、域名、CI\CD发布项、技术栈、测试环境账户;二、下一次沟通时间;三、安全对接专人。
- 第二次访谈之前,安全人员应多阅读业务方的文档,代码,进行适度的安全测试。这次访谈希望有业务方架构师、代码开发负责人参与,对于安全前期整理的所不理解的调用关系问题、现有的安全控制措施问题、流程细节、组件、认证方式等其他技术细节进行讨论,分歧点和讨论结果通过文档记录方便查阅。
- 日常发现的疑问可以多次随时沟通,评审是一项“开卷考试”,很多黑白盒发现的安全风险无需花大精力执行安全测试,通过向业务方咨询就能得到确认。
- 访谈的对象通过产品、架构设计、开发人员类型的不同视角可以发现业务自身的讹误、业务如有不清楚的地方或历史遗留问题,不用在这里卡壳,先弄懂能弄清楚的来逐步拼接“拼图”。
- 最简单的威胁建模,就是关于威胁的头脑风暴而已。访谈的原则要把自己作为业务的CISO,从产品安全负责人的角度考虑:这个产品卖出去,可以提供什么安全能力?出现安全事故事前该怎么做?
4. 开展架构评审中威胁建模的几个子过程,包括定义资产、识别威胁、评估风险、给出缓解措施等,将在下面的 “实施威胁建模”章节详细展开说。
5. 威胁建模的阶段性成果交付物会是不同形式,如安全白皮书、安全设计指导、威胁评估报告。业务团队可以从安全给出的长期修复方案和安全规划中获益。最终报告最好有安全团队内部双人复核机制,不同安全专家视角里对威胁的理解是不一样的,双人复核的另一个好处是可以减少工作量,比如分工区分A-管理端,B-Agent,A-代码,B-设计实现或者A评审-,B复查分工。给出威胁建模结果前一定要同业务团队再次沟通,确认哪些风险是安全视角被错误理解的,哪些是已经在业务视野中,哪些是业务团队认知不到位的。修复方案要区分接受、缓解、转移、处理风险四种情况。沟通时对应报告每个威胁项要求业务方给出明确的排期。短期可以走安全工单,长期纳入业务的规划排期中,识别出的共性安全问题作为安全专项制定孵化相应的安全工具和项目,补全安全建设的蓝图。
6. 发现风险总是容易,解决风险才是这项工作的价值。减缓发现的威胁可能需要业务重新设计,需要排除万难达成目标,不然评审过的系统带来的虚假安全感,还不如没有安全感。一个有趣的现状是解决威胁时对于安全团队是业务在修复漏洞,对于业务是在满足安全团队提出安全需求。安全团队以往的视角总是急迫希望业务立即去修复,其实大可不必着急,不妨就按照安全需求去沟通。评审发现的问题不少是架构和设计方面的问题,比如认证、鉴权、数据安全方面,需要业务方进行大的设计变更,要建设对应的公共基础服务,要理解业务(反正风险已经存在很长时间了,敬畏业务的修复成本,尊重技术客观规律),只要能解决问题即可。好的修复方案一定是考虑性价比的,而且可行性大于必要性,每个团队的资源都不是无限的,按照处理的优先级进行排序工作。对识别出暂时不能解决的问题可以做出对应的监控、审计手段,如果要介入培训此时也是好的阶段,优秀的工程师总是想掌握到不同的知识,培训不是被动地聚在一起讲PPT,而是互动交流,建立安全文化的积极性。
7. 在业务方确定处置风险完毕后,安全团队复查修复是否完成,修复是否引入新的问题,业务方是否对方案理解到位。这个过程要和业务团队保持互动,安全评审并不是单纯安全测试,而是指导安全能力的提升,结束时可以给业务积极的反馈,保持健康的安全文化。
8. 威胁评估的活动最好定期重复进行。安全防护为什么要与时俱进?
一、随着制度法规的完善,对业务的安全性提出更高的要求;
二、公司安全基础设施能力不断提升,可为业务提供的公共安全能力不断增强;
三、业务系统可能随着时间的变化,安全现状有质的改变,随着信息系统所承载的业务完善或稳定,业务有取消合并的迭代。
3、实施威胁建模
3.1 数据流关系图都不准确,尽量有用而已
- 微软的Microsoft Threat Modeling Tool工具优点是适合初学者接触熟悉了解外部实体、数据流、过程、存储、信任边界的基本概念,缺点是除了Windows应用程序和Azure示例之外没有合适的威胁模板。
- Owasp threat-dragon的优点是表达方式更丰富,但是不能支持动态拖拽和自动导出威胁列表。大家没有必要将整理数据流图视为困难,实战中威胁建模能力只能通过多练习、反复挑战的方法熟悉技能。
回过头看早期的一些对威胁模型的判断往往不准确的,没有关系,毕竟你曾经“实施”过威胁建模了。绘制数据流的过程可以理解业务、确保安全视角没有遗漏。 威胁建模完全自动化基本是伪需求,没有足够多的业务产品需要持续进行建模评审、大量的原始信息来自于文档、架构师的经验、场景和知识极其复杂。建议尽快上手可以使用系统自带的流程图,使用Visio和draw.io最方便。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3.2 识别威胁是互动过程
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 业界同类产品的安全白皮书,如各家公有云的材料相对比较全,要思考这些同类产品都有哪些安全功能,有没有安全需求,能不能实现。
- 通过内部工单系统搜索该部门名下的历史漏洞:经常一个产品历史出现过越权漏洞,是因为整个产品都没有鉴权;一个接口不符合编码规范,同一份代码的另一个接口出现安全问题的风险高。
- 开源产品的安全设计方案,历史漏洞。
- 专利、论文、行业知识库,对于新的技术的如人脸识别、机器学习、大数据业务这方面的材料很宝贵。
以上举个简单的例子,场景是租户通过第三方开放平台登录后通过微服务处理业务。
- 认证和授权:未强制HTTPS缺失二次认证措施
- 日志和监控:缺失日志记录和审计模块日志本地留存
对于IAM服务服务器,存在的威胁有:
- 信息泄露:用户身份信息泄露
- 认证:暴力破解对外发送的管理平台凭据授权策略绕过
- 可用性:单机实例,误操作可导致宕机风险
对于MySQL服务,部分存在的威胁有:
- 认证:攻击者获取凭据后可以直接访问、修改、删除业务数据
- 权限提升:攻击者可以从普通用户提升至root获取数据库完全控制权限
- 信息泄露:SQL注入导致所保存的业务数据泄露
评估风险结果没有列出来有些是自动认可忽略的,有些是放在基线等安全控制措施,大多数的威胁发现都是基于参与者的经验,可以从安全最佳实践、加固指导、历史案例形成知识库积累下来。 具体实施的过程目前没有完全的自动化工具,但是检测项一般有共识:比如从域名系统查看是否启用强制HTTPS、S3对象存储查看是否启用服务器端加密,硬编码问题、是否加入FIDO等。
虽然威胁建模的一个要点是避免关注漏洞而不是威胁,但基本没有一个系统是从零搭建的,新的项目也会大量引入框架、组件、第三方服务,适当的安全测试是必要,原则是聚焦发现设计方面高层次的风险,但如果参与人员具备一些实际攻防能力,可以将其他安全工具发现的问题纳入一起解决,百利而无一害,本身建模的一个目标就是指导安全测试的方向。测试时要注意常见的攻防案例是影响机密性,也要考虑攻击者破坏应用的可用性和完整性。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 标记详情,附加参考材料、变更记录;
- 威胁影响级别:从机密性、完整性、可用性,利用难度四个角度进行评估。衡量风险没有必要强制按照DREAD、CVSS评分模型,很大程度依赖于参与的安全专家对攻击者的视角、安全建设的成熟度、业务的可接受能力进行定级,一般给出高中低即可。
3.3 处理威胁是重中之重
- 缓解
采取措施加大攻击者的利用时间。就像Google Project Zero的原则“make 0-day hard”。比如发现密码猜解的威胁,采用二次认证、风控验证码的技术,缓解和解决风险的界限往往并不清晰。仔细想想大部分的日常安全工作都是缓解威胁,比如部署WAF、制定安全规章制度、监控和响应。
- 解决
完全解决该威胁。解决是最乐观的情况,常见的安全方案是基于现有的代码实现,比如防SQL注入组件,使用加密套件解决硬编码问题。如果威胁建模是发生在编码之前,可以使用现有的安全方案如Security SDK、密钥管理服务、身份认证方案,当然也可以引用新的安全技术去建设。
- 转移
转移是将威胁承担交由其他系统去处理,比如用户协议和隐私条款、免责声明,变更管理的二次认证、外包、购买网络安全保险。但是安全也不能对业务给个方案说你得买一份保险,这需要找到安全和业务的平衡感。
- 接受
接受风险也是面对安全成本的一个合理处理方式,不同层级的业务负责人对待安全的视角是有不同考虑的。比如在物理安全领域,我们往往做得适度投入,背后的原因是接受了战争、核武器等不可抗拒因素。
依据上述的威胁定义补充是等级、优先级、修复成本、负责人、排期、安全测试结果、解决方案记录结果,报告文字要规范,避免使用安全特定术语、缩略语如PoC、RCE、SSRF、HIDS字样。给出前瞻性的安全方案是区分安全测试和威胁建模的主要区别。对于共性问题建立孵化安全解决方案,有安全专项的也进行标记,后续可以比对安全项目的效果。
解决威胁的抽象原则要区分出安全建设的原则纵深防御、最小权限原则、默认(强制)安全并不一定适用于业务系统,业务更熟悉安全架构设计的5A原则:
- 身份认证(Authentication):用户主体是谁?
- 授权(Authorization):授予某些用户主体允许或拒绝访问客体的权限。
- 访问控制(Acccess Control):控制措施以及是否放行的执行者。
- 可审计(Auditable):形成可供追溯的操作日志。
- 资产保护(Asset Protection):资产的保密性、完整性、可用性保障。
3.4 验证威胁达到闭环
4、如何评价这件事做得好坏
5、经验教训
- 覆盖基础设施相对重要的公共组件服务和重要管理平台;
- 形成一套可复用的安全评审流程,知识库和工具;
- 及时发现公司管理平台的运营安全类风险,排期止损加固。
通过制定的威胁建模计划同业务部门深入开展合作,团队完成了数十个项目的评估,发现了数百个高危设计缺陷,从而试图解决两类核心问题:1、人为操作导致的安全风险,2、安全融入基础架构。识别提炼出孵化出特权账户管理平台、服务鉴权、执行沙箱、全程票据、安全知识库等安全子项目。当然建模的效果有好有坏,我们仍需学习、调整、迭代。总结了如下的经验教训:
- 关注真实的威胁,从技术威胁入手延伸到业务威胁;
- 安全没有银弹,使用其他应用安全措施补充威胁建模;
- 见木不见林,致力于高效的建模,而不纠结于细节;
- 关注安全的沟通协作,改善研发解决安全问题的思维方式,胜于投入精力在安全测试。
业界关于威胁建模的实施方法论在物联网、机器学习、ServerLess场景依旧很有生命力,说明在软件工程领域这会是识别威胁真正有效的办法。相信Threat modeling Application Security Testing(威胁模型驱动的应用安全测试)将成为应用安全的又一主流安全测试方法。
参考资料:
https://michenriksen.com/blog/drawio-for-threat-modeling/?ref=hackernoon.com
https://github.com/cncf/financial-user-group/tree/master/projects/k8s-threat-model
http://ceur-ws.org/Vol-413/paper12.pdf
https://community.iriusrisk.com/
https://threatdragon.org/login
http://mozilla.github.io/seasponge/#/
https://insights.sei.cmu.edu/sei_blog/2018/12/threat-modeling-12-available-methods.html
http://www.owasp.org.cn/owasp-project/OWASP_Top_10_Proactive_Controls_V3v1.1.pdf
http://www.woshipm.com/it/1663882.html
https://developer.ibm.com/zh/components/redhat-openshift-ibm-cloud/articles/threat-modeling-microservices-openshift-4/
https://docs.microsoft.com/en-us/archive/msdn-magazine/2006/november/uncover-security-design-flaws-using-the-stride-approach
https://cheatsheetseries.owasp.org/cheatsheets/Threat_Modeling_Cheat_Sheet.html
https://csrc.nist.gov/publications/detail/sp/800-154/draft?ref=wellarchitected
https://github.com/google/end-to-end/wiki/Threat-model
来源:安全客