软件供应链安全(二):Rust语言生态安全性分析

admin 2022年8月26日14:14:00评论108 views字数 4790阅读15分58秒阅读模式

1

引言

近年来,软件供应链安全事件呈现快速增长态势,在软件生命周期的各个环节、软件系统的各个层次上都可能发生。软件供应链已成为网络空间攻防对抗的焦点,直接影响到国家关键基础设施和重要信息系统安全。以守护软件供应链安全为己任,浙江大学网安发布软件供应链安全分析系统(名为“涅槃”),涵盖了多种语言生态的供应链安全分析,提出了系统化的数据聚合、抽象和提取方法,定义了组件影响力和漏洞传播能力评价指标,实现了高精度的组件依赖分析和新型数据聚合展示技术,达到对多种语言生态软件供应链的全景分析和依赖关系的量化分析,对提升整个生态软件供应链安全具有重要意义。

涅槃系统已对Java语言生态供应链安全进行了系统性分析,参见《软件供应链安全(一):Java语言生态漏洞影响力与修复分析》 。相比于Java,Rust是为解决系统编程领域的安全问题而专门设计的一种语言,通过ownership的设计和强大的编译时检查,保证内存和线程安全,被视为C/C++语言的安全替代者,获得了广泛的关注。Rust语言自2016年起一直被评为“最受欢迎的编程语言”。目前,学术界和工业界正在大量使用Rust重构几乎所有基础系统软件,包含操作系统、网络协议栈、数据库、浏览器、区块链等等。知名的Linux操作系统内核同样引入了Rust For Linux,支持开发者使用Rust语言开发内核驱动。Rust语言提供大量官方和第三方组件供开发者调用,不可避免会引入供应链安全问题,削弱Rust自身的安全保证。随着Rust语言的广泛应用,分析和量化这些安全问题显得尤为重要。因此,涅槃系统从组件依赖、开发者影响力,漏洞传播等三个方面系统化分析了Rust语言生态的软件供应链安全问题,结论总结如下:

  • 在组件依赖方面,Rust语言生态组件依赖高度集中。Top5的组件均被超过45%的组件所依赖,其中libc被超过48%的Rust组件所间接依赖,quote和proc-macro2被超过47%的Rust组件所间接依赖。超级组件如果出现安全问题将会对整个生态造成灾难性后果。

  • 在开发者影响方面,Rust头部开发者影响力巨大。Top5的开发者均影响了超过50%的Rust生态组件,揭示出核心开发团队动荡,头部开发者离职对整个Rust生态安全产生重要影响。

  • 在漏洞传播方面,Rust 漏洞通过依赖扩展,影响近40%生态组件。Rust生态目前已发现四百多个漏洞,且近两年漏洞增长迅速,其中unsafe语法的使用引入大量内存损坏漏洞,影响超过27%生态组件,揭示出Rust并非安全领域的“银弹”,不能一劳永逸地解决所有内存安全问题。


2

组件依赖高度集中

为了深入理解Rust语言生态软件供应链依赖,涅槃系统对Rust生态依赖关系进行深度分析,建立了一个覆盖全部Rust组件的依赖关系图谱,共包含8万多个组件(58万个组件版本和443万组直接依赖关系)。


2.1

依赖全景展示

涅槃系统分析发现Rust语言生态组件依赖高度集中,top5的组件均被超过45%的组件所依赖;通过对top5组件的依赖关系进行分别着色,涅槃系统绘制了top组件依赖全景图。


软件供应链安全(二):Rust语言生态安全性分析

图1 Rust传播影响力top5组件依赖传播全景图


涅槃系统将组件依赖关系中的直接和间接依赖定义为“传播影响力”,并根据传播影响力绘制出了Rust的语言生态中top5组件依赖全景图。如图所示,libc被Rust生态中超过48%的组件所间接依赖。quote和proc-macro2被超过47%的Rust组件所间接依赖,syn和unicode-ident则分别被超过46%和45%的组件所间接依赖。

  • 相比其他语言,Rust生态中组件的集中度更高,即存在超级组件,例如libc、quote和proc-macro2等。一旦这些超级组件出现安全问题,对Rust生态的影响力和影响程度都将是巨大的。

  • 同时从图中各个组件影响范围的分布上可以看出,top组件的依赖关系存在高度重合,经统计top5 组件间的依赖组件有超过70%的重合率,从侧面反映了Rust生态的高度集中性。

  • 通过与Java全景图对比发现,Rust生态top组件影响范围远超Java中的top组件。例如Java中传播影响力较大的top5 组件scala-library、self4j-api、guava、jackson-databind和spring,所影响的组件占Java生态的比例范围分布在10%-25%左右,而Rust中top5组件所影响的范围均超过Rust生态的45%。


