点击蓝字 关注我们
当前,开源软件已经上升为国家级战略,对于信创和软件产业、国民经济、国防与国家安全等发挥着重要的支撑作用。为此,全球多国陆续发布开源软件规划与政策。2021年11月,我国工信部印发的《“十四五”软件和信息技术服务业发展规划》明确提出:开源已覆盖软件开发的全域场景,正在构建新的软件技术创新体系,引领新一代信息技术创新发展,全球97%的软件开发者和99%的企业使用开源软件,基础软件、工业软件、新兴平台软件大多基于开源,开源软件已经成为软件产业创新源泉和“标准件库”。
开源软件之间存在着非常复杂的依赖关系,即一个开源软件通过源代码拷贝、源代码二次开发、组件依赖引用等方式复用并依赖于其它开源软件,构成了复杂的开源软件供应链。然而,由于开源软件生态以及开源软件供应链日益复杂,开源软件的大范围使用也给软件产品的可信性带来了巨大的影响。开源软件供应链上的任何一个开源软件都有可能存在安全漏洞、许可证、兼容性等问题,严重提高了软件产品使用开源软件的安全风险、法律风险、维护风险。近年来,由此造成的软件供应链事故也频繁发生(如图1所示)。
图1 软件供应链事故频发
为了解决上述问题,复旦大学软件工程实验室软件供应链治理小组近5年来开展了一些研究工作,并沉淀和推出了开源风险治理平台伏羲(如图2所示),旨在推动学术与合作交流,同时提高开源风险的治理水平。当前首次发布的版本主要支持Java和Go语言的组件依赖分析(即软件物料清单分析)与组件级漏洞传播影响分析,以及PyPI和NPM生态投毒检测,并支持GitHub账户的关联以及GitHub项目仓库的导入分析。当前版本还构建了Java 和Go语言的高质量漏洞库与组件库。
图2 开源风险治理平台伏羲
伏羲的访问网址是www.se.fudan.edu.cn/fuxi,试用用户可以联系我们fuxioss@163.com获取邀请码注册;有问题也可以通过上述邮箱联系我们。
01
功能概述
【组件依赖分析】
伏羲通过对Java项目中pom.xml文件的扫描、Go项目中go.mod文件的扫描,实现对直接/间接开源组件依赖的全量检测。
【漏洞传播影响分析】
伏羲通过构建项目的组件依赖树信息,结合漏洞库中的漏洞影响组件版本信息,实现漏洞在组件依赖树上的传播影响分析。
【生态投毒检测】
伏羲通过对PyPI和NPM上新发布的组件版本进行实时监控与分析,共计发现了229个已确认的恶意PyPI组件和136个已确认的恶意NPM组件。
【漏洞库】
伏羲通过半自动校验的方式构建了高质量开源漏洞库,共计收录了2867个开源软件安全漏洞,直接影响的组件覆盖了1622个 Java组件和416个Go组件。
【组件库】
伏羲对Maven、Go Package、Python Package Index上托管的组件进行了全量下载,共计收录了522729个Java组件(共10186133个组件版本)、866559个Go组件(共13450236个组件版本)、405349个Phthon组件(共3956724个组件版本)。
02
案例演示
我们将以 GitHub 上的 Go 项目 kubernetes v1.23.15(将其fork为k8s-kubernetes)作为案例,演示伏羲的功能和操作流程。
2.1 GitHub账户关联
用户可以通过GitHub账户实现授权绑定(如图3所示),从而可以实现GitHub上托管项目的导入与分析。
图3 GitHub账户关联
2.2 GitHub项目仓库导入与分析
通过授权绑定的GitHub账户,可以读取到GitHub账户下所有的项目仓库信息。用户通过添加项目仓库,可以实现项目仓库的在线检测(如图4所示)。检测时间依赖于项目仓库的复杂程度,在几秒到几分钟不等,待检测结束后输出安全风险分析报告。
图4 GitHub项目仓库导入与分析
2.3 项目安全风险分析
项目安全风险分析报告包括:项目中通过漏洞组件引入的漏洞数量、组件依赖清单(即软件物料清单SBOM)、组件漏洞列表、以及组件漏洞风险(如图5所示)。可以看到,k8s-kubernetes项目通过5个漏洞组件引入了6个高危漏洞,通过2个漏洞组件引入了3个中危漏洞。
图5 项目安全风险分析报告概览
图6展示了k8s-kubernetes项目的组件依赖清单。可以看到,k8s-kubernetes直接依赖了systemstat、azure-sdk-for-go、k8s-cloud-provider等组件,并间接依赖了mocks、logger、tracing等组件。同时,在组件依赖清单上标识了通过组件所引入的漏洞数量。
图6 项目组件依赖清单
图7展示了组件漏洞风险。可以看到,k8s-kubernetes通过5个间接依赖组件引入了6个高危漏洞和3个中危漏洞。例如,组件golang.org/x/crypto@v0.0.0-20210817164053-32db794688a5引入了2个高危漏洞CVE-2021-43565和CVE-2022-27191。这两个漏洞的传播链(即组件依赖链)为golang.org/x/crypto@v0.0.0-20210817164053-32db794688a5 -> github.com/Azure/go-autorest/autorest/adal@v0.9.13 -> k8s-kubernetes。
图7 项目组件漏洞列表与组件依赖链
2.4 生态投毒检测
图8展示了伏羲在PyPI和NPM生态中检测到的恶意组件列表,包括组件名称、组件发布时间、检测时间、恶意行为描述、以及组件下载量。可以看到,伏羲在组件发布后立即检测其恶意行为,并上报给PyPI和NPM官方,尽可能早地防止恶意组件进入生态。PyPI和NPM官方都确认了这些恶意组件,并将其下架(如图9所示)。
图8 PyPI和NPM生态的恶意组件
图9 恶意组件官方确认信
2.5 漏洞库
图10展示了伏羲的漏洞库,目前覆盖Java和Go语言,并通过人工确认的方式提高了漏洞库的质量(如漏洞影响组件版本信息等)。
图10 漏洞库列表
2.6 组件库
图11展示了伏羲的组件库,目前覆盖Maven、Go Package、Python Package Index上托管的组件。
图11 组件库列表
03
版本发布计划
伏羲目前尚处于起步阶段,集成了简单的组件级漏洞传播影响分析。下一版本将持续优化组件级漏洞传播影响分析,并将集成Java、Go、Python语言的函数级漏洞传播影响分析(即漏洞可达性分析)、以及更多生态的组件投毒检测与监控。
04
致谢
伏羲的首次发布离不开陶紫信、郭锦、陆宸昊、严轶轩、魏入磊、吴苏晟、曹毅恒、周卓彤、张峻安等同学的不懈努力和坚持,同时也得益于王颖、施博文、许聪颖、谢隽丰等毕业生的前期工作!特别感谢Scantist联合创始人、新加坡南洋理工大学刘杨教授参与指导!
复旦大学CodeWisdom团队
作者:陈碧欢、黄凯锋、彭鑫