谷歌支持在低级固件中实现 Rust,促进遗留代码的翻译,作为对抗威胁内存访问安全的错误的一种手段。
在一篇新的博客文章中,Android 团队声称,在现有固件中从 C 或 C++ 切换到 Rust将提供比没有安全标准的操作系统更低级别的内存安全保证。
博客文章网址:
https://security.googleblog.com/2024/09/deploying-rust-in-existing-firmware.html
据专家介绍,这种情况下生产力的损失可以忽略不计,Rust 代码的大小也相当,主要是逐步替换基本代码,从新的、更关键的代码开始。
这个过程不需要太多的努力,随着时间的推移,内存访问漏洞的数量将显着减少。
使用Shim逻辑逐步重写库代码
为了简化过渡,您可以创建一个薄 Rust 层(Shim 预加载器),它将复制 C API 并导出到您现有的代码库。
Shim 充当 Rust 库 API 的包装器,连接现有的 C API 和 Rust API。
这是通常所做的,重写库或用 Rust 替代品替换它们。
据谷歌称,直到最近,内存安全漏洞仍然是Chrome 和 Android漏洞的主要来源。
由于采用了能够使产品摆脱这一瘟疫的编程语言,2019 年至 2022 年间,移动操作系统中此类错误的年度数量从 223 个减少到 85 个。
去年,微软开始将 Windows 内核迁移到 Rust。
2023 年 5 月发布的操作系统版本 11 包含该语言的驱动程序。
与此同时,这家科技巨头计划同样提高 Pluton 处理器的安全性,但该处理器尚未得到广泛使用。
Rust 是内存错误的关键
Rust编程语言旨在解决与内存安全和并发数据管理相关的问题,解决 C 和 C++ 等语言中最常见的一些漏洞。
以下是 Rust 修复的主要错误类型:
1.内存管理Bug(内存安全问题)
-
空指针取消引用:在C和C++等语言中,空指针导致程序崩溃或意外行为是很常见的。
Rust 通过使用Option类型来防止这个问题,它提供了一种安全的方法来处理可能为 null 的值。
-
Use-After-Free:当程序尝试访问已经释放的内存区域时,就会出现此错误。在 Rust 中,由于所有权系统和借用检查器的概念,内存在释放后无法访问。
-
双重释放:在 C 或 C++ 中,两次释放同一内存区域可能会导致不稳定或漏洞。
Rust 通过其所有权管理自动、安全地管理内存释放,防止多次释放同一资源的风险。
2.竞争条件和竞争问题(Concurrency Bugs)
-
数据竞争:当两个线程同时访问同一内存,其中至少一个线程执行写入操作,而没有必要的同步时,就会发生数据竞争。
Rust 使用Mutex和RwLock等类型,借用检查器确保共享资源可以安全访问,从而防止编译时数据竞争。
-
线程安全:Rust 在整个类型系统中强制执行严格的并发和同步规则,确保线程之间共享的资源可以安全使用。
3.缓冲区溢出
-
这是C 和 C++ 等语言中最常见的安全错误之一,访问超出定义限制的内存缓冲区可能会导致意外行为或安全漏洞。
Rust 通过严格执行数组和切片边界来防止此错误,除非明确允许,否则无法进行越界访问。
4.悬空指针
-
悬空指针是指向不再有效的内存位置的指针。
在 Rust 中,所有权系统可以防止创建无效指针或对空闲内存的引用,从而消除悬空指针。
5.内存泄漏
-
虽然 Rust 不能保证防止每次内存泄漏(因为可能存在未释放的循环引用内存),但与 C/C++ 等语言相比,遇到内存泄漏要困难得多。
基于所有权的内存管理和借用可确保资源在不再使用时自动释放。
6.类型安全问题
-
Rust 是一种强类型语言,许多在其他语言中可能在运行时失败的操作在编译时被阻止。
这可以防止数据类型错误,例如为不兼容类型的变量赋值或在不同类型之间执行无效操作。
7.不受控制的递归的堆栈溢出
-
Rust 包括使用尾部调用优化来降低递归函数中堆栈溢出的风险。
虽然它不能完全防止问题,但它的类型系统和资源管理可以更轻松地避免此类错误。
原文始发于微信公众号(网络研究观):Rust 针对签名内存错误重写Shim逻辑中的库是关键
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论