2022年Rust安全漏洞分类盘点

电子说

1.3w人已加入

描述

去年我写了 2021 年 Rust 生态版图调研报告 | 星辰大海(上)[1](下)[2] ,大家能看到 Rust 在各个行业领域中开始暂露头角。2022 年,在政治动荡、经济下行和疫情肆虐的世界大环境下,Rust 却迎来了高质量的发展。2022 年,我愿称之为 Rust 发展元年。

系列目录

  • Rust 2022 漫谈
  • Rust 2022 全球商业应用盘点
  • Rust 2022 安全参考
  • Rust 2022 开源生态盘点
 

Rust 2022 漫谈

踏上新的征程:Rust 2024

Rust 2021 Edition 发布以后,官方就开始制定 Rust 2024 Edition 的路线图了。Rust Edition 是每三年发布的一个大版本(版次)。在 2022 年 4 月,官方博客宣布 Rust 2024 Roadmap 。让我们了解一下 Rust 的下一步愿景是什么。

Rust 2024:广泛应用

Rust 的目标是成为一门赋予每个人构建可靠且高效软件能力的语言。Rust 不仅需要设计和实现一种具有优秀库和优秀工具的优秀语言,还需要维护一个优秀的支持社区。

Rust 2024 Edition 的目标是广泛使用,即,让越来越多的人开始使用 Rust 。为了达到这个目标,2024 Edition 需要关注以下三个重点:

  • 拉平 Rust 语言的学习曲线。让 Rust 更容易为新用户和现有用户所用,并让解决难题变得更容易。这样可以吸引更多新的 Rust 用户。
  • 增强 Rust 用户间的彼此合作。
  • 让 Rust  Project (语言自身项目)的贡献者更加方便
拉平学习曲线

建立大型 Rust 用户团队的公司报告说,Rust 工程师的典型的上岗时间约为 3-6 个月。当然,一旦人们学习了 Rust,他们通常会喜欢上它。即便如此,许多人表示在使用它时感觉“认知开销”很高,而“学习曲线”仍然是不使用 Rust 的最常见原因。事实是,即使在您了解了 Rust 借用检查器的工作原理之后,仍然有许多“小细节”需要正确处理才能让您的 Rust 程序编译。

对于 Rust 2024 目标是让开发者能够直接关注问题域的“固有复杂性”,并尽可能避免来自 Rust 的“意外复杂性”。

实现这一愿景的计划是专注于四个高级目标(按从广义到精确的顺序):

  • 更精确的分析,更少的繁琐:通过改进借用检查器、类型推断等,使编译器能够更好地识别代码何时正确。识别并消除“样板”模式,例如必须在各处复制和粘贴同一组 where 子句。
  • **更轻松地表达自己:必要时扩展语言,以便开发者可以更直接地表达他希望代码执行的操作。在某些情况下,这采用语法糖的形式(例如 let-else),但在其他情况下,它可能意味着扩展类型系统以能够描述新模式(例如泛型关联类型)。
  • 改进异步支持:将我们的async/await支持扩展到当前的“MVP”之外,以包括 trait 中的async fnasync drop和支持异步愿景文档路线图所需的其他功能。
  • 提升dyn Trait可用性:**拓宽可以使用dyn的 trait 集,并使使用dyn更接近于使用泛型。
增强 Rust 用户间的彼此合作

Rust 结合了所有权和借用、底层系统控制以及过程宏等强大的可扩展性机制,使其成为编写库的绝佳语言。而且,多亏了 Cargo,在程序中使用一个库只需要几行代码。尽管如此,仍有许多事情是库作者不能做或不容易做到的。例如,他们无法控制用户看到的错误消息或部署需要特殊选择加入的“Unstable”功能。Rust 2024 希望通过帮助管理功能生命周期或扩展库的功能来构建使库作者能够更好地为用户服务的功能。

Rust 2024 希望追求能够在生态系统中进行更多探索的变化,实现这一愿景的计划是专注于四类工作:

  • 功能生命周期:帮助库作者在功能从实验阶段过渡到最终完成阶段时为其提供支持。帮助库作者管理他们的开发生命周期和演变。
  • 更丰富的抽象:扩展语言让库作者表达更丰富的抽象。比如支持 GAT ,让开发者编写更通用的库。
  • 定制开发人员体验:许可库作者可以定制开发人员体验,例如,定制未实现 trait 或引入自定义 lints 时用户收到的错误消息。
  • 互操作性:库生态系统可以轻松协调,使库协同工作,而无需将它们捆绑在一起。库作者可以根据需要编写可在多种环境中移植或特定于一种环境的代码。
让 Rust  Project 的贡献者更加方便

Rust 语言自身也是一个 Rust 项目,虽然 Rust 语言项目非常活跃,但是当潜在贡献者想要对 Rust 项目贡献时,可能无法弄清楚感兴趣或想要贡献的某些特定事物的状态。因此 Rust 官方团队需要一个系统,以便这些贡献者可以很容易地知道 Rust 项目的状态而更容易地找到贡献点。

Rust 2024 实现这一愿景的计划是将重点放在四类工作上。

  • 一目了然地看到状况。潜在贡献者能够很容易地识别出语言团队正在积极开展哪些工作,以及这些设计已经取得了多大进展。希望每一个跟踪问题都能清楚地识别出需要哪些 "下一步 "来推动该特定功能的完成,并确保这些步骤被清楚地记录下来,供可能的贡献者参考。
  • 清晰的所有者和清晰的沟通。Rust是通过共识运作的,但这并不意味着每个人都必须知道所有的细节。因此需要一个系统,对需要完成的工作有明确的所有者,最好是不在 Lang 团队中的所有者。简单的分工会导致日后的冲突,所以我们也需要频繁的沟通和更新,以确保每个人都能了解事情的整体发展方向,并尽早地提出问题。
  • 高效、开放的流程与工具支持。官方团队一直在寻找方法来改善他们的运作方式。他们注意到的一点是,由机器人或其他工具支持的流程往往能更好地工作。

2022 语言改进看点

2022 年 Rust 语言一共发布 11 个稳定版本(1.58~1.66),从语言特性、编译器到库 API 均有改进。下面分别从这三方面罗列了一些看点。

语言特性

  • 字符串格式化支持捕获变量的形式{ident}
  • *const T 现在支持常量上下文中解引用
  • 泛型结构体中使用 Unsize的规则更加宽松  ,参考 relaxed_struct_unsize 跟踪 issue
  • 稳定新的 asm!和 global_asm!适用于 x86、x86_64、ARM、Aarch64 和 RISC-V
  • 稳定解构赋值,比如支持这种形式(a, (b.x.y, c)) = (0, (1, 2));
  • 稳定常量泛型参数支持默认参数值,并移除类型和 const 参数的顺序限制
  • 稳定#[cfg(panic = "...")]"unwind""abort"
  • const fn 签名现在已经支持   泛型 trait 限定、 返回位置的 impl Trait 和 函数指针的创建传递转换,以及 extern "C"extern "Rust"
  • NLL 稳定,当前编译器仅使用基于 MIR 的借用检查
  • 稳定let else
  • 稳定泛型关联类型 (GAT),重要特性,允许开发者可以更方便地开发更加通用的库和框架。
  • 未初始化的整数、浮点数和原始指针现在被视为立即 UB。使用 MaybeUninit是处理未初始化内存的正确方法。
  • 不允许对 Pin (哪怕 T 在本地)实现 Drop
  • 重复的生命周期参数将不被自动省略

编译器

  • 升级到 LLVM 14
  • 出现 lint 错误后不要中止编译
  • 错误消息在更多地方指向 trait bound obligations 的来源
  • 将 -Z strip 稳定为 -C strip
  • 添加了更多的 Tier 3 编译目标
  • 编译器内部完成了统一跨所有平台的 可重入锁 ReentrantMutex 实现
  • 为优化编译启用 MIR 内联 这为真实世界的 crate 提供了 3-10% 的编译时间改进。查看性能结果。

库 与 API

  • copycopy_nonoverlapping重新启用调试检查
  • Duration::new 和相关的一系列函数可以用于常量上下文
  • 稳定ops::is_breakops::is_continue
  • 稳定 std::available_parallelism ,该函数可以返回程序应使用的默认并行度的估计值,即它可以同时执行的计算数量的限制。也会考虑CPU 配额。例如,在一个有 8 个虚拟 CPU 但配额只允许 50% 使用率的容器中,available_parallelism将返回 4。
  • 常量上下文中新支持了很多 API ,比如   <*const T>::offset<*mut T>::offset
  • 用基于 futex 的 RwLock 取代了 Linux 上基于 pthread 的 RwLock,另外 Mutex 和 Condvar 也正在被改进
  • 标准库中修复了许多不正确的使用mem::uninitialized的情况
  • 增加 thread::scope 的支持

