当前位置: 首页 > 科技观察

Android系统支持Rust语言防止内存安全漏洞

时间:2023-03-12 07:09:31 科技观察

4月6日,谷歌宣布开源版Android操作系统将支持Rust编程语言防止内存安全相关漏洞。内存安全漏洞是Android系统稳定性问题的罪魁祸首,约70%的Android高危安全漏洞都与内存安全相关。C和C++中的内存安全漏洞是最难解决的问题。Java和Kotlin语言是Android应用开发的最佳选择,这些语言易于使用、安全且轻量级。Android运行时(ART)代表开发人员管理内存。Android操作系统广泛使用Java来保护Android平台免受内存泄漏。但是Java和Kotlin语言对于底层操作系统的开发并不理想。操作系统底层需要C、C++、Rust等编程语言。这些语言更具可控性和可预测性,可以提供对底层系统资源和硬件的访问控制,并提供同样可预测的性能特征。需要的资源很少。对于C和C++,开发人员负责管理内存的整个生命周期,因此很容易出错,尤其是在复杂和多线程的代码库中。Rust语言通过使用编译时检查和运行时检查来确保内存安全。编译时检查用于检查对象的生命周期和所有权,运行时检查用于确保内存访问有效。而且性能不比C和C++差。C和C++语言不提供安全保证,需要隔离。所有Android进程都是沙箱化的,遵循2法则,即给定3个选项,开发者会智能地选择2个。对于Android,这意味着如果代码是用C或C++编写的,在分析不可靠的输入时会有非常严格的非特权沙箱。由于遵循Ruleof2规则会带来很多限制,因此会降低安全漏洞的严重性和危险性。但是沙盒并不是轻量级的,由于IPC等内存使用带来了额外的消耗和延迟。沙盒并不能完全消除代码中的漏洞,攻击者可以连锁其他漏洞发起攻击。像Rust这样的内存安全语言可以帮助解决这些问题:它可以降低代码中的漏洞密度并提高当前沙箱的有效性;它可以通过引入安全和轻量级的新功能来减少对沙箱的需求。Rust结合了许多其他语言的特性,可以提高代码的正确性:内存安全:通过编译时检查和运行时检查确保内存安全;数据并发:防止数据竞争条件,用户可以使用Rust编写高效、线程安全的代码;更具表现力的系统:有助于防止逻辑编程漏洞,如新型封装、枚举变体等;引用和变量默认是不可变的:帮助开发者遵循最小权限安全原则。尽管C++有const,但它经常很少使用并且不一致。相比之下,Rust编译器·可以通过为永不突变的可变值提供警告来避免错误注释。标准库中更好的安全处理:将可能失败的调用封装在结果中,从编译器中抛出错误,要求用户检查未返回所需值的函数。这可以防止像RageAgainsttheCage这样的攻击。初始化:所有变量在使用前都需要初始化。未初始化内存漏洞是Android3~5%安全漏洞的根本原因。Rust要求所有变量在使用前都被初始化为其类型的合法成员,避免初始化为不安全的值。更安全的整数处理:Rust默认启用溢出处理以避免与溢出相关的漏洞。另外,所有整数类型的转换都是显式转换,开发者在赋值变量或进行其他类型的算术运算时,不能在函数调用中进行转换。本文翻译自:https://security.googleblog.com/2021/04/rust-in-android-platform.html如有转载请注明出处。