QCon 2022·上海站 | 学习笔记2: Rust 程序可靠性保证相关技术探索与实践

简介: QCon 2022·上海站 | 学习笔记2: Rust 程序可靠性保证相关技术探索与实践

Rust 程序可靠性保证相关技术探索与实践

QCon 2022·上海站

软件正在重新定义世界

Software Is Redefining The World

https://qcon.infoq.cn/2022/shanghai/schedule

姜剑峰 蚂蚁集团 安全计算 2022.11.25 上海

自我介绍

  • 本硕毕业于复旦大学
  • 在蚂蚁集团安全计算部门从事于机密计算系统软件的开发
  • 2.5 年 Rust 开发经验,关于 Rust 模糊测试的工作曾获得 ACM 杰出论文奖

为什么用 Rust 开发系统软件

Rust for Linux

  • Rust for Linux 被正式合入了 Linux 6.11
  • Linux 内核第一次引入对新语言的支持
  • Linux:有利于减少内核中内存安全相关的漏洞
  • Rust:更大的舞台上检验语言本身的能力

系统软件的特点

  • 什么是系统软件1?操作系统,数据库,容器,虚拟机.......
  • 系统软件是硬件与用户应用程序之间的桥梁
  • 对性能敏感
  • 与底层硬件频繁的交互
  • 开发和调试一般更加困难
  • 内部逻辑复杂

Application <-> System software <-> Hardware


Rust语言的特点

  • 安全:内存安全和线程安全
  • 效率:No GC, 理论上接近 C/C++ 的执行效率和内存使用效率
  • 对底层资源的掌控能力:裸指针,数据布局,内联汇编,SIMD
  • 现代化的语言设计:错误处理,空值,函数式编程,泛型与trait,统一的包管理工具
  • 友好的社区氛围

Rust 开发系统软件是未来

  • Rust 语言的特点适合进行系统软件的开发 系统软件有使用惯性
  • 传统领域 PK:相比较传统软件展现出足够的优势(性能,安全, 维护性等)
  • 进军新兴领域:机密计算,Web3.0......

Rust for 蚂蚁集团安全计算部门

  • 应用于机密计算的系统软件的开发,构建基于 TEE 的可信技术栈
  • 机密计算的核心是信任:机密计算硬件+系统软件构成 TCB
  • Occlum (ASPLOS21): 兼容 Posix 接口的机密计算操作系统 Hyperenclave (ATC22): 基于虚拟化技术的通用 TEE 平台 Sworndisk (Ongoing): 高效安全的虚拟硬盘

Rust 其他的应用领域

  • 命令行实用程序: minigrep, nushell
  • 数据处理: DataFusion
  • 服务端框架:actix-web, rocket
  • Web框架:yew, iced

Rust 程序可靠性问题

Rust 提供的安全是什么?

  • 内存安全:访问不安全的内存区域: Use after free, double free, use before initialization, buffer overflow
  • 线程安全:对数据可能存在的竞争访问
  • 其他检查:整数溢出;字符串合法性检查
    Unsafe 的魔法
  • 安全都是有代价的,保证安全会限制灵活性,引入额外的开销
  • Unsafe 从功能上来说可以做一些比较危险的操作
  • Unsafe 是一种安全约定,约定了由谁来保证安全性质可以满足。Unsafe 分为两种,对外暴露的和不对外暴露的
  1. Unsafe trait 或者是 Unsafe fn: impl 这个 trait 或者调用这个方法
    是 unsafe 的,需要调用者来保证安全
  2. Unsafe block 或者 Unsafe impl: 实现者保证内部的代码是安全的 ( You can trust me that I am right )

Rust 真的安全吗?从 CVE 的角度

  • 学术界研究了 Rust 现有的所有内存安全相关的 CVE
  1. Rust 中仍然存在一些传统的内存安全问题,诸如UAF (82), DF(13), UNINIT(12) 等等
  2. 绝大多数 Rust 的安全性问题都是库 API 的 soundness 问题。存在安全隐患, 但很少产生实际的后果。
  • Rust 总体上是兑现了安全承诺的
  1. 即使很多写法是 unsafe 的,最终也没有产生安全问题
  2. 权责分明:到底是 API 实现错误还是 API 误用?到底是谁来负责修复

Rust 真的可靠吗?从系统软件的角度

“If the Rust compiler ends up doing hidden allocations, and they then cause panics, then one of the main points of Rustification is entirely broken.” —— Linus Torvalds

“There is clearly a need to identify dynamic checks that can never fail and dynamic

checks that could potentially fail. ” —— Alastair Reid


Rust 程序的可靠性问题定义

在任何合法使用 API 的情况下

  • 内存安全和线程安全不应该被 unsafe 代码所破坏
  • 所有动态检查都不应该被违背(可以被安全的移除),除非 panic 是一种允许的行为

现有的机制是否足够呢?

  • Unsafe 代码没有破坏内存安全性
  • no memory leakage
  • panic free

现有的研究工作

  • 模糊测试(afl.rs, libfuzzer):分支覆盖率;用例程序的构造
  • 符号执行(klee, angr):路径爆炸;求解困难
  • 静态分析(MirChecker, Rudra, SafeDrop):分析特定问题;假阳性
  • 形式化验证(RustBelt):无法方便的验证第三方库
  • 其他工具(Miri等)........

基于程序合成的 Rust 模糊测试

模糊测试简介

  • 初始化种子集合
  • 选择一个种子并且进行变异
  • 使用变异后的种子执行程序
  • 如果这个种子比较有趣的话
  • Yes 把这个种子加入种子集合
  • No

模糊测试系统软件的局限性

