供应链安全论文阅读(一)Backstabber's Knife Collection: A Review of Open Source Software Supply Chain Attacks
引言
该论文Backstabber's Knife Collection: A Review of Open Source Software Supply Chain Attacks发表在2020年的DIMVA上,作者为波恩大学的Marc Ohm。本文是开源软件供应链安全领域较早期的一篇论文,主要针对软件供应链中恶意软件包的威胁进行了详细介绍。
首先简单介绍一下软件供应链安全的概念,在现代化软件开发过程中,开源组件和开源软件包被大量使用以加快软件开发进行,例如我们日常使用的python中可以使用import导入第三方库,并且我们导入的第三方库还可能使用了其他的第三方库,由此,在一个软件的开发过程中会形成复杂的供应链体系,这就是所谓的软件供应链。而软件供应链安全则是指软件供应链体系面临的安全威胁,如果一个上游软件包中被植入了恶意代码或者存在安全漏洞,那么这个存在安全威胁的软件包就会根据依赖关系被引入到下游系统从而影响众多软件的安全。如2021年爆出的Log4J漏洞,众多使用该日志框架的软件和系统都面临被攻击的危险。
作者在论文中介绍了恶意软件和漏洞的区别,漏洞是项目在开发过程中无意间引入的设计缺陷或者代码错误,而恶意软件是攻击者将刻意构造的恶意代码植入到正常组件从而实现攻击的目的,两者核心的区别点在于漏洞代码的引入是否具有目的性。
在这篇论文中,作者主要完成了以下工作:
- 收集了174个用于在真实环境中用于攻击的恶意软件包数据集Backstabber's Knife Collection,这些软件包通过人工收集和分析
- 分别提出了恶意代码注入和恶意代码执行的攻击树
主要方法
在数据集收集方面,Backstabber's Knife Collection包含Npm, Maven, PyPI, Packagist和RubyGems这些语言的恶意软件包。作者通过从Synk,安全公告(security advisories)和研究网站识别恶意包和可能的攻击向量。通过这些来源,通常只能获取到软件包的名称和受影响的版本号,实际的恶意代码需要从其他地方下载,然而这些恶意包通常已经从官方的存储库(PyPI,Npm等)中删除。因此,作者从一些存储库的镜像源和其他研究者的仓库尝试进行下载这些恶意包,如果下载成功就手动进行分析后加入数据集中。恶意包的发布日期是通过libraries.io获取的,libraries.io是一个用于监控各类软件包发布的服务,可以用来确定恶意包的发布和公开披露的时间。
简单来说,这里作者是通过Synk以及一些披露恶意包的网站获取了恶意包的信息(名称,版本号等),但是这些恶意包通常已经被官方仓库删除,因此作者从尝试从镜像源去下来了这些恶意包。
镜像源是指一些存放官方存储库软件包的镜像仓库,主要目的是加快软件包的安装速度,缓解官方存储库负载等。官方存储库为了保证软件安全会及时删除披露的恶意包,但是这些镜像源通常更新速度落后于官方仓库,并且有些文献中提到部分镜像源只会同步增加软件包的操作,而不会同步删除操作。因此,这些软件包的镜像源中会包含很多未删除的恶意包,获取到恶意包的包名和版本号后即可从这些镜像源下载这些恶意包源码。
本文的另一个贡献就是恶意包的攻击树,攻击树可以表示针对一个系统的攻击,其中根节点表示攻击的主要目标,子节点表示实现实现这个目标的可能方式。第一个攻击树的目标是将恶意代码注入到下游用户的软件供应链中,第二个攻击树的目标是在不同情况下触发这些恶意行为。这些攻击树都是基于对数据集中的恶意包攻击向量的分析得来的。
威胁分析和攻击树
开源项目开发流程
如图1中所示,维护者是开源项目的管理者,提交和审查项目代码,制定和实施项目构建。开源项目也会接收贡献者的代码,经过审查后可能会合并到项目代码中。
在项目构建过程中,依赖管理器会根据项目的依赖关系下载所需要的软件包,在项目构建成功之后,可能被加入到软件包存储库中作为其他项目的依赖或被其他用户打包使用,因此各个开源项目之间的依赖关系会非常复杂。
从攻击者角度来看,攻击者通过在上游的开源包中注入恶意代码,就可以通过依赖路径注入到下游用户的项目中并在某一时间触发。
恶意代码注入
如图中展示的攻击树是Pfretzschner和Othmane工作(Identification of dependency-based attacks on node.js)的扩展和细化。
为了将恶意代码注入到依赖树中主要有两个策略:
- 创建一个新的包或感染一个已有的包。创建一个新的包好处是不会被仓库维护者干扰,但是必须要让用户引入和使用才能将恶意代码导入成功。
- 另外一个方法是感染一个已有包,攻击者通常会选择一个具有大量用户的软件包,可能选择在软件包的源代码,构建过程,存储仓库系统(主要指针对存储仓库的一些攻击)等阶段注入。对于源代码阶段注入, 攻击者可能假装一个代码贡献者提交包含恶意代码的代码或者通过盗取仓库管理员的账号。对于编译阶段的注入,攻击者主要攻击编译系统,例如通过修改编译系统的DNS代理等,使其在编译时下载到包含恶意代码的资源。对于攻击存储仓库,一般开源项目在编译完之后可能由管理者发布到PyPI等存储仓库,攻击者可能盗取管理者的PyPI仓库,从而发布包含恶意代码的软件包。
另外,攻击者可能将包含恶意代码的软件包上传到软件包仓库的镜像源,从而将恶意代码注入到终端用户的系统。
恶意代码执行
如图中展示的是恶意代码的触发过程,恶意代码可能在不同阶段和不同情况下执行。
恶意代码可能在安装时,测试时,运行时执行,这里以Python举例,攻击者可能将恶意代码注入到__init__.py文件中,当用户使用import语句导入恶意包是就会触发恶意代码。
恶意代码可以在不同情况执行,例如只针对linux或windows系统或者需要满足某些依赖。
恶意代码样例
如图是两个恶意代码的样例及其对比,可以看到攻击者首先获取了远程的恶意文件并写入了本地文件,然后修改了文件的执行权限,通过DNS查询解析了加密后的IP地址(猜测此处的IP地址可能会攻击者的主机IP,从而使受害者机器回连攻击者主机,从而实现远程控制等攻击),最后对恶意文件进行了执行。
总结
这篇论文是软件供应链安全领域较早期的一篇论文,一方面,通过人工审核的方式收集和验证了包含174个恶意包的数据集,这是该领域最早公开可用的数据集之一,后续的其他工作很多使用了该数据集;另一方面作者基于数据集中,通过攻击树的方式对恶意代码的注入和执行流程进行了分析和建模,加深了对软件供应链恶意行为的理解,为之后的分析和检测奠定了基础。该论文也存在一些不足,在数据集方面,作者并没有详细介绍数据集的来源(只提到了Snyk和一些安全公告和博客,没有详细说明)和收集流程,数据源相对单一并且该数据集包含的数据量相对较少,这导致之后的分析可能具有较大的偏差。在攻击树方面,作者构建的恶意代码注入和执行的攻击树都比较简单,缺少更深入的分析,软件供应链中恶意代码的注入和执行的流程要更加复杂和多样。总的来说,这篇论文对于之后软件供应链恶意软件的分析和研究有很强的启发意义,为之后软件供应链的发展奠定了基础。
热门相关:终极高手 呆萌配腹黑:欢喜小冤家 傲娇小萌妃:殿下太腹黑 呆萌小萝莉:高冷男神太腹黑 娇女种田,掌家娘子俏夫郎