其他

  • rustdoc 支持递归显示所有 Deref 实现
  • Cargo 支持支持缩写--release-r
  •  Cargo 将在二进制文件之前完成库的文档化
  • std::io中添加/proc/self/mem. 有关的文档
  • Cargo 现在可以从workspace继承设置,以便可以将设置集中在一个地方
  • Rustup组件rust-analyzer现已在稳定channel上可用。
  • BTreeMap修复了一个健全性错误,允许在容器之前删除它借用的数据。

点评今年最重要的语言特性就是泛型关联类型(GAT )的稳定。GAT 的稳定带给了 Rust 更高级的抽象方式,允许库和框架开发者开发出更加通用的工具。

Rust 社区热点观察

Rust for Linux 进入 Linux 内核

参考:Rust for Linux 文档

今年最热的热点就是 Rust for Linux 进入 Linux 6.1 内核。

在今年10 月,初始的 Rust 基础设施已被合并到 Linux 6.1 。意味着未来 Rust 编程语言将用于内核驱动程序和其他子系统的代码。但初始的 12.5k 行新代码只提供了底层的基础设施和一些非常基础的集成,据称未来的 PR 将添加更多的子系统抽象、多个 Rust 编写的驱动程序等等。目前,构建具有 Rust 支持的 Linux 内核仍然是可选的。

在 11 月,领导 Rust for Linux 工作的 Miguel Ojeda 发布了一组优化补丁( 28 个),为内核提供了更多的 Rust 核心支持代码。这些新的补丁很可能会在 Linux 6.2 合并窗口中看到。

整个 Android 12 和 13 系统中,Rust 代码中发现的内存安全漏洞为零

近日, Google 发文称 Android 中使用了内存安全语言 Rust  之后,发现内存安全漏洞的数量在过去几年/版本中大幅下降,从 2019 年到 2022 年,内存安全漏洞的年度数量从 223 个下降到 85 个。2022 年是内存安全漏洞不再占 Android 大部分漏洞的第一年

在 Android 13 中,大约 21% 的新原生代码(C/C++/Rust)是 Rust。AOSP 中大约有 150 万行 Rust 代码,涵盖新功能和组件,例如 Keystore2、新的超宽带 (UWB) 堆栈、DNS-over-HTTP3、Android 的虚拟化框架 (AVF) 以及各种其他组件及其开源依赖项。

迄今为止,在 Android 的 Rust 代码中发现的内存安全漏洞为零。

我们不希望这个数字永远保持为零,但考虑到两个 Android 版本中新 Rust 代码的数量,以及使用它的安全敏感组件,这是一个重要的结果。它表明 Rust 正在实现其防止 Android 最常见漏洞来源的预期目的。在许多 Android 的 C/C++ 组件(例如媒体、蓝牙、NFC 等)中,历史漏洞密度大于 1/kLOC(每千行代码有 1 个漏洞)。基于这个历史漏洞密度,使用 Rust 很可能已经阻止了数百个漏洞进入生产环境。

在 Android 的 Rust 中使用 unsafe 似乎按预期工作。它很少被使用,当它被使用时,它是一种封装行为,更容易推理和审查安全性。比如,UWB 代码中 unsafe 有两种用法:一种是实现对存储在 Java 对象中的 Rust 对象的引用,另一种是用于拆解该对象。Unsafe 在这种情况下非常有用,因为对这段代码的额外关注使我们能够发现可能的竞争条件并加以防范。

Rust 在 Android 平台上的使用正在增长,但这还没有结束。为了实现提高 Android 范围内的安全性、稳定性和质量的目标,Android 团队决定需要在本机代码的任何地方使用 Rust。目前正在用 Rust 实现用户空间 HAL。在受信任的应用程序中添加了对 Rust 的支持,已将 Android 虚拟化框架中的 VM 固件迁移到 Rust。随着 Android 从 C/C++ 迁移到 Java/Kotlin/Rust,预计内存安全漏洞的数量将继续下降。

Rust 语言引入了吉祥物彩蛋

当你使用 Rust 吉祥物 定义变量时,

fn main(){
 let  = 1;
}

Rust 编译器会抛出专属的错误:

error: Ferris cannot be used as an identifier
 --> src/main.rs9
  |
2 |     let  = 1;
  |         ^^ help: try using their name instead: `ferris`

本来是非官方吉祥物,这个彩蛋也许是来自官方的一种文化认可。

rust-analyzer 被纳入 rust-lang 官方仓库中

rust-analyzer 现在已经成为了 Rust 官方的一员。VSCode 、NeoVIM 和 Emacs 等编辑器对 ra 有很好的支持。如果你使用基于 IntelliJ 平台的 IDE,如 CLion、IDEA 或 PyCharm,则不需要 rust-analyzer,而应该使用JetBrains 的IntelliJ Rust插件。

2019 年 rust-analyzer 社区刚起步构建 IDE 的基础,到 2020 年,RFC2912中 就提倡:“将 rust-analyzer 作为官方的 LSP(语言服务器协议)实现”。RFC 在社区的压倒性支持下被接受:它仍然是有史以来投票最多的 Rust RFC。让 ra 成为官方的一员将持续推动该 RFC 的落地。接下来,将 rust-analyzer 宣传为 Rust IDE 支持的极有可能的未来,收集反馈,并根据其积极结果,淘汰当前推荐的语言服务器 RLS。

来自开源作者的呐喊:“请记住,我的项目是零收入”

开源项目Kind和HVM的作者 Victor Taelin ,收到一位社区中有影响力的人的如是批评:“这个项目背后的人往往会建立令人印象深刻的东西,但后来他突然放弃了这些东西,然后去做点别的……”。这份批评让 Victor 非常难过,因为这位来自社区有影响力的人也给予了 Victor 很多灵感。

Victor 公开声明:“我们只是没有资金!看,这不是大公司的工作,甚至不是大团队的工作。80% 的代码仍然是我做的。有一些朋友帮忙,但他们大多是兼职,自愿,还在学习这东西,所以帮助有限。**然而,什么都没有被放弃。我们只是受到我们微小规模的限制。我没有报酬,这不是一家营利性公司,我只是一个创造酷炫、免费技术以推动人类进步的人。我热爱我的工作!不过,如果您确实希望看到我的想法更快地发展,请考虑对它们进行投资”。

Victor 说:不管怎样,HVM 和 Kind 都在积极、热情的开发中,并将继续向前发展,即使有点慢!

来自社区的另一位回复非常暖心:“老实说,即使你放弃了你的项目,我仍然会感谢你的工作。你的输出是创新的,我可以看到它们影响未来的 PL 发展。就我个人而言,我认为你对我自己产生了积极的影响,并且确实帮助激发了我对类型理论的兴趣。综上所述,请不要让一些误导性的批评使您沮丧。只要继续做你最擅长的事情,你就会知道这些年来你已经赢得了很多感激的支持者。”

Rust 1.65 稳定版发布

Rust 1.65 稳定版发布带来了 Rust 最重要的特性:泛型关联类型。该特性的重要性可以这么说:如果没有它, Rust 将停滞不前。GAT 非常通用,可以实现许多当前无法编写的模式。有关更多信息,请查看稳定公告。

虚幻引擎集成 Rust

社区中有人将 Rust 集成到了 虚幻引擎(Unreal Engine )5 中,发布了 unreal-rust。unreal-rust 使用基于 Bevy 的实体组件系统 (ECS),然后 Rust 通过 C FFI 与 Unreal 通信,在 Unreal 之上编写AActor并以 Rust 友好的方式公开其 API。

虽然是个人项目,但非常有创意。

Asahi Lina 谈她用 Rust 编写内核驱动程序的经历

Asahi Lina 用 Rust 编写了新的 Apple AGX GPU 驱动程序(M1 和 M2)。这些 GPU 运行固件并且具有相当复杂的需要宿主机管理的共享内存数据结构,所以 Lina 一直倾向于 Rust。在使用 Rust 之后,Asahi Lina 如是说:「关于内核中的 Rust 是否有用存在很多奇怪的争论......根据我的经验,它比我想象的更有用! 我从第一个渲染到一个稳定的桌面,可以运行游戏、浏览器等。在我的驱动程序上工作了大约两天!所有并发错误都随着 Rust 消失了!内存在需要释放时被释放!一旦你学会了让 Rust 与你一起工作,我觉得它会引导你编写正确的代码,甚至超出语言的安全承诺。这真的很神奇!」