系统软件一般都是 Stateful 的

  • 要达到某个特定的状态需要一个比较长的调用序列
  • 同一个序列执行多次会有不同的结果
  • 某一特定状态是否可被复现是不可预测的

系统软件内部可能有一些随机的操作

很多都是 soundness 问题,并不会真的触发异常行为

总结与展望

个人学习 Rust 的一些体会

  • Rust 并没有想象的那么难学,但前期学习曲线比较陡峭
  • Rust 可以减少开发者的心智负担,很多情况下程序跑通约等于程序正确 Rust 的语法噪音是比较大的,这也是可以进一步优化的点
    总结与展望
  1. 保证可靠性主要是库开发者的工作,库开发者要保证 API 的 soundness。Rust 中的不安全很多时候都是违反了 soundness 的要求,并不意味着真的出现了实际的安全问题。
  2. 由于 unsafe 的传播性,供应链安全对 Rust 很重要
  3. Rust 编译器的检查可以防止程序中大部分的安全问题
  4. 对于可靠性的保证仍然需要各种程序分析以及软件测试的手段
目录
相关文章
|
Rust 安全 Linux
Rust-01 Hello Rust 10分钟上手编写第一个Rust程序 背景介绍 发展历史 环境配置 升级打怪的必经之路
Rust-01 Hello Rust 10分钟上手编写第一个Rust程序 背景介绍 发展历史 环境配置 升级打怪的必经之路
188 0
Rust-01 Hello Rust 10分钟上手编写第一个Rust程序 背景介绍 发展历史 环境配置 升级打怪的必经之路
|
数据采集 Rust 安全
Rust在网络爬虫中的应用与实践:探索内存安全与并发处理的奥秘
【8月更文挑战第31天】网络爬虫是自动化程序,用于从互联网抓取数据。随着互联网的发展,构建高效、安全的爬虫成为热点。Rust语言凭借内存安全和高性能特点,在此领域展现出巨大潜力。本文探讨Rust如何通过所有权、借用及生命周期机制保障内存安全;利用`async/await`模型和`tokio`运行时处理并发请求;借助WebAssembly技术处理动态内容;并使用`reqwest`和`js-sys`库解析CSS和JavaScript,确保代码的安全性和可维护性。未来,Rust将在网络爬虫领域扮演更重要角色。
252 1
|
Rust 并行计算 安全
揭秘Rust并发奇技!线程与消息传递背后的秘密,让程序性能飙升的终极奥义!
【8月更文挑战第31天】Rust 以其安全性和高性能著称,其并发模型在现代软件开发中至关重要。通过 `std::thread` 模块,Rust 支持高效的线程管理和数据共享,同时确保内存和线程安全。本文探讨 Rust 的线程与消息传递机制,并通过示例代码展示其应用。例如,使用 `Mutex` 实现线程同步,通过通道(channel)实现线程间安全通信。Rust 的并发模型结合了线程和消息传递的优势,确保了高效且安全的并行执行,适用于高性能和高并发场景。
401 0
|
Rust 安全 编译器
Rust中的生命周期管理:深入理解与实践
【7月更文挑战第10天】Rust中的生命周期是确保内存安全和避免数据竞争的关键机制。通过深入理解生命周期的概念、使用场景及省略规则,我们可以编写出更加安全、高效的Rust代码。虽然生命周期管理在初学时可能显得有些复杂,但一旦掌握,它将成为我们编写Rust代码时不可或缺的工具。希望本文能够帮助你更好地理解Rust中的生命周期管理,并在实际开发中灵活运用。
|
Rust 安全 开发者
惊爆!Xamarin 携手机器学习,开启智能应用新纪元,个性化体验与跨平台优势完美融合大揭秘!
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的巨大潜力。
162 0
|
开发框架 Android开发 iOS开发
跨平台开发的双重奏:Xamarin在不同规模项目中的实战表现与成功故事解析
【8月更文挑战第31天】在移动应用开发领域,选择合适的开发框架至关重要。Xamarin作为一款基于.NET的跨平台解决方案,凭借其独特的代码共享和快速迭代能力,赢得了广泛青睐。本文通过两个案例对比展示Xamarin的优势:一是初创公司利用Xamarin.Forms快速开发出适用于Android和iOS的应用;二是大型企业借助Xamarin实现高性能的原生应用体验及稳定的后端支持。无论是资源有限的小型企业还是需求复杂的大公司,Xamarin均能提供高效灵活的解决方案,彰显其在跨平台开发领域的强大实力。
211 0
|
Rust 程序员 开发者
使用 Rust 开发一款类似于 GitBook 的程序
**Rust新手开发者分享开源项目 Typikon**:模仿MDBook,致力于简单Markdown到在线书的渲染。[GitHub](https://github.com/auula/typikon)上可找到源码,欢迎初学者一同学习与贡献。体验轻松构建静态网站,探索Rust之旅。🌟 加入讨论,共建更易用的GitBook替代品。在线文档见[https://typikonbook.github.io](https://typikonbook.github.io)。
192 1
|
Rust 算法 IDE
我们的第一个Rust程序
Rust语言学习者,通常都会有其它语言的背景,很少有人从零入门Rust。 Rust语言应该有一门适合初学者的教程,来帮助大家使用Rust作为入门语言,我非常希望有人能使用原汁原味Rust的思维在计算机世界攻城略地。
159 2
我们的第一个Rust程序
|
Rust 安全 测试技术
Rust并发编程实践:快速入门系统级编程
Rust是一门现代的系统编程语言,它的设计目标是提供安全性、并发性和高性能。Rust的出现是为了解决其他编程语言在这些方面存在的一些问题和挑战。
|
Rust 安全 开发者
Rust语言的Hello, World! 程序解析
Rust语言的Hello, World! 程序解析
159 0