背景

软件供应链(Software Supply Chain)指的是软件从软件供应商到用户使用的整个过程中,从设计软件、编写代码到生成软件的开发环节,再到分发软件和用户下载的交付环节,最终到用户使用环节的三大环节组成的链状结构。

软件供应链攻击指的是攻击者充分利用供应链的安全漏洞,在合法软件的开发、交付、使用中进行劫持或者篡改,并依赖供应链上的信任关系以逃避传统安全产品的检查,沿着供应链向后渗透,从而实施对目标的网络渗透及非法攻击。

供应链.png

在今天这种企业架构与软件开发形态下,越来越多的商业软件、硬件设备、开源项目被集成到企业的 IT基础设施中,从而扩大了潜在的攻击面,让安全防御变得越来越复杂,以及充满着大量「不确定性」。黑客发起攻击不再关注你是谁,只要你与被攻击目标的网络或业务存在关联,就会成为重点攻击对象。

近几年软件供应链攻击事件被越来越多的披露,引起了安全行业的关注,大部分安全公司都有专门的研究,阿里安全还专门举办过软件供应链安全大赛。因为这种攻击对象范围广、攻击方式隐蔽,危害大,给企业安全防护带来了极大的挑战。

历史攻击情况

生产节点

软件开发涉及到的软硬件开发环境、开发工具、第三方库、软件开发实施等等,并且软件开发实施的具体过程还包括需求分析、设计、实现和测试等,软件产品在这一环节中形成最终用户可用的形态。

攻击手法:

1. 开发工具污染,植入后门

攻击者伪造、篡改开发者常用的开发工具,附加一些恶意的模块或插件。当开发者进行代码开发的时候,恶意模块悄悄的在开发者写的代码中植入后门。经过被污染过的开发工具编译出来的程序,或部署到生产业务的源码,都将被植入恶意代码。

2. 向开源软件仓库投毒

攻击者通过向主流的软件包管理源(PyPI、NPM、Maven、RubyGems、Docker Hub 等)投放大量「相似拼写名称」的软件包或镜像,仿冒正规项目,从而让有恶意代码的代码包被安装到开发或生产环境。

攻击案例:

交付节点

用户通过软件官网、公共仓库、在线商店、免费网络下载、购买软件安装光盘等存储介质、资源共享等方式获取到所需软件产品的过程。受攻击对象比如著名的软件下载站、Python 官方镜像源、Github 等。

攻击手法:

1. 入侵官方网站/升级服务器替换下载链接或文件

黑客通过漏洞控制软件官网/更新升级系统后,篡改官方下载链接地址为植入了恶意后门的软件,或利用窃取/伪造证书签名的软件更新,将恶意软件带进攻击目标,从而间接控制目标计算机。

2. 社工开发者账号替换正规应用

在安卓、苹果和三方移动应用商店,通过盗取应用开发者账号替换正规应用,或发布相似名称的「仿冒应用」,或通过重打包的技术,将恶意代码注入进合法应用中,从而散布存在恶意代码的应用。

3. 黑灰产模式推广恶意软件

在第三方下载站点、共享资源社区、破解软件联盟等组织投放含有恶意代码的应用,通过 SEO 优化方式劫持搜索引擎结果,引导大众下载恶意软件。

攻击案例:

使用节点

使用软硬件产品的整个生命周期,包括产品更新升级、维护等过程。

攻击手法:

1. 污染网络基础设施的 DNS 解析记录

利用企业级路由器的已知漏洞或弱口令批量入侵网络设备,修改路由器上的 NS 解析服务器为黑客所控制的服务器,通过劫持软件用于更新的域名解析记录,从而利用更新通道将恶意代码植入目标计算器。

2. SaaS 化上游服务污染

互联网公司会使用大量 SaaS 服务,比如在前端开发体系,有大量优秀的框架供开发者快速实现各类功能,如 Jquery、Bootstrap、Vue 等,开发者为了省事,会直接引用官方提供的 CDN 地址。当上游的 JS 代码源被入侵,引用这些三方 JS 代码的业务,将演变为发起更大规模代理人攻击的跳板。

攻击案例:

现状

目前业界主要关注开发软件供应链的生产环节,交付和使用环节一般采取安全加固和安全签名的措施。

行业现状

国内供应链安全做的比较好的是华为、中兴,可能是因为国外压力所以比较重视。

而国内互联网公司对软件供应链安全的研究还处于探索阶段,因为周期过长,管理成本很高,真正体系化落地的还没有,基本上偏 Case 驱动,和已有的安全体系结合,发现问题时再处理。腾讯相对做的比较好。

国外 Google 已经有成熟的软件供应链管理工具 Grafeas 和 Kritis,用于云环境的元数据管理和策略检查。

内部现状

目标

  1. 建立准入机制,将供应链中的数字资产纳入全面的、基于真实风险的安全评估体系中。
  2. 为供应链中的软件和产品构建详细的物料清单(SBOM),掌握软件的组件使用情况。
  3. 加强研发环节中的安全管控能力,及时收敛安全风险,防止安全漏洞被带上线。
  4. 实现统一的研发资产管理平台,记录资产的血缘关系,监控产品的分发和交付流程。

解决方案

组件准入控制

  • 研发设施默认使用内部统一的私有源,禁止使用外部公开软件源。对常见的公开源域名进行 DNS 劫持。
  • 安全培训时强调统一使用内部私有源,不允许随便使用外部开源组件,对于不确定的组件可以申请安全评估。
  • 收敛开源组件使用,只有经过安全扫描的组件才能用于开发。白盒和 App 组件扫描定期对服务端、客户端的开源组件进行扫描,发现已知的 CVE 漏洞和后门等恶意代码,保障内部私有源可靠。
  • 收敛第三方服务和系统使用,业务方使用第三方系统需要进行审批报备。公司内部存在大量第三方服务和系统,为了及时发现和处理安全问题,需要对这些系统进行记录和定时检查。

IT 资产库建设

  • 搜集和管理研发相关的数字资产,能够清楚知道资产的分布情况、部署情况和使用情况。和公司内部各研发平台对接,同步研发资产,进行统一维护和管理。
  • 维护研发资产血缘关系,明确组件之间的依赖关系。在发生安全事件时能准确判断对业务系统的影响范围,快速定位威胁的影响范围从而能够快速判定和处理威胁,提升安全运营响应速度。
  • 为研发资产打标,对资产的安全属性进行识别和补全。基于各种安全能力为资产做定期和实时的扫描,将扫描结果同步到资产库,形成标签。
  • 为每个软件、产品持续构建详细的物料清单。软件物料清单可以帮助企业发现当前运行中的程序、源代码、构建依赖项、子组件所依赖的开源组件,以检测开源软件组件是否带有已知的安全漏洞或合规问题。

研发环节管控

  • 对研发流程中的各环节进行安全检查,及时发现安全风险。在代码开发、编译、打包、上线等各阶段融入相关的安全能力,自动化进行安全检测。
  • 加入卡点机制,阻塞有安全风险的研发环节。如果发现安全风险(组件存在漏洞/后门、使用外部源地址等),联动对应的研发平台,暂停研发流程,防止风险被带上线。

软件分发加固

  • 为软件产物添加数字签名,防止被篡改。代码签名是在软件供应链中建立信任的重要过程,签名和验证体系可以确保程序的执行都是可信、可靠的。
  • 网络加密传输,保护敏感数据,防止网络劫持。

参考资料