NSA 发布关于如何防范软件内存安全问题的指南

美国国家安全局 (NSA) 发布了一份指南,以帮助软件开发人员和操作员预防和缓解软件内存安全问题,这些问题占可利用漏洞的很大一部分。建议使用内存安全的Rust 语言。

NSA 方面表示,内存安全问题在可利用的漏洞中占比很大。并引用了微软的数据指出,该公司从 2006 年到 2018 年 70% 的漏洞是由于内存安全问题造成的;谷歌的 Chrome 在几年内也发现了类似比例的内存安全漏洞。

该组织认为,恶意的网络行为者会利用不良的内存管理问题来访问敏感信息、颁布未经授权的代码执行、以及造成其他负面影响,而这些通常会危及设备并成为大规模网络入侵的第一步。

Rust 连续 7 年荣获 Stackoverflow 最受欢迎语言

每年面向百万开发者的Stackoverflow 调研结果显示,Rust 再次拿下最受欢迎语言,今年是连续第七年收获此殊荣。并且,在今年 11月的 TIOBE 编程语言排行榜中,Rust 也首次进入了前二十,暂排第 17 位。

Rust 基金会成员增加到了 39 家

在 2021 年2 月9 日 Rust 基金会成立之初,只有Mozilla、Amazon、华为、谷歌、微软五家创始白金成员,截止到今天(2022.12月)已经有 39 家不同领域的头部公司成为了Rust 基金会成员,共同推动 Rust 在各自领域的落地。

本节小结

2022 年,是新的起点。在 2021 Edition 发布之后,官方又起草和制定了 2024 Edition 路线图,并且在该路线图的指导下开启了新的征程。Rust 2024 的目标是让 Rust 广泛应用。

2022年,Rust 语言特性上取得了重大进展,稳定发布了泛型关联类型。这一特性的发布将解锁 Rust 语言高阶统一抽象,促进生态库和框架的长足发展,以及 Rust 异步特性向零成本抽象的目标更近了一步。

2022 年,最受人们关注的是 Rust for Linux 进入Linux 内核这件事。虽然当前进入内核的只是初步基础补丁,但这关键的一步已经为未来 Rust 在 Linux 内核领域发展奠定了很好的基础。

2022 年,也是收获硕果的一年。Google Android 团队宣布,2022 年是内存安全漏洞不再占 Android 大部分漏洞的第一年。Android 13 已经有大约 21% 的新原生代码(C/C++/Rust)是 Rust。AOSP 中大约有 150 万行 Rust 代码,涵盖新功能和组件。并且,迄今为止,在 Android 的 Rust 代码中发现的内存安全漏洞为零。

2022 年,我们也看到社区中一些个人开发者,虽然遭遇不公平的流言蜚语,依然对 Rust 热爱依旧,在零收入的状况下默默地使用 Rust 实现自己的开源项目。

2022 年,可以说是 Rust 语言的发展元年。随着越来越多的公司采用 Rust ,Rust 变得越来越受欢迎。展望未来,我们衷心希望 Rust 2024 Edition 发布目标,让 Rust 广泛应用,可以圆满实现。

Rust 2022 全球商业化应用盘点

  • Rust 基金会成员应用盘点
  • Rust 初创产品
  • Rust 领域应用
  • 总结

2022 年是 Rust 语言距离稳定版正式发布以来已经走过的第七年。从 Rust 发布以来,就一直受到广大开发者的欢迎。在 Stackoverflow 来自 180 个国家 7万3千多名开发者的投票调查中,Rust 连续七年荣获最受欢迎的编程语言,87% 的开发人员希望使用 Rust 。

2022 年也距离 Rust 基金会成立的第二年。在 2021 年2 月9 日 Rust 基金会成立之初,只有Mozilla、Amazon、华为、谷歌、微软五家创始白金成员,截止到今天(2022.12月)已经有 39 家不同领域的头部公司成为了Rust 基金会成员,共同推动 Rust 在各自领域的落地。

2022 年在 Rust 基金会成员公司之外,也有不少公司开始使用 Rust。其中包含初创企业,使用 Rust 从头构建产品;也有成立多年的老牌公司,使用 Rust 来改进生产。Rust 开发者数量也逐渐增多。据开发者调查分析公司 SlashData 发布了一份题为“第 22 届开发者国家状况”的报告指出,从 2020 年 Q1 季度到 2022 年 Q1 季度,Rust 语言的开发者用户量从 60 万猛增到了 220 万。TIOBE 编程语言排行榜2022 年 11 月榜单中,Rust 语言进入了前 20 。

可以说,2022 年是 Rust 语言开始广泛应用的元年。本文就让我们来盘点一下 Rust 在全球商业化领域的应用状态。

Rust 基金会成员应用盘点

Rust 基金会成员投资 Rust ,尤其是白金成员们,是在投资 Rust 的可持续性,他们认为应该使用这种语言来构建可持续且安全节能的解决方案。

白金成员如何应用 Rust

在 AWS,Rust 已迅速成为大规模构建基础设施的关键。Firecracker是一种开源虚拟化技术,为AWS Lambda和其他无服务器产品提供支持,它于 2018 年公开发布。AWS 使用 Rust 来交付Amazon Simple Storage Service (Amazon S3)、Amazon Elastic Compute Cloud (Amazon EC2)、Amazon CloudFront等服务。2020 年,推出了Bottlerocket,这是一个用 Rust 编写的基于 Linux 的容器操作系统。Amazon EC2 团队使用 Rust 作为新AWS Nitro 系统组件的首选语言,包括敏感应用程序,例如Nitro Enclaves(用于处理机密数据的隔离 EC2 环境)。

此外,过去一年,Amazon Prime Video 使用了 WASM 和 egui 为超过 8k 多种设备类型更新其应用向数百万客户提供内容(例如游戏机、电视、机顶盒和流媒体等)。他们认为对 Rust 和 WebAssembly 的投资得到了回报,经过一年的开发,共编写了 37,000 行 Rust 代码,显著地提高了性能、稳定性和 CPU 消耗并降低了内存利用率。

Google 将 Rust 应用于Chromium、 Android 和 Fuchsia OS 中,其中 Chromium 对 Rust 支持是实验性的。开发者可以使用 Rust 为 Android 和 Fuchsia OS 开发组件,并且 Rust 在 Android 和 Fuchsia OS 内部代码使用超过了一定的比例,尤其是 Fuchsia OS 中 Rust 代码占比已经超过 50%。因为其内部 Cpp 代码比较多,所以 Google 联合 Meta (原 Facebook) 一起开发了 cxx 用于和 Cpp 安全交互。在今年 10 月份,Google 又推出基于开源 RISC-V 芯片的嵌入式系统的新型安全操作系统 KataOS。Sparrow 是 KataOS 的参考实现,它运行在seL4 之上,几乎完全用 Rust 编写。该操作系统不适用于台式机或智能手机,而是用于物联网,可能用于智能家居。目标是为嵌入式硬件或边缘设备构建可验证的安全操作系统,例如用于捕获图像的网络连接相机,这些图像在设备上或云中处理以进行机器学习。在最新发布的 Android 13 版本中,Google 也宣布在 Android 13 中,大约 21% 的新原生代码(C/C++/Rust)是 Rust。AOSP 中大约有 150 万行 Rust 代码,涵盖新功能和组件。并且,迄今为止,在 Android 的 Rust 代码中发现的内存安全漏洞为零。 为了实现提高 Android 范围内的安全性、稳定性和质量的目标,Android 团队表示需要能够在代码库中需要本地代码的任何地方使用 Rust。