2.2

组件影响力

以直接依赖和传播依赖的数量为依据,涅槃系统绘制了Rust生态中直接影响力和传播影响力排名靠前的30个组件以及他们之间的依赖关系。


软件供应链安全(二):Rust语言生态安全性分析

图2 直接影响力top30组件 VS 传播影响力top30组件


从对比图中可以看出,直接影响力和传播影响力top10组件没有包含相同组件,表明其差异较大。作为对比,Java Maven生态中直接影响力和传播影响力top10组件基本重合。由此可以看出,Rust组件存在明显功能性差异,可分为工具应用类型组件和基础框架类型组件,其中工具应用类型组件直接影响力较大,而基础框架类型组件传播影响力较大。

  • 直接影响力排名前三组件是serde、serde-json、log是工具应用类型的组件,比如生成随机数、数据序列化、产生调试信息输出等等。相对于Java生态中直接影响力较大的top组件为Scala、self4j、spring、log4j等一些大型的、系统性的框架。

  • 传播影响力排名前三组件是libc、quote、proc-macro2。不同于直接影响力top组件多为应用类型组件,传播影响力top组件通常是基础组件的一部分有api,libc(C语言底层接口),编码之类的,相对来说间接依赖更加广泛。


2.3

组件依赖层级

涅槃系统统计了每个层级依赖组件的版本数量,绘制了Rust libc组件和Java log4j组件依赖层级对比图。


软件供应链安全(二):Rust语言生态安全性分析

图3 libc和log4j组件依赖层级对比图


对比可以看出,Java组件依赖在1-14层均有分布,大部分集中在1-10层,相比之下,Rust生态组件依赖层次较浅,且较为集中,主要分布在1-5层。主要原因是Rust生态较为年轻,组件版本数量较少;此外Rust语言偏向系统编程,缺少大型、复杂的框架组件,因此依赖层次相比Java较浅。


3

头部开发者影响过半生态

涅槃系统分析发现Rust生态严重依赖头部开发者,top5的开发者均影响超过50%的生态组件;根据开发者所维护的组件数量以及这些组件在整个生态的传播影响力,涅槃系统绘制了top开发者影响力展示图。


软件供应链安全(二):Rust语言生态安全性分析

图4 Rust生态 top20 开发者


如图所示,Rust生态中top开发者所维护的组件被相当多的组件所间接依赖,其中排名前5位的开发者Alex、Huon,Ember、David以及Rust-lang-owner,均影响了超过50%的Rust生态组件。如果Rust生态中的top 开发者本身出现安全相关问题,则很有可能直接对整个生态的安全造成广泛影响。

2021年11月,Rust官方开发团队动荡,内部矛盾激化,Moderation部门全体成员离职。涅槃系统分析发现Moderation部门成员所维护的组件被超过42%的Rust生态组件间接依赖,在生态中占有较大比例。对于发展尚未成熟的Rust生态来说,活跃的开发者和维护者离职会对Rust社区造成严重影响。


4

漏洞传播影响近40%生态组件

为理解漏洞在Rust语言生态供应链上的传播和影响,涅槃系统收集400+个Rust漏洞,对漏洞增长趋势、漏洞类型和漏洞传播影响力进行了分析。


4.1

漏洞增长趋势

软件供应链安全(二):Rust语言生态安全性分析

图5 Rust生态漏洞增长趋势图


如图所示,在 Rust 生态系统发布的漏洞数量随时间的变化曲线中可以看出,Rust生态总体漏洞数量较少,Rust社区相对小众和安全。但是在过去两年里Rust相关漏洞有一个急剧的增长。这表明 Rust软件供应链生态在迅速成长,漏洞和社区的增长同步,各类安全问题也亟需解决。


4.2

漏洞类型

软件供应链安全(二):Rust语言生态安全性分析

