供应链基础
供应链存在十大典型安全缺陷情况:输入验证、路径遍历、跨站脚本、注入、NULL 引用、资源管理、密码管理、API 误用、配置管理、日志伪造。
损坏的软件生成工具或更新的基础结构;
被盗的代码签名证书或使用开发人员公司的标识签名的恶意应用;
硬件或固件组件中附带的已泄漏的专用代码;
在相机、USB、手机等设备上预安装的恶意软件。
供应链攻击
供应链攻击它是针对软件开发人员和供应商的一种新威胁。目标是通过攻击软件或第三方供应商的软件、硬件、代码、系统等目标感染合法应用来分发恶意软件来访问源代码、生成进程或更新机制,从而达到控制目标系统权限的目的。
供应链攻击者,它通过搜寻一些不安全的网络协议、未受保护的服务器基础结构和不安全的编码做法。它们会闯入、更改源代码,并在生成和更新过程中隐藏恶意软件。
供应链攻击点有:供应链漏洞(0day、Nday等漏洞突破边界)、供应链后门(预留调试后门、内置口令)、供应链社工、供应链投毒。
由于软件由受信任的供应商生成和发布,因此这些应用和更新已经过签名和认证。在软件供应链攻击中,供应商可能不知道他们的软件应用或更新在向公众发布时感染了恶意代码。最后,恶意代码以与应用相同的信任和权限运行。
供应链攻击特点:
1、处于供应链上游,一旦遭受攻击就会影响下游供应链节点
2、供应链中引入的环节越来越多,攻击面越广,风险越大
3、隐蔽能力非常强,具有后门模块免杀、官方数字签名
4、涉及环节很多,每个环节接入审查,耗时耗力.
供应链风险
软件供应链风险因素:
1.设计阶段:由于开发人员对安全认知和掌握的缺失和忽略,往往导致软件产品在功能需求、架构设计和编译的程序代码中存在天然的安全缺陷,而这些往往是无法通过后期软件开发环境加固和安全应急响应进行根本解决的。
2.编码阶段:在编码阶段,软件开发编译器是常见的攻击目标,若编译器被植入恶意代码,那么通过该编译器编译出的目标代码也同样会受到病毒感染。编译器在自身编译的过程中被恶意插入“后门”,那么在通过该编译器编译任何源码时都可能将后门插入到目标代码中,对代码安全造成极为恶劣的影响。
3.发布阶段:现代软件开发厂商多以敏捷开发、DevOps 开发方式为主,具有“版本迭代快、开发时间短”的特征。开发团队在版本迭代过程中占用大部分时间执行编码工作,而测试团队则往往没有充足的时间开展测试工作,更无法做到每个版本都执行安全测试。因此,错误的架构设计或程序编码因安全检测不足而未被识别,导致软件自带安全缺陷进行上线部署,并通过不断迭代集成,最终变成软件供应链的安全隐患。
4.运营阶段:软件产品在发布之后到达用户手中时,就进入了软件产品的运营阶段,而用户使用过程中,除了产品本身的安全缺陷所带来的安全威胁之外,还可能遭受用户使用环境带来的安全威胁,针对软件运营阶段最常见的攻击方式主要是软件的升级劫持。
供应链安全方案
1、需求分析阶段
需求分析阶段考虑安全,实现安全左移,安全团队宣贯安全评估流程,提出安全质量要求,引导输出安全需求,
帮助开发人员提高其安全意识和安全能力,以保障业务安全。主要内容包括:
(1)安全需求分析,包括安全合规需求以及安全功能需求;
(2)安全设计原则;
(3)确定安全标准,规范安全要求,满足业务机密性、完整性和可用性需求;
(4)攻击面分析,分析系统各个模块可能会受到的攻击;
(5)威胁建模,确定安全目标、确定威胁列表,进行漏洞储备;
(6)安全隐私需求设计知识库,构建安全需求知识分享平台,根据安全需求,得出安全设计解决方案。
2、 开发测试阶段
为了尽可能避免软件上线前存在安全风险,需要在开发及测试过程中进行全面的代码安全审查,主要内容包括:
(1)安全编码,建立安全编码规范,帮助开发人员避免引入安全漏洞问题;
(2)管理开源及第三方组件安全风险,选用第三方组件时评估其风险级别,对第三方组件进行安全检查,提出解决风险方案;
(3)变更管理,对于变更操作进行统一管理;
(4)代码安全审查,制定安全审查方法和审核机制,确定代码安全审查工具;
(5)开源及第三方组件确认,确认第三方组件的安全性、一致性,根据许可证信息考虑法律风险,根据安全漏洞信息考虑安全风险;
(6)配置审计,制定配置审计机制,包括配置项与安全需求的一致性,配置项信息的完备性等;
(7)安全隐私测试,基于安全隐私需求设计测试用例并进行验证;
(8)漏洞扫描;
(9)模糊测试;
(10)渗透测试。
3、发布运营阶段
发布阶段确保可以交付安全的软件产品,主要内容包括:
(1)发布管理,制定相应的安全发布流程与规范,包括对发布操作的权限管控机制,发布流程的监控机制、告警机制等;
(2)安全性检查,进行安全漏洞扫描,以及校验数字签名的完整性等;
(3)事件响应计划,制定事件响应计划,包括安全事件应急响应流程,安全负责人与联系方式等。
发布阶段确保可以交付安全的软件产品,主要内容包括:
(1)安全监控,制定运营阶段安全监控机制,构建统一的安全监控平台,持续监控并上报;
(2)安全运营,定期进行常规安全检查与改进,如若发现潜在安全风险则应及时告警,根据漏洞信息、业务场景等智能化推荐安全解决方案,保证全生命周期安全;
(3)风险评估,制定和实施安全风险评估计划,定期进行安全测试与评估;
(4)应急响应,制定明确的应急事件响应流程,具备专门的应急响应安全团队,对于应急事件进行全流程跟踪、可视化展示、自动化处理、及时复盘形成知识库、量化风险指标;
(5)升级与变更管理,制定明确的升级与变更操作制度流程、权限管控机制、审批授权机制等,确保升级变更操作有明确的操作信息记录,与版本系统信息保持一致;
(6)服务与技术支持,有明确的服务与技术支持方式,对监管部门、运营商、用户等提出的问题进行反馈和及时响应,并对反馈问题进行系统性分类整理,确保安全问题的及时响应;
(7)运营反馈,定期收集运营过程中的安全问题,通过反馈平台统一收集、分类、全流程跟踪、解决、复盘等,以优化研发运营全流程。
小结
在软件的开发生命周期中,漏洞的引入不止有开发人员编写的源代码,还有所依赖的开源组件、开发和构建工具等,依照软件的开发和构建过程,可结合微软的SDL可用于保障软件安全的一个可靠的依据,同时用于建设开发过程安全评估能力。
微软SDL 的 7 个阶段主要的含义如下:
培训:针对开发团队进行安全意识与能力的培训,以确保 SDL 能有效实施并落地,同时针对新的安全问题与形势持续提升团队的安全能力;
需求:通过安全需求分析,定义软件产品安全实现过程中所需要的安全标准和相关要求;
设计:通过分析攻击面,设计相对应的功能和策略,降低和减少不必要的安全风险。同时通过威胁建模,分析软件的安全威胁,提出缓解措施
实施:按设计要求,实现对应功能和策略,以及缓解措施涉及的安全功能和策略。同时通过安全编码和禁用不安全的 API,减少实施时导致的安全问题,尽量避免引入编码级的安全漏洞,并通过代码审计等措施来确保安全编码规范的实行;
验证:通过安全测试检测软件的安全漏洞,并全面核查攻击面,各个关键因素上的威胁缓解措施是否得以验证;
发布:建立相应的响应计划,进行最终安全检查,确认所有安全活动均完成后将最终版本发送给客户;
响应:当出现安全事件与漏洞报告时,及时实施应急响应和漏洞修复。在此过程中新发现的问题和安全问题模式,可用于 SDL 的持续改进过程中
同时为了提高软件供应链安全的风险应对能力也可以引入DevSecOps,它是一种全新的安全理念和模式,由 DevOps 的概念延伸和演变而来。其核心理念是安全是整个 IT团队每个人的责任,需要贯穿从开发到运营整个业务生命周期每一个环节才能提供有效保障。
参考资料:
https://www.redhat.com/zh/topics/security/what-is-software-supply-chain-security
https://learn.microsoft.com/zh-cn/nuget/concepts/security-best-practices
2022中国软件供应链安全分析报告.pdf白皮书
https://m.freebuf.com/articles/es/365486.html
结束
【推荐阅读】
点个在看你最好看