华为的目标是引领通信系统软件向安全可信演进,其中 Rust 语言正在发挥很大的作用。华为希望通过部分 C/C++ 代码的迁移,在保证高性能的同时,拥有更高的安全性。在此过程中, 为开发者提供一套自动化工具支持:基于开源的 C2Rust 转译工具, 首先从 C 代码生成 Rust 代码, 然后通过源到源变换工具自动重构。在华为内部还基于 Actor 的并发编程模式开发了 Rust 库,方便程序员充分利用 Rust的语言特性, 例如async/await等开发异步程序。华为也为 Rust 社区贡献了许多重要的功能特性。例如,为 Rust 编译器提交了一系列代码,使得 Rust 编译目标可以支持ARM AArch64 32位大端变体ILP32芯片组, 用于华为的通信产品中。这些改进使得华为和友商可以在这些常用网络硬件架构上执行Rust 原生程序。这些代码已经通过华为的 Rust 专家Amanieu d'Antras 提交给了 LLVM 编译器, libc 库, 以及 Rust 编译器等开源社区。华为国内工程师 李原 也为 Rust 做了很多贡献,其中包括修复了多个当前并行编译导致的程序错误,(比如串行并行模式在迭代器panic场景的行为一致性、并行编译死锁处理的ICE问题)、分析并优化了多个编译过程中频繁锁同步导致并行编译效率降低的问题(比如生成attributes编号、生成生命周期依赖分析表等等)、优化了编译器中多处诊断信息的生成,(比如查询中layout深度限制、错误using语句的提示信息、let语句中默认类型的提示信息等),并且在2022年李原主导发起重启 Rust 编译器并行编译工作组,准备为加速 Rust 编译器并行编译做出贡献。

Meta(原Facebook )从 2016 年开始使用 Rust,也就是该语言的 1.0 版发布一年后。Rust 是它用于 Diem(以前的 Libra)稳定币区块链、Mononoke 源代码控制服务器和Meta 的“用于区块链的新的安全编程语言” Move的主要语言。 选择 Rust 而不是 C++ 对 Meta 来说是一个重大决定,因为它的大部分后端代码都是用 C++ 编写的,这使其成为显而易见的选择。 据 Meta 称,在 Mononoke 被认为取得成功后,Rust 的采用势头强劲,吸引了具有 Python 和 JavaScript 背景的工程师。 现在,Rust 与 Hack、C++ 和 Python 一起成为主要受支持的服务器端语言。Meta现在建议将 Rust 用于编写命令行界面 (CLI) 工具和“性能敏感的后端服务”。Meta 内部也针对 Rust 建立了专门的新手训练营,用于培养 Rust 工程师。Meta 对 Rust 生态的重要贡献之一是 cxx ,用于 Rust 和 Cpp 之间的安全交互。在 2022年 7 月,Meta 首次宣布 Rust 成为 Meta 支持服务器端使用的编程语言。

Microsoft 拥有世界上最大的 C/C++ 代码库之一。从 Windows 和 Office 到 Azure 云,其所有核心产品都在其上运行。从2019年开始,微软开始寻找内存安全的语言,与此同时,引入了 Rust 进行尝试。随后在 GitHub 上开源了 Rust for Windows 库  ,供 Rust 开发者们无缝地使用 Windows API。此外,Azure 孵化的团队 DeisLabs 开始尝试用 Rust  构建 Krustlet 来允许开发人员在 Kubernetes 中运行多个 WebAssembly 模块的服务。2022 年微软 Azure首席技术官Mark Russinovich表示,C 和C++不应该用于新项目。“是时候停止使用 C/C++ 启动任何新项目,并将 Rust 用于那些需要非 GC 语言的场景。为了安全性和可靠性,业界应该宣布这些语言已被弃用”。他在 Twitter 上表示,表达的是个人观点,而不是微软的新政策。

2022 年 DeisLabs 初创团队离职后出来创业创建了 Fermyon 公司 ,专注于 WebAssembly 云产品。

JFrog 于 2022 年 9 月宣布加入了 Rust 基金会成为白金会员。JFrog 提供了一个DevOps 平台 ,并且支持多种主流编程语言。JFrog 加入 Rust 基金会的目的就是为了与 Rust 社区和 Rust 基金会合作,帮助保护软件供应链。JFrog 将识别并消除 Rust 平台和生态系统面临的安全威胁,并修正 Rust 平台问题以防止进一步的风险。随着物联网(IoT)、云计算和大数据的出现,网络安全威胁也越来越大。在过去两年中,Rust 编程语言的使用量增加了两倍,达到 220 万开发人员。JFrog 与非营利组织的合作反映了其从最近采用的覆盖组织软件供应链的安全解决方案中获益的战略。

金牌成员如何应用 Rust

Shopify 是加拿大跨国电商公司,在 2022 年 12 月份宣布加入 Rust 基金会,成为基金会第一个金牌会员。Shopify 在服务端一直使用 Ruby 语言,从2021年开始,Shopify 团队开始使用 Rust 实现YJIT,这是一种新的 CRuby 即时 (JIT) 编译器 ,到今年合并到了 Ruby 3.1 版本中。在最近的一次性能测试中,YJIT 的性能比 Ruby 解释器 CRuby 快了 38%。

除此之外, Shopify 也决定采用 Rust 作为公司的系统编程语言,比如编写高性能网络服务器。在 Shopify 看来,Rust 的一致性、性能、社区生态、生产力、安全和互操作性是他们采用 Rust 用于系统编程的原因。

银牌会员及普通赞助商如何应用 Rust

Rust 基金会的银牌成员逐渐增多,目前已经达到了 28 家公司。这些公司分布在各个领域。此外,还包括三家非会员普通赞助商。在文后的「Rust 其他领域应用」小节将统计他们的应用信息。

Rust 初创产品

2022 年也可以算作是 Rust 创业元年。因为今年陆续有好几家采用 Rust 的创业公司拿到了巨额融资。

Fermyon

首当其冲的是 Fermyon 技术公司。在今年十月份,Fermyon 宣布拿到了 2000 万美元的 A 轮融资。并且发布了 Fermyon Cloud 平台。

Fermyon Cloud 旨在使基于 WebAssembly 的应用程序和微服务的[1]部署变得快速和容易。使用 Fermyon 的 Spin 构建工具(基于 Rust 实现),为 WebAssembly 编译和打包应用程序,然后可以立即将其部署到 Fermyon Cloud。Fermymon 的工具链处理将应用程序代码投入生产所需的所有基础设施配置和部署步骤,使应用程序开发人员无需了解有关底层基础设施的任何信息。

WebAssembly 起源于浏览器,针对高安全性和低资源消耗进行了优化。通过将 WebAssembly 引入服务器环境,应用程序可以享受相同的优化,同时使用通用代码库部署到各种环境:云、边缘、物联网或任何组合。Fermyon 以这些概念为基础,将 WebAssembly 引入数据中心和云端。Fermyon 希望实现类似于 Java 的“一次编写,随处运行”的承诺,同时又具有 Heroku 的易用性。它使开发人员无需过多考虑基础架构,从而有助于消除应用程序开发中的摩擦。

“使用 Fermyon Spin,开发人员可以快速创建 WebAssembly 微服务应用程序,现在使用 Fermyon Cloud,开发人员可以在不到两分钟的时间内从零开始实现并部署应用程序。这是 WebAssembly 在云中实现的承诺:快速开发、快速部署、快速执行。”,Fermyon 的联合创始人兼首席执行官 Matt Butcher 在一份声明中如是说。

新终端 Warp

虽然现在的常用的终端模拟器也有很多好用的,比如 Rust 实现的高性能跨平台现代化终端模拟器 alacritty 。但它们的内核其实还是一个传统的终端模拟器。现代开发者,要使用终端做很多事,从构建代码、执行和部署,与版本控制系统交互到与云端交互等。作为开发者日常离不开的工具,在当下日益增长的开发需求的时代,现在的终端模拟器却没有帮助开发者提升更多工作效率。

而 Warp 的出现,让我看到了终端模拟器进化的下一代形态。Warp 在 2022 年 4 月 5 号推出其公开测试版并宣布获得 2300 万美元的资金,它正试图通过构建一个旨在提高开发人员生产力的新命令行终端来改变这一现状。Warp 值得关注的功能特性是对团队协作的支持,可以共享团队的终端模拟器会话,可以方便地解决团队之间沟通的问题。其他功能还有很多,包括集成了云端,可以让团队方便地共享剪切板等。更多功能可以去这里查看。

我还没有来得及自己的去挖掘 Warp 的具体功能,但是单从这些功能特性上来看,正如 Figma CEO Dylan 所说,Warp 这个产品和 Figma (在服务端和 wasm 模块 也使用 Rust)很像,都是 All in One,并且连接了云端,为团队协作提供了很多方便的功能。并且在商业模式上,都属于产品驱动增长(PLG, Product-led Growth)型公司。事实上,正是 Figma CEO 领投了 Warp ,跟投的还有 Elad Gil (AirBnB、Pinterest、Stripe 和 Square 的早期投资者)、Jeff Weiner(领英执行董事长兼前CEO)和 Marc Benioff(Salesforce 创始人兼 CEO)。Dylan 认为 Warp 和 Figma 正是可以提升用户十倍工作效率的那种工具,他也承认投资 Warp 有赌博的成分。

Warp 选择使用 Rust 语言来实现。使用 Rust 技术栈(包括 WebAssembly)也方便构建跨平台支持。在底层,使用 Metal (Mac 的 GPU API)直接用 GPU 进行 UI 渲染。之所以使用 GPU 进行渲染,是因为团队想摆脱 CPU 上面的许多软件和架构瓶颈,来适应更高分辨率的显示器。选择 Metal 而不是 OpenGL 作为 GPU API,因为 Warp 把 MacOS 作为第一个平台。Xcode 中的 Metal 调试工具非常出色,使 Warp 团队能够检查纹理资源并轻松测量帧速率和 GPU 内存大小等重要指标。Mac 平台现在也是大多数开发者选择的重要生产力工具。

但是,目前 Rust 对 GPU 支持并不是很完善,没有开箱即用的合适的 UI 库。团队考虑过 Azul和Druid,但这两者都处于实验阶段,所以团队决定和 Atom 编辑器联合创始人 Nathan Sobo 合作,使用他创建的一个受 Flutter 启发的 Rust UI 框架,不久后应该会开源。在未来,会支持更多的渲染后端,比如OpenGL 和 WebGL(会通过 wasm 支持)。同时也和 Nathan 合作,在 Warp 中构建了一个文本编辑器。Warp 也 fork 了 Alacritty 的模型代码,用于处理数据模型,为 Warp 界面中的块实现提供了帮助。

看得出来,Warp 作为一个商业产品,它并没有将其产品的全部代码进行开源。但他们在实现产品过程中,通过解决 Rust GUI 和 GPU 渲染相关的问题,沉淀出一些工具和库,会以开源的方式贡献给社区。虽说要走 PLG 路线,开源社区非常重要,但也并不是说盲目地之间把产品全部开源出来。还是要根据自己的商业模式和产品形态做出最好的权衡。

初创数据库领域公司

今年在数据库领域的初创公司可以算得上是扎堆出现了。

在 2022 年 4 月,Rust 社区知名开发者 Jon Gjengset 宣布成为 ReadySet 公司的联合创始人,准备将其博士论文中的 Noria 数据库研究成果进行落地为 ReadySet ,为数据库提供 SQL 缓存引擎,可帮助开发人员构建高性能的实时应用程序,而无需更改代码或切换数据库。该公司目前 A 轮融资 2900 w 美元。

在 2022 年 4月,已经融资千万美元的数据库初创企业 Singularity Data Singularity Data(奇点无限公司)宣布开源 Rust 实现的云原生的支持SQL的流式数据库 RisingWave 。RisingWave 于 2021 年初开始用 Cpp 创建,在七个月之后用 Rust 重写。对于早期创业公司来说,这是一个疯狂的决定。特别是在竞争激烈的环境中,对科技初创公司来说,时间几乎就是一切。

流媒体服务

实时事件流媒体公司 InfinyOn 筹集了 500 万美元的种子资金,由 Gradient Ventures 和 Fly Ventures 领投,Bessemer Venture Partners、TSVC 等参投。InfinyOn 使用由 Rust 开发的动态数据可编程平台  Fluvio 。Fluvio 拥有超过 1,000 个 Github star,在开发人员和开源社区中越来越受欢迎。

“在 Java 时代构建的遗留数据平台会生成大型二进制文件,需要大量内存,并且从边缘到核心的操作具有挑战性。这些也缺乏实时决策的在线处理能力,”InfinyOn 的联合创始人兼首席技术官 Sehyo Chang 说。“我们通过消除对 ETL 工具的需求来简化数据架构,提供更具成本效益的平台,内存减少高达 80 倍,并通过内存安全解决方案提供最大的安全性。”

“我们整合来自不同来源的医疗保健数据:物联网、患者和医生的输入。借助 InfinyOn,我们可以使用现代工具快速高效地完成这项工作。它是用 Rust 编写的,与 Kafka 相比,这使得团队更容易集成。” Nammu 首席执行官 Chris Brucker 说。

InfinyOn 可以轻松地从多个来源提取、整形和转换数据,并实时计算结果。虽然仍处于 Beta 阶段,但早期采用者已在 InfinyOn 的概念验证中看到了与替代解决方案相比的显着优势。除了易用性和开发速度之外,与其他供应商相比,供应商还看到了总拥有成本的显着降低。

Rust 其他领域应用

软件定义汽车:Rust  的关键作用

关键字:软件定义汽车

汽车标准组织 Autosar——其成员包括福特、通用、宝马、博世、大众、丰田、沃尔沃等——在 4 月份宣布在其功能安全工作组 (WG-SAF) 中成立一个新的子组,以探索 Rust 如何能够用于其参考平台之一。SAE International 还 成立了一个工作组 来研究汽车行业中与安全相关系统的 Rust 。在 5 月份 Autosar 和 Rust 团队进行了一次交流 ,探讨Safe Rust 在汽车领域是否可以构造一个合规的安全子集,讨论内容就是 Ferrocene Rust 安全子集。

随后 Autosar 官网撤销了成立新的 Rust 工作组的新闻,也许是要等待 Ferrocene Rust  的成果。另外,在今年9月份,Volvo 汽车公司的技术专家和系统架构师 Julius Gustavsson 接受了采访,他坦言,想在 Volvo 中推动 Rust 开发。

Ferrocene Rust 安全子集

Ferrous Systems 和 AdaCore  在今年2月份宣布,他们将联手开发 Ferrocene——一种符合安全要求的 Rust 工具链,旨在支持各种受监管市场的需求,例如汽车、航空电子设备、太空和铁路。这意味着根据各种安全标准对 Ferrocene Rust 编译器进行汽车安全性等级 ASIL 的 D 级(D 代表最高程度的汽车危险)认证,这项工作最终将包括必要的动态和静态分析工具的开发和资格认证。Ferrous Systems 和 AdaCore 也在寻找经过安全认证的库,包括语言支持 (libcore) 或其他用户库。我们的目标是针对与这些市场相关的各种架构和操作系统。这一愿景需要时间才能实现,而 Ferrous Systems 和 AdaCore 准备从关注某些特定方面开始。最终,我们的目标是像支持任何其他与高完整性应用程序开发相关的编程语言一样全面地支持 Rust。Ferrocene 语言规范目前正在制定中,预计年底发布。

其他公司

在 Rust 基金会银牌会员中还有 ARM 也在致力于推动 Rust 在软件定义汽车中落地。

即时通信: Threema

关键字:即时通信

Threema 是一款跨平台、隐私安全且开源的即时通信工具。

密码管理工具:1Password

关键字:跨平台

1Password  很早就使用 Rust 来构建其 Windows 客户端。在 2019 年将其支持浏览器扩展的逻辑引擎从 Go 移植到了 Rust ,然后就开始了 Rust 跨平台的应用实践。直到 2022 年 11 月,1Password 也开源了其跨多种语言生成一致的类型模式 的 Typeshare 库。Typeshare 可以帮助开发者实现跨语言无缝同步共享数据类型,这是跨平台安全开发的利器。

GUI :目标取代 Qt

关键字:Qt、GUI

全球知名Qt咨询和UI/UX设计服务公司 tQCS 的合作伙伴有两家都加入了 Rust 基金会银牌会员。分别是:

  • KDBA :在嵌入式系统、3D 图形以及跨桌面、嵌入式和移动平台的工作方面拥有多年经验, KDAB 是 Qt 项目的主要贡献者。
  • Slint: 极大地简化了取代 Qt 需求的嵌入式平台的 GUI 开发。支持 Rust/Cpp/Javascript ,有设计友好的 UI 标记语言。其创始人同样来自 Qt 项目主要贡献者,QtQml 引擎的主要开发者。

云存储:Dropbox

关键字:云存储

Dropbox 是最早使用 Rust 并取得成功的公司之一。Dropbox将 Rust 用于其部分文件同步引擎。以及一个新的视觉交流工具 Dropbox Capture ,旨在使团队能够轻松地使用屏幕记录、视频信息、屏幕截图或GIF来异步分享他们的工作。

边缘计算:Cloudflare

关键字:边缘计算、serverless