图6 Rust生态漏洞类型分布图


Rust语言主打其提供的语言级安全支持,主要针对的是内存安全和线程安全。但涅槃系统分析显示,该两类安全问题仍然高居榜首,是Rust生态中的主要漏洞问题类别,这展示了Rust并非安全领域的“银弹”,不能一劳永逸地解决内存和线程安全问题。

虽然Rust宣称可以从根本上解决很多安全问题,但是其建立在项目本身完全使用safe代码块的基础之上。而现实中Rust项目并未严格遵从该限制,大量组件使用unsafe块,使得编程者可以摆脱编译器的部分限制,实现更灵活的功能,但也引入内存和线程安全漏洞,削弱了Rust生态的安全性。


4.3

漏洞传播影响力

涅槃系统精准定位了目前已分类的各个漏洞所涉及到的组件版本,并统计了组件版本的所有直接和间接依赖(即传播影响力),分析发现Rust漏洞传播影响近40%的生态组件。为展示漏洞传播规律,涅槃系统绘制了图7 Rust生态漏洞组件传播影响力分布图, 同时根据漏洞的类型将组件传播影响力进行分类汇总,绘制了图8 Rust生态漏洞传播影响力分类汇总图。


软件供应链安全(二):Rust语言生态安全性分析

图7 Rust生态漏洞组件传播影响力分布图


如图7所示,通过统计含有漏洞组件的传播影响力发现,time组件被超过10万的组件版本所依赖,rand-core被超过6万的组件版本所依赖,net2和miow均被超过4万的组件版本所间接依赖,这些含有漏洞的组件是Rust生态漏洞传播和漏洞修复的关键节点。


软件供应链安全(二):Rust语言生态安全性分析

图8 Rust生态漏洞传播影响力分类汇总图


如图8所示,Rust生态中memory-corruption、code-execution、thread-safety类型的漏洞所涉及到的组件传播影响力占Rust生态总体58万个组件版本的比例分别是27.02%、20.44%和10.87%,是Rust漏洞中传播影响范围较广的主要漏洞类型。而且值得注意的是code-execution类型漏洞虽然在Rust整体漏洞类型分布中只占据4.35%,但是经过组件的依赖传播,该类型漏洞影响了超过20%的Rust生态组件版本,仅次于memory-corruption,需引起重视。


5

结语

本文初步展示了涅槃系统对Rust语言生态的软件供应链安全分析,对整个生态的组件依赖进行了分析和展示,揭示出Rust语言生态中具有较大影响力的超级组件,并对组件的依赖层级进行分析,为后续安全防护工作指明了重点方向。同时涅槃系统挖掘出了Rust生态的头部开发者,首次量化了开发者对生态的影响力。此外涅槃系统对Rust生态中的漏洞进行统计,深入分析了漏洞的类型分布和传播影响力,定位了漏洞传播中影响力较大的组件,为有针对性的漏洞修复提供了指导,对提升整个Rust生态软件供应链安全具有重要意义。

涅槃系统目前可对Java、Rust等编程语言进行供应链组件依赖分析,漏洞传播分析与预警,漏洞修复追踪;后续拟扩展覆盖所有主流编程语言,定期发布代码数据集和漏洞数据集;对语言生态供应链依赖进行分析,发布语言生态安全性分析报告;同时发布软件供应链漏洞预警系统,对基础软件、关键行业进行供应链漏洞预警,为提升国内软件供应链安全水平贡献力量。



团队介绍


浙大网安软件供应链安全课题组,由任奎教授带领,申文博、常瑞等教授为骨干,以保护软件供应链安全为宗旨,聚焦多种语言生态和多个关键垂直领域软件供应链安全问题,提出全栈式供应链安全防护方案,助力提升软件供应链安全。团队成员包含多名教授和数十名博士、硕士研究生,研究成果覆盖软件供应链各个层次,包含硬件、操作系统、软件,已发表计算机安全顶会论文20余篇。多项研究成果被应用于超过亿部设备,并获得人民日报网络专题报道。


原文始发于微信公众号(浙大网安):软件供应链安全(二):Rust语言生态安全性分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年8月26日14:14:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   软件供应链安全(二):Rust语言生态安全性分析https://cn-sec.com/archives/1256221.html

发表评论

匿名网友 填写信息