Rust for Linux:世界上最大的软件项目的内存安全问题有办法了!

内存安全漏洞极其普遍。最近的一项研究发现,iOS和macOS中60-70%的漏洞是内存安全漏洞。据微软估计,在过去十年中,他们产品中70%的漏洞都是内存安全问题。而谷歌估计,90%的安卓系统漏洞也都是内存安全问题。作为世界上大多数服务器以及数十亿的设备都在使用的世界上最大的软件项目——Linux内核,其内存安全问题又该如何得到保证?
在这里插入图片描述
图源:微软官网

一些编程语言有能够确保内存安全的属性,它可以防止程序员引入某些错误而带来安全问题。具有内存安全属性的语言包括Rust、Go、C#、Java、Swift、Python和JavaScript,而不具备内存安全属性的语言包括C、C++和汇编语言。

在这里插入图片描述
如何破解Linux内核内存安全问题

为了解决Linux内核内存安全问题安全隐患,以下是两个针对其内存安全的项目:

    Rust for Linux项目:该项目的目的是将一种新的内存安全的编程语言引入Linux内核。Rust有一个关键的特性,使它非常值得考虑作为内核的第二种语言:它保证没有未定义的行为发生(只要不安全的代码是健全的),特别是在内存管理方面。这包括没有使用后释放问题,没有双重释放,没有数据竞赛,等等。
    Prossimo项目:这是互联网安全研究小组(ISRG)的一个项目。它的目标是通过使用具有内存安全属性的语言来解决C和C++代码中的内存安全问题,从而改善互联网敏感的软件基础设施,而这种基础设施的代表就是Linux内核。

在这里插入图片描述
Rust for Linux项目的诞生

用Rust编写Linux内核代码的愿望已经存在了很长时间,多年来不同的人用Rust创建了外部模块。然而,Rust for Linux项目的创建是为了在Linux内核本身提供Rust支持。Miguel Ojeda在2019年夏天就创建了这个项目组织,但它直到第二年夏天才真正有进展。

2020年7月,Nick Desaulniers向Linux内核邮件列表(LKML)发送了一封电子邮件,关于为2020年的Linux Plumbers大会(LPC)组织一次“用Rust创建内部模块”的会议。这封邮件发出后,Miguel Ojeda和其他几人在2020年8月发表了“用Rust创建内部模块的障碍”的相关演讲,引发了不少讨论和反馈。

为此,几天后,Miguel Ojeda提交了Rust for Linux项目的第一个拉动请求,增加了最初的Rust支持,包括Kbuild集成、最初的内置模块支持和内核crate。

在接下来的几个月里,其他人也加入了这项工作,比如来自谷歌的Wedson Almeida Filho,他是项目的维护者和贡献者。不久之后,互联网安全研究小组联系了Miguel Ojeda,希望他在谷歌的资助下,为Rust for Linux项目提供一年的全职工作支持。

在这里插入图片描述
今年的进展

自从向Linux内核邮件列表提交意见征询以来,该团队已经取得了很大的进展。在基础设施方面,一些相关变化包括:

    通过集成alloc标准库的子集删除了混乱分配
    已移至Rust语言的2021版
    转移到Rust编译器的稳定版本(仍在使用不稳定的功能),并开始跟踪最新版本
    添加了arm(32位)和riscv基本架构支持
    测试支持,包括在内核中运行文档测试作为KUnit测试
    添加了对用Rust编写的hostprogs(在构建过程中使用的用户空间程序)的支持。
    根据内核配置即时生成目标规范文件。
    扩展了文档,包括一个新的示例存储库,展示了基于树内Rust支持的树外Rust模块。

在抽象结构和驱动程序方面,一些重要的变化包括:

    PrimeCell PL061 GPIO示例驱动程序

    平台和AMBA驱动程序、红黑树、文件描述符、高效位迭代器、任务、文件、IO矢量、电源管理回调、IO内存、IRQ芯片、凭证、VMA、硬件随机数生成器、网络等功能

    同步功能,如RW信号量、可撤销互斥锁、原始自旋锁、无等待锁、序列锁…

    使用简化的基于内核的Ref替换了分配箱中的Arc和Rc

    更好的死机诊断和简化的指针包装器

    Rust异步支持的开始

    相关项目也取得了很大进展:

    Rust稳定了我们使用的一些不稳定功能。

    对Rust编译器、标准库和工具的改进,例如使rustc_parse_format在稳定平台上编译,或者添加no_global_oom_handling和no_fp_fmt_parse门

    binutils/gdb/libiberty获得了对Rust v0去扭曲的支持

    pahole正在获得排除Rust编译单元的支持

    英特尔的0Day/LKP内核测试机器人开始测试启用了Rust支持的构建版本

    KernelCI也期待着在他们的运行中启用Rust

    Linaro的TuxSuite增加了对Rust的支持

    rustc_codegen_gcc(GCC的rustc后端)被合并到Rust存储库中

    GCC Rust(GCC的一个Rust前端)正在致力于编译核心,这将是一个里程碑

    编译器资源管理器添加了Rust的替代编译器(GCC
    Rust、rustc_codegen_gcc和mrustc),以及其他特性,如MIR和宏扩展视图

最重要的是,这个项目得到了工业界和学术界的双重支持。行业内几家大公司如谷歌、Arm、微软和红帽等大厂纷纷与之建立了联系, 其他公司也私下表示支持该项目。同时该团队还与包括华盛顿大学研究人员以及一些实验室进行了密切的交流,在很多行业大会上也进行了一系列推广,并得到了广泛的认可。

总的来说,Rust for Linux是一个庞大的项目。尽管从一开始就很清楚,在内核中添加第二种“主”语言将面临技术和管理两方面的挑战,但该团队依然选择迎难而上。去年的大部分工作都是与各类利益相关者合作,试图让每个人都参与进来。有许多人以不同的方式为该项目做出了贡献:代码贡献、评审、文档、工具支持、Rust特性…等等。

在这里插入图片描述
展望未来

Rust for Linux成立后的第二年,该团队表示,他们期待着以下几个里程碑的实现:

    内核中有更多的用户或用例,包括示例驱动程序——这对于合并到内核中非常重要

    拆分内核机箱并管理依赖关系以实现更好的开发

    扩展当前集成的内核文档、测试和其他工具

    让更多的子系统维护人员、公司和研究人员参与进来

    看到大部分剩余的Rust特征稳定下来

    可能能够在内核中用GCC开始编译Rust代码

    合并到主线内核中,这应该会使其他事情变得更容易

同时,还会有一些活动出席计划,如果今年完成按照计划实现,该项目的成长所带来的惊喜将可以预见。

参考资料:https://www.memorysafety.org/blog/memory-safety-in-linux-kernel/