Cloudflare 在其核心边缘逻辑中使用 Rust 来替代内存不安全的 C。Cloudflare worker 支持 Rust 和 WebAssembly 。在今年 9 月份,Cloudflare 还宣布正在用 Rust 实现一款可以替代 Nginx 的代理服务器 Pingora 。

迪士尼公司(Walt Disney Company)

关键字:WebAssembly 、渲染引擎

迪士尼公司正在用 Rust 构建其  NCP GUI 框架,从迪士尼的这一职位招聘信息中可以得出这一结论。从该公司 2021 年发布的信息“介绍 Disney+ 应用程序开发工具包 (ADK)”来看, 使用 Rust 主要是构建代号为“m5”的 Native Client Platform v2 (NCPv2) 框架。他们选择了 Rust,以 WebAssembly (WASM) 为目标,以便在限制更新基于 C 的运行时的能力的任何固件更新周期之外简化 Web 部署和应用程序可更新性。该项目已经持续进行了快三年了,现在已经达到了从手持终端到电视,网页等全平台使用同一个渲染引擎来渲染它们的动画。

特斯拉

关键字:高性能机器人模拟器、固件验证

虽然马斯克在今年2月份于推特上面宣称他是 Rust 语言的粉丝,同时也承认特斯拉主要使用 Cpp 和 Python 。但从今年11月份发布的两个 Rust 职位来看,特斯拉也开始采用了 Rust 。其中一个是特斯拉机器人模拟引擎团队的招聘,正在寻找 Rust 开发人员来扩展用 Rust 编写的高性能机器人模拟引擎。另外一个是 Rust 固件验证工程师 ,但该职位对于 Rust 的要求只是“有任何 Rust 经验者优先,但不是必需的”。

Tweedegolf  :与太空公司宇宙飞船

关键字:PTP、卫星、宇宙飞船、太空

这次 Rust 真的要上天了。Gama 将发射太阳帆宇宙飞船,并且是公开将 Rust 送入太空的公司之一。提供软件服务的应该是这家公司:Tweedegolf ,该公司也是 Rust 基金会银牌会员。他们的开源仓库里有一个 Rust 实现的 PTP (精确时间协议) 库,这个PTP一般用在卫星的时间源,比NTP更精确。但这个是 PoC 实现,不知道这次发射的飞船上有没有用。从另外的项目 嵌入式开发板 pcf85063a (一般用于计时闹钟)rust 驱动来看,这次上天的 Rust 程序很可能和精确计时相关。

Gama 太阳帆的卫星于 2023 年 1 月 3 日由 SpaceX 猎鹰 9 号成功送入轨道。

荷兰 Lightyear 太阳能汽车公司采用 Rust

荷兰Lightyear公司将在今年晚些时候开始向客户交付全球首款可量产的太阳能汽车

在 Tweedegolf 公司的博客网站上透露,由 Lightyear 公司的软件架构师Jorrit 在 Tweedegolf 公司组织的高科技行业 Rust 线下聚会分享了 Lightyear 公司如何在Lightyear核心平台的开发中使用 Rust 。可能是隐私原因,并没有放出该分享的视频和ppt资料。

文件数据存储:Qumulo

关键字:混合云文件数据管理

Qumulo(混合云文件数据管理领域领导者) 和 西部数据 这两家公司是合作企业,通过部署基于西部数据UltrastarTM 大容量HDD和高性能SSD的Qumulo可扩展文件数据平台,IHME(健康指标与评估研究所)每天可处理高达2PB数据,推进公共流行病研究、统计和预测。Qumulo  赞助了 RustConf 2022 大会。

老牌数据库公司:PostgreSQL

关键字:数据库、postgresql

PostgreSQL 赞助了 RustConf 2022 大会,没有发现 PostgreSQL 公司内部有使用 Rust 的痕迹。但是在 GitHub 有一个致力于用 Rust 编写 PostgreSQL 扩展的项目 pgx,其中核心开发者 Ana 博客也有很多相关文章。

企业数据分析:Redjack

关键字:数据分析 Redjack 号称来自美国国家情报机构的技术,每年监控和保护超过 8% 的互联网公共 IP 空间和超过 100 万亿次商业通信,提高可操作的数据使组织能够提高分析的速度和准确性,从而实现大规模运营的安全性和弹性。Redjack 也赞助了 RustConf 2022 大会,以此推断 该公司也有采用 Rust 的可能性。

数据科学与人工智能

数据科学、AI

Rust 基金会银牌会员中也包括数据科学和人工智能领域的公司:

  • Watchful,以传统标签解决方案无法实现的速度和规模为 AI 标记数据。

汽车物联网

关键字:IoT

Wyliodrin 使用Rust , Tock OSAndroid保护设备并构建安全高效的系统。将 Rust 嵌入式实时操作系统 Tock OS 推入商业应用中。该公司也加入了Rust 基金会银牌会员。

消息推送服务商:OneSignal

关键字:消息推送

消息推送服务商 OneSignal 在 2017 年就开始使用 Rust 了,提供了 Rust Client 来支持推送通知、电子邮件、短信和应用内自助式客户参与解决方案。

自动化货运列车:Parallel Systems

关键字:货运自动化列车

自动化货运列车 Parallel Systems,相信货运的未来是铁路,所以研发了零排放的自动化电动货运跑在铁路上,Rust 语言是该公司技术栈的通用语言。该公司也赞助了 RustConf 2022 大会。

Rust 开发工具、平台与工具链支持

关键字:开发工具

基于 Rust 实现了一些好用的开发工具,比如:

  • tabnine,一款基于机器学习的代码自动完成开发工具。
  • Open Source Security ,该公司加入了Rust 基金会银牌会员,致力于为 Rust 生态推广做出贡献,目前主要是赞助 GCC Rust 的实现。截止到 2022 年 12 月,GCC Rust 前端将在 GCC 13 中合并!
  • Embecosm ,提供开源软件工具链和嵌入式操作系统服务。Embecosm 也是 GCC Rust 前端的赞助商。
  • grafbase,构建和部署 GraphQL 后端的服务平台。
  • Rust for Linux,Linux 6.1 内核版本合并了初始的 Rust 基础设施,为未来的内核驱动程序和其他内核代码启用 Rust 编程语言打好了基础。在 11 月 11 号,Rust for Linux 又提交了很多补丁代码到上游内核中。一旦所有这些 Rust 基础设施就位,我们将看到在更突出的现实世界驱动程序开始过渡到 Rust 代码之前需要多长时间,以获得新的硬件支持或在 Rust 中重写现有的 C 驱动程序代码。Rust 在 Linux 内核中的首批主要用户之一预计将是 Apple M1/M2 图形的 DRM 驱动程序。

安全监控

关键字:资产安全、事件监控

该领域目前在 Rust 基金会银牌会员中包括以下公司:

  • Spectralops,监控、分类和保护代码、资产和基础设施,以防止暴露的 API 密钥、令牌、凭证和高风险安全错误配置。
  • Sentry,应用程序监控平台。

软件咨询

关键字:软件咨询

目前也涌现出一些 Rust 咨询公司,下面是加入 Rust 基金会银牌会员的公司:

  • knoldus,
  • Ferrous Systems
  • mainmatter
  • Tag1

游戏 与 渲染引擎

关键字:游戏

Rust 在游戏领域目前还在发展中。游戏公司动视暴雪作为普通赞助商加入了 Rust 基金会,并且在 2021 年发布了一份由动视暴雪旗下工作室 Treyarch 撰写的 「用于游戏工具的 Rust 编程语言 」 调研报告。Treyarch 自 2018 年以来, 一直在逐步将 Rust 集成到我们的工具和管道中。

另外还有一家值得关注的游戏公司是 Embark,该公司赞助了 Rust 游戏引擎 Bevy 和 Fyrox,并且开源了 rust-gpu 致力于使 Rust 成为 GPU 着色器的一流语言和生态系统。

电商

关键字:电商

Rust 也被用于电商领域。

  • 美国最大的家具电商公司 Wayfair 旗下的开源项目 Tremor,已经进入 CNCF。去年 九月份还召开了一次小型的线上的 Tremor Conf 。从2018年开始, tremor 就是跑在了 wayfair生产环境中,每天处理10兆字节的数据,或每分钟100亿条消息,每秒1000万个指标。tremor 降低了成本,减少了复杂性,巩固和简化了操作环境,以激发SRE的乐趣,减少NOC的工作量,并降低运营成本。Rust 为 Wayfair 省掉数千个核心和TB级的内存的成本
  • cargurus ,英国的一家二手车电商网站,也成为了 Rust 基金会普通赞助商成员。

Web3  与 区块链

关键字:Web3 、同态加密、隐私计算、区块链、数字货币、零知识证明

Rust 在 Web3 和 区块链领域已经成为了主流语言。在这些领域耳熟能详的公司和项目很多:

  • Diem ,前身叫 Libra ,曾经是 Facebook 的稳定币项目,但是现在已经被 Silvergate Capital Corporation 收购。
  • 超新公链aptoslabs 和 sui,都是 Diem 团队成员离职创业的两个项目,它们的共同点是都使用 Rust 实现的 Move 语言作为智能合约语言。
  • parastate,波卡生态多链智能合约平台,是 Rust 基金会银牌会员。
  • Zama,为数据科学和AI构建开源同态加密解决方案,是 Rust 基金会银牌会员。
  • Keyrock  ,部署了专有且高度可扩展的数字资产做市技术,是 Rust 基金会银牌会员。
  • matter-labs ,扩展以太坊 零知识证明 。
  • 日本区块链技术孵化公司 TECHFUND ,也加入了 Rust 基金会银牌会员。
  • 其他。

本节小结

Rust 是一门通用的语言,并且多样化也是 Rust 语言的设计原则之一。本文试图通过罗列 Rust 在各个领域的成功应用案例,来帮助人们了解 Rust 适合落地的业务场景。然而,本文远远未能覆盖 Rust 应用的全部角落,还有我们看不到的地方,正在默默地采用 Rust 。本文也几乎没有罗列国内使用 Rust 的公司,但国内也有公司准备逐步采用 Rust ,只是进展比较慢。

P.S 你也可以在 GitHub 上查看别人维护的全球范围内使用 Rust 的公司列表。

Rust 就像一阵“春雨”,随风潜入夜,润物细无声。感谢阅读。

 

Rust 安全参考 | 2022 年 Rust 安全漏洞分类盘点

本文是对 Rust 安全数据库[1] 中记录的 Rust 及其生态库安全问题的梳理。希望可以对广大 Rust 开发者的代码安全性有所启发。

漏洞分类

Rust 安全数据库中记录的安全问题分为两大类:安全漏洞(Vulnerability)和非健全(Unsound)问题。

安全漏洞又具体分为以下几类:

  • 代码执行(Code Execution)
  • 内存损坏(Memory Corruption)
  • 权限提升(Privilege Escalation,在操作系统级别或应用程序/库内部)
  • 文件泄露/目录遍历(File Disclosure / Directory Traversal)
  • 网络安全(Web Security,例如 XSS、CSRF)
  • 格式注入(Format Injection),例如 shell 转义、SQL 注入(以及 XSS)
  • 加密失败(Cryptography Failure,例如机密性破坏、完整性破坏、密钥泄漏)
  • 隐蔽通道(例如 Spectre、Meltdown)
  • 代码中的恐慌(panic)标榜为“panic-free”(特别是如果对网络 DoS 攻击有用)
  • 内存暴露(memory-exposure)
  • 线程安全(thread-safety)

此外,RustSec 还会对生态库的健全性[2] 进行跟踪,而不管它们是否是漏洞。因为 当使用来自安全代码的 crate 可能导致未定义行为[3]时,往往伴随着健全性问题。

健全性(Soundness)是一个类型系统概念(实际上源于逻辑学研究),意味着类型系统在某种意义上是“正确的”,即类型良好的程序实际上具有所需的属性。对于 Rust,这意味着类型良好的程序不会导致未定义的行为[4]。然而,这个承诺只适用于安全代码;对于unsafe代码,由程序员来维护这份契约。

对于安全漏洞或非健全问题发生的原因或机制,RustSec 则使用关键字来进行标识。但是 RustSec 的关键字太多了,所以我对关键字也进一步做了一个分类。

分类 漏洞机制 备注 类型
memory safety[5] alias (多个可变借用) 2022 年还未见有该漏洞 漏洞
  double free 2022 年还未见有该漏洞  
use-after-free[6] incorrect-lifetime 2022 年 一例 RUSTSEC-2022-0028: Vulnerability in neon[7] 漏洞
  wasm 2022 年 一例 RUSTSEC-2022-0016: Vulnerability in wasmtime[8] 漏洞
  segfault 2022 年 一例 RUSTSEC-2022-0002: Vulnerability in dashmap[9] 漏洞
memory-layout cast 2022 年 一例  RUSTSEC-2022-0052: Unsoundness in os_socketaddr[10] Unsound
  cell 2022 年 一例 RUSTSEC-2020-0164: Unsoundness in cell-project[11] Unsound
ddos[12] oom 2022 年两例  RUSTSEC-2022-0055: Vulnerability in axum-core[13]  和 RUSTSEC-2022-0035: Vulnerability in websocket[14] 漏洞
  untrust data 2022 年一例  RUSTSEC-2021-0143: Vulnerability in kamadak-exif[15] 漏洞 CVSS分 6.5 MEDIUM
directory-traversal Windows 2022 年 两例:RUSTSEC-2022-0069: Vulnerability in hyper-staticfile[16]  和  RUSTSEC-2022-0043: Vulnerability in tower-http[17] 漏洞
html xss 2022 年一例 RUSTSEC-2022-0003: Vulnerability in ammonia[18] 漏洞
integer-overflow out-of-bounds 2022 年一例 RUSTSEC-2022-0051: Vulnerability in lz4-sys[19] 漏洞 CVSS Score 9.8 CRITICAL
out-of-bounds-read out-of-bounds-read 2022 年一例 RUSTSEC-2022-0046: Vulnerability in rocksdb[20] 漏洞
side-channel timing-attack 2022 年一例 RUSTSEC-2022-0018: Vulnerability in totp-rs[21] 漏洞 CVSS Score 4.2 MEDIUM
stack-overflow stack-overflow 2022 年一例 RUSTSEC-2022-0004: Vulnerability in rustc-serialize[22] 漏洞
subtype variance/cell 2022 年一例  RUSTSEC-2020-0164: Unsoundness in cell-project[23] Unsound
type-confusion type-confusion 2022 年一例 RUSTSEC-2020-0165: Unsoundness in mozjpeg[24] Unsound
typosquatting typosquatting (恶意伪造同名 crate) 2022 年一例 RUSTSEC-2022-0042: Vulnerability in rustdecimal[25] 漏洞
unaligned-read windows 20222 年一例  RUSTSEC-2021-0145: Unsoundness in atty[26] Unsound
uninitialized-memory uninitialized-memory 20222 年两例   RUSTSEC-2022-0067: Unsoundness in lzf[27]RUSTSEC-2018-0022: Vulnerability in temporary[28] Unsound 和 漏洞
unsound covariant 2022 年一例  RUSTSEC-2022-0007: Unsoundness in qcell[29] Unsound

注:CVSS 即通用漏洞评分系统,参见文后安全术语介绍部分。

CVSS 危害级别划分

  1. 分值范围 [0.1 - 3.9]  –>  低危害性
  2. 分值范围  [4.0 - 6.9] –>  中危害性
  3. 分值范围 [7 - 10]  -> 高危害性

2022 年漏洞分类排行 Top 3

按出现漏洞次数由多到少的漏洞分类排行:

  • 内存损坏[30] ,2022 年一共出现 19 个此类安全问题。包括一个严重危害等级的漏洞和一个高危害等级的漏洞。导致内存损坏的 Bug  包括:整数溢出、越界访问、数据竞争(无锁并发内存顺序指定错误)、Unsafe Rust 中未做边界验证、Use-After-Free 等。
  • 拒绝服务[31],2022 年一共出现 14个此类安全问题。包括五个高危害等级的漏洞。导致内存损坏的 Bug  包括:缓冲区溢出、未验证请求长度、深度嵌套、栈溢出、资源泄露、无限循环等。
  • 内存暴露[32]  ,2022 年一共出现 9 个此类安全问题。导致该问题的 Bug 包括:越界读取(验证不充分)、Use-After-Free 、使用未初始化内存、悬垂指针等。

2022 年安全漏洞摘要介绍

内存相关漏洞

RUSTSEC-2022-0002:dashmap 中的引用出现 UAF

由Ref(和类似类型)的一些方法返回的引用可能会超过Ref并逃脱锁。这将导致未定义的行为,并可能导致一个段错误。

  • https://rustsec.org/advisories/RUSTSEC-2022-0002.html[33]
  • https://github.com/xacrimon/dashmap/issues/167[34]

RUSTSEC-2022-0008:Windows-rs 中 Delegate 函数缺乏 Send 限定

  • https://rustsec.org/advisories/RUSTSEC-2022-0008.html[35]
  • https://github.com/microsoft/windows-rs/issues/1409[36]

RUSTSEC-2022-0012: Arrow2 在 Safe 代码中出现双重释放(double-free)

Ffi_ArrowArray 结构体错误实现 #derive(Clone) ,因为它是一个 FFi 绑定,实现 Clone 会导致出现两份指针,从而导致双重释放。

  • https://github.com/jorgecarleitao/arrow2/issues/880[37]
  • https://rustsec.org/advisories/RUSTSEC-2022-0012.html[38]

RUSTSEC-2022-0003: ammonia 中存在格式化注入漏洞

clean_text中错误映射 HTML 的 Form Feed,导致注入漏洞。

let html = format!("", clean_text(user_supplied_string));
  • https://github.com/rust-ammonia/ammonia/pull/147[39]

RUSTSEC-2022-0006: thread_local crate 中的 RawIter::next 存在数据竞争

主要是因为内存顺序指定错误而引起的,解决起来也比较简单,修改为正确的内存顺序即可。

  • https://rustsec.org/advisories/RUSTSEC-2022-0006.html[40]
  • https://github.com/Amanieu/thread_local-rs/issues/33[41]

RUSTSEC-2022-0016:wasmtimeexternref 在启用 epoch 中断时会导致 UAF

epoch 中断会导致 wasmtime 在执行 GC 时错误回收还在使用的内存,从而导致 UAF。

  • https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-gwc9-348x-qwv2[42]
  • https://rustsec.org/advisories/RUSTSEC-2022-0016.html[43]

DoS 漏洞

RUSTSEC-2022-0004:rustc_serialize 解析深度嵌套的 JSON 时栈溢出

该漏洞会导致 DoS(denial-of-service)风险。

// 触发漏洞示例代码
fn main() {
    let _ = rustc_serialize::from_str(&"[0,[".repeat(10000));
}

推荐使用 serde 作为 rustc_serialize 的替代品。

https://rustsec.org/advisories/RUSTSEC-2022-0004.html[44]

Unsound

RUSTSEC-2022-0007: qcell crate 中 TCellTLCell 的内存能被恶意代码访问

因为生命周期参数型变未使用正确而引起的问题,导致恶意代码可以对同一片内存获取两个可变引用。解决方法是把类型参数的协变(Covariant)改为不变(Invariant)。

struct Invariant(fn(T) -> T);

pub struct TCellOwner'static> {
    // Allow Send and Sync, and Q is invariant
    typ: PhantomData>,
}

pub struct TCellSized> {
    // use Invariant for invariant parameter, not influencing
    // other auto-traits, e.g. UnwindSafe (unlike other solutions like `*mut Q` or `Cell`)
    owner: PhantomData>,
    // It's fine to Send a TCell to a different thread if the containted
    // type is Send, because you can only send something if nothing
    // borrows it, so nothing can be accessing its contents.
    //
    // `UnsafeCell` disables `Sync` and already gives the right `Send` implementation.
    // `Sync` is re-enabled below under certain conditions.
    value: UnsafeCell,
}
  • https://rustsec.org/advisories/RUSTSEC-2022-0007.html[45]
  • https://github.com/uazu/qcell/issues/20[46]

RUSTSEC-2022-0010:Enum错误实现 trait时 enum_map 宏可能会导致 UB

enum_map!受影响版本在使用宏时未正确检查枚举的长度,信任用户提供的长度。

Enum trait 中的 LENGTHEnumArray trait 中的数组长度不匹配 时,可能会导致枚举映射初始化为未初始化的类型,进而允许攻击者执行任意代码。

这个问题只能在手动实现 Enum trait 时发生,它永远不会发生在使用#[derive(Enum)].

触发此漏洞的示例代码如下所示:

enum E {
    A,
    B,
    C,
}

impl Enum for E {
    // LENGTH 长度不等于 EnumArray 长度
    const LENGTH: usize = 2;

    fn from_usize(value: usize) -> E {
        match value {
            0 => E::A,
            1 => E::B,
            2 => E::C,
            _ => unimplemented!(),
        }
    }

    fn into_usize(self) -> usize {
        self as usize
    }
}

impl EnumArray for E {
    type Array = [V; 3];
}

let _map: EnumMapString> = enum_map! { _ => "Hello, world!".into() };
  • https://rustsec.org/advisories/RUSTSEC-2022-0010.html[47]
  • https://gitlab.com/KonradBorowski/enum-map/-/blob/master/CHANGELOG.md#version-202[48]

Rust 官方安全通告

Cargo 安全公告

在 2022 年 9月份,Rust 安全响应工作组被告知 Cargo 没有阻止提取从备用注册表下载的一些格式错误的包。 当 Cargo 下载包时,能够将包上传到备用注册表 的 攻击者可能会填满文件系统或损坏任意文件。这些问题已分配给 CVE-2022-36113 和 CVE-2022-36114。这些漏洞的严重性对于备用注册表的用户来说是“低”的。依赖crates.io[49]的用户不受影响。

  • 任意文件损坏 (CVE-2022-36113)。Cargo 允许包包含一个 .cargo-ok  符号链接,Cargo 将提取该链接。然后,当 Cargo 尝试将 “ok”写入“.cargo-ok”时,它实际上会将符号链接指向的文件的前两个字节替换为“ok”。这将允许攻击者使用 Cargo 提取包来破坏机器上的一个文件。
  • 磁盘空间耗尽 (CVE-2022-36114)。Cargo 没有限制从压缩档案中提取的数据量。攻击者可以将一个特制的包 上传到备用注册表,该 包提取的数据远远超过其大小(也称为 “zip 炸弹”),使用 Cargo 耗尽计算机上的磁盘空间下载包。

这两个漏洞都存在于 Cargo 的所有版本中。Rust 1.64  已包括对它们的修复。

Regex 安全公告

在 2022 年 3月份,Rust 安全响应工作组被告知 regex 包没有正确限制它解析的正则表达式 (regex) 的复杂性。攻击者可以利用此安全问题执行拒绝服务,方法是
将特制的正则表达式发送到接受不受信任的正则表达式的服务。使用受信任的正则表达式解析不受信任的输入时,不存在已知漏洞 。 此问题已分配为 CVE-2022-24713。当 regex 包用于解析不受信任的正则表达式时,此漏洞的严重性 为“高”。regex crate 的其他用途 不受此漏洞影响。

建议使用  regex 1.5.5 版本及之上的版本。

安全术语介绍

CVSS 通用漏洞评分系统[50] (Common Vulnerability Scoring System, CVSS)。旨在评估安全漏洞的严重性,是全球各组织使用的公开标准。该标准由FIRST制定,并由其组织团队SIG(The CVSS Special Interest Group)改进和推广。

通过漏洞难易程度以及对机密性、完整性、可用性的影响综合评估后,生成一个0到10分之间的评分值,此分值即是CVSS得分。CVSS 主要用于评估漏洞的严重性,而不是对风险的评估。风险评分是需要每个企业根据企业特性的风险要素,进行识别后再进行风险判别。

CVSS 通过三个方面进行评估:

  • 基础得分(Base Score):根据漏洞的固有特征反映漏洞的严重程度,不受时间因素影响,并假定在不同部署环境中产生合理的最坏情况的影响;
  • 时间得分(Temporal Score):评价漏洞被利用的时间窗的风险大小,比如官方发布了补丁则会降低评估分数;
  • 环境得分(Environment Score):需要在特定环境下评估。通常由最终用户根据自己的使用环境给出。使用业界通用的CVSS标准需遵循以下原则:
  1. 一般使用CVSS基础得分进行漏洞严重等级评估;
  2. 评估时必须基于攻击场景,且攻击后能对系统造成了机密性、完整性、可用性的影响;
  3. 有多个攻击场景时,最终得分选择最高得分场景;
  4. 被嵌入调用的库存在漏洞,要根据该库在产品中的使用方式,确定漏洞的攻击场景后进行评估;
  5. 不考虑攻击目标的环境缓解措施(如设置防火墙),以体现漏洞真实严重程度;
  6. 不考虑特定配置,即如果攻击成功需要特定的配置则在该配置存在的情况下进行评分;
  7. 安全缺陷不能被触发的场景或不影响CIA(机密性/完整性/可用性),CVSS评分为0分。

审核编辑 :李倩


 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分