内存安全-

ISRG希望用Rust使Linux内核的内存安全

避免C语言编码陷阱的最简单方法是避免用C语言编码。

在工业建筑工地,铁锈覆盖着一根管子。
扩大 /不,不是有点生锈。

互联网安全研究小组(ISRG)——更著名的“让我们加密”项目的母公司——已经为著名的开发人员Miguel Ojeda提供了一些一份为期一年的Linux版《Rust》合同以及其他全职的安全工作。

什么是Linux的生锈?

当我们覆盖3月份,RUST是一种低级编程语言,提供了自20世纪70年代以来的UNIX和UNIX的操作系统中用于内核的C-M语言的大部分灵活性和性能。

让Rust成为Linux内核开发的可行语言的努力始于2020年的Linux Plumbers会议,这个想法来自Linus Torvalds本人。Torvalds特别要求在默认内核构建环境中提供Rust编译器以支持这些工作——不是用Rust开发的等价代码替换Linux内核的整个源代码,而是使新开发能够正常工作。

将Rust用于内核中的新代码——这可能意味着新的硬件驱动程序,甚至替换GNU coreutil——可能会减少潜伏在内核中的bug数量。Rust不允许开发人员泄漏内存或产生缓冲区溢出的可能性——这在复杂的c语言代码中是性能和安全问题的重要来源。

谷歌,ISRG和Ojeda

来自互联网安全研究小组的新合同为Ojeda提供了全职薪水,以继续记忆安全工作,他已经兼职。ISRG执行董事Josh AAS指出,该集团与谷歌工程师丹洛伦密切合作,谷歌本身的财政支持对于赞助Ojeda正在进行的工作至关重要。

Lorenc说:“大量努力来消除整个安全问题是最好的大规模投资。”他补充说,谷歌“很高兴[帮助]ISRG支持Miguel Ojeda致力于为每个人改善内核内存安全的工作。”

prosimo和记忆安全

Ojeda的工作是在ISRG的prosimo旗帜下赞助的第一个项目,但这不是该组织为更大的内存安全所采取的第一步。以前的计划包括用于Apache web服务器的内存安全TLS模块,内存安全版本的卷曲数据传输实用程序rustls-一个内存安全的替代无处不在的OpenSSL网络加密库。

可以找到prossimo举措memorysafety.org以及捐赠链接 - ISRG及其PROSSIMO项目由个人和社区思想公司的慈善捐赠支持100%。如果您想参与其中,ISRG接受直接货币捐款通过PayPal或Donorbox,各种加密货币,甚至证券或共同基金的股票。

171年读者评论

  1. 我对此持乐观态度。C现在已经50多岁了……总有一天,是时候向前看了。
    2402个帖子|注册
  2. 与Rust合作的一个主要优势是它从不睡觉。
    |注册了39个帖子
  3. 我从1985年开始就在软件领域工作,用大约10种不同的语言编写代码。

    作为一名普通的程序员,但我希望自己是一名更好的分析师,然后是一名专攻IT安全和威胁风险分析(TRA)的架构师,C和c++应用程序对我的威胁几乎和跨越多个领域的运营网络的风险一样大。这几乎是TRA中风险最高的。

    [编辑]在我的经验,网络团队不应用相同的控制作为开发过程-它是常见的看到特别更改防火墙设置,没有测试和更改控制举例。

    最后一次编辑Dodgyg33za.星期八,2021年6月4日下午4:36

    |注册了472个帖子
  4. Dodgyg33za.写道:
    我从1985年开始就在软件领域工作,用大约10种不同的语言编写代码。

    作为一名普通的程序员,但我希望自己是一名更好的分析师,然后是一名专攻IT安全和威胁风险分析(TRA)的架构师,C和c++应用程序对我的威胁几乎和跨越多个领域的运营网络的风险一样大。这几乎是TRA中风险最高的。


    唯一比C开发的应用程序更可怕的是直接的人类用户参与。:)
    |注册了13279个帖子
  5. Rust开始变得像The One®,被预言将取代C。
    |注册了816个帖子
  6. 引用:
    Rust不允许开发人员泄漏内存或产生缓冲区溢出的可能性——这在复杂的c语言代码中是性能和安全问题的重要来源。


    这是真的吗?Rust的内存检查是一个编译时函数,而不是运行时函数。这是我的理解,它使得内存安全默认的编程方式和执行内存分配和释放在编译时通过计算引用,但是您可以显式部分标记为不安全的和能做的事情,否则不可能,可以包括内存泄漏。不安全就是字面上的关键词。

    https://doc.rust-lang.org/book/ch19-01-…% 20指针

    所以我要说"生锈使内存安全这是默认的编程方法并显式地标记出任何可能不安全的代码"

    别误会我。Rust听起来真的很有趣,似乎是一个很好的设计目标。比带有运行时环境的Java等更低的级别。特别是对于Linux来说,能够在内核中使用Rust驱动程序似乎是一个巨大的胜利。

    最后一次编辑evan_s.2021年6月21日星期一下午4:39

    |注册了3534个帖子
  7. bersl2写道:
    Rust开始变得像The One®,被预言将取代C。


    好吧,如果这是锈的第一个大故事,让我们希望后续和跟进是对的。不像我们上次听到的关于the One®的故事。

    让我们希望Linux中的Rust是更多的革命,而不是更少的革命。哈哈
    579个帖子|注册
  8. 这让我在redox上办理登机手续(完全写的铁锈,但仍在开发中),我与这种令人沮丧的新闻(和深刻的想法)见过面临:-(

    https://www.redox-os.org/news/open-sour ... al-health /
    |注册了294篇文章
  9. 我用C和c++写了20年的代码,我发现它们都很糟糕(c++比C更糟糕),所以我对《Rust》抱有很高的期望。但老实说,有人可以设计出更好的语法。相比之下,甚至C看起来也很现代。
    |注册了1741个帖子
  10. bersl2写道:
    Rust开始变得像The One®,被预言将取代C。

    到现在为止,我已经为《Rust》编写了大约一年的程序,我不得不说我是它的粉丝。我想说,只有现在我才认为自己有能力(这无疑是一个学习曲线),但这是值得的。

    但是,框架的状态有些问题。它们不是缺乏,而是扩散——而且它们几乎都是不成熟的,使用不稳定的api快速移动目标。这就导致了一种非常特殊的Rust形式的依赖地狱,你会发现自己在每个库的三个微妙的不兼容的版本中链接到你所构建的所有东西……这可能是少一个问题在类似Linux内核的开发依赖关系会更少的(除非你systemd的作者,你可能不会考虑把SQL客户机或网络服务器的内核),可以控制dictat(唯一的祝福异步框架是X,例如)。从好的方面来看,*大多数*(但不是全部)这样的不兼容出现在编译时,而不是运行时恐慌。


    总之,很好。锈将有利于内核,并且更多的开发人员使用锈将有利于锈。
    |注册了1035个帖子
  11. evan_s.写道:
    引用:
    Rust不允许开发人员泄漏内存或产生缓冲区溢出的可能性——这在复杂的c语言代码中是性能和安全问题的重要来源。


    这是真的吗?Rust的内存检查是一个编译时函数,而不是运行时函数。这是我的理解,它使得内存安全默认的编程方式和执行内存分配和释放在编译时通过计算引用,但是您可以显式部分标记为不安全的和能做的事情,否则不可能,可以包括内存泄漏。不安全就是字面上的关键词。

    https://doc.rust-lang.org/book/ch19-01-…% 20指针

    所以我要说"生锈使内存安全这是默认的编程方法并显式地标记出任何可能不安全的代码"

    别误会我。Rust听起来真的很有趣,似乎是一个很好的设计目标。比带有运行时环境的Java等更低的级别。特别是对于Linux来说,能够在内核中使用Rust驱动程序似乎是一个巨大的胜利。



    是的,Rust通常是安全的,除非您将一部分代码标记为不安全时,因为您需要不安全的事情。一些内置库在不安全的块中,因为它不能处于安全模式。

    这仍然比C/ c++要好,因为默认情况下它是安全的,你必须显式地说你想做一些不安全的事情,这些代码部分可以被更彻底地测试。

    在完整的应用程序中进行基于逻辑的代码验证仍然是不切实际的,但是如果您能将不安全的代码限制在小的部分,那么这些部分就可以被验证为正确的。
    |注册了7771个帖子
  12. evan_s.写道:
    这是我的理解,它使得内存安全默认的编程方式和执行内存分配和释放在编译时通过计算引用,但是您可以显式部分标记为不安全的和能做的事情,否则不可能,可以包括内存泄漏。不安全就是字面上的关键词。

    “不安全”是一种标记编译器无法验证的代码的方法。这些代码仍然不允许打破语言的规则。
    2340个帖子|注册
  13. 斯特恩写道:
    evan_s.写道:
    这是我的理解,它使得内存安全默认的编程方式和执行内存分配和释放在编译时通过计算引用,但是您可以显式部分标记为不安全的和能做的事情,否则不可能,可以包括内存泄漏。不安全就是字面上的关键词。

    “不安全”是一种标记编译器无法验证的代码的方法。这些代码仍然不允许打破语言的规则。


    虽然这在技术上是正确的(最好的一种),但锈蚀规则说,不安全代码在保证安全锈蚀代码方面几乎没有什么作用,所以很容易泄漏任意数量的内存(不安全的{libc::malloc(0x10000);})。这个想法是通过最小化这样的代码数量(以及使其显式)意味着(对一个人来说)更容易检查不安全代码的正确性。
    51个帖子|注册
  14. 脾气暴躁的旧编码器:“我们曾经盯着C代码寻找内存损坏,我们喜欢它!现在离开我的草坪!”
    5983帖子|注册
  15. bersl2写道:
    Rust开始变得像The One®,被预言将取代C。


    有点遗憾的是,D从来没有出现在聚光灯下,因此打破了连续字母的传统,但老实说,他们应该在开始设计它时做出更好的决定。我还没机会好好看看拉斯特,但如果更好,那就好了。
    |注册了998个帖子
  16. evan_s.写道:
    引用:
    Rust不允许开发人员泄漏内存或产生缓冲区溢出的可能性——这在复杂的c语言代码中是性能和安全问题的重要来源。


    这是真的吗?Rust的内存检查是一个编译时函数,而不是运行时函数。这是我的理解,它使得内存安全默认的编程方式和执行内存分配和释放在编译时通过计算引用,但是您可以显式部分标记为不安全的和能做的事情,否则不可能,可以包括内存泄漏。不安全就是字面上的关键词。


    引用计数并不是处理事情的主要方式,它主要通过将一个变量限制为1个可变句柄或多个不可变句柄来处理内存安全。生存期在编译时计算,以确保内存在释放后不会被访问。引用计数可以用于这样的情况:您希望数据在通常会释放数据的情况下继续存在,但显然会带来开销。
    |注册了6个帖子
  17. evan_s.写道:
    引用:

    所以我要说"生锈使内存安全这是默认的编程方法并显式地标记出任何可能不安全的代码"


    通过这样做,它将允许程序员把更多的精力集中在标记为不安全的领域,从而提高代码审查提前发现问题的机会。
    |注册了34个帖子
  18. bersl2写道:
    Rust开始变得像The One®,被预言将取代C。


    我们只希望它不会受到黑暗势力的影响,最终落入爪哇的湖中
    |注册了3469个帖子
  19. 引用:
    Rust不允许开发者泄漏内存


    这是不正确的,即使在安全生锈。该死,有一个专门用来泄漏内存的函数 https://doc.rust-lang.org/std/boxed/str…ethod.leak
    7个帖子|注册
  20. gaballard写道:
    我对此持乐观态度。C现在已经50多岁了……总有一天,是时候向前看了。


    30 .另一方面…C已经50多岁了。
    |注册了565个帖子
  21. gaballard写道:
    我对此持乐观态度。C现在已经50多岁了……总有一天,是时候向前看了。


    30 .另一方面…C已经50多岁了。

    嘿,C只有49岁,在1972年首次发布。与Lisp(1958)、Fortran(1957)和Cobol(1959)相比,它仍然是一个年轻的产物。
    |注册了3461个帖子
  22. 多年来,我写过x86 asm(大量)、C、堕落的c++、最小的c#,甚至modalla -2(在20世纪80年代!)所有这些都在生产环境中。没有“一种”语言可以满足这些要求。我不是计算机语言专家,但有一点你会说,“我不再需要物理布局内存”。我理想的语言应该是在向编译器提供我想要的提示方面更加冗长的语言。如果我正在处理物理硬件,比如在一个驱动程序或从二进制文件中读取,我想使用一个指定实际位布局的PhysicalMap{}结构。否则,我不关心数据在内存中是如何排列的。

    超高层语言的主要问题是复制问题。它们到处复制内存。字符串是一个常见的例子。它是可变的吗?在“构建”阶段会发生什么?我不希望在构建字符串时,有一堆副本在进行。当性能在我的x86代码中至关重要时,我过去常常在堆栈上分配构建空间,然后在超过堆栈上的“短字符串”空间时切换到分配内存。释放空间将检查长指针的段是否为SS,以决定是否释放它。

    继续咆哮,我的理想语言应该查看整个程序,并决定如何为我正在跟踪的各种项目最佳分配内存。我可以在语法中给出提示。性能也是一样。
    280个帖子|注册
  23. Kahurangikea写道:
    Rust不是一种低级编程语言。低级语言类似于底层硬件。例如,机器代码、汇编语言、梯形逻辑(后者目前主要是模拟硬件)。

    我从未用rust编程,但从这个维基百科的代码例子来看,它显然是高级别的。

    Fn阶乘(i: u64) -> u64 {
    比赛我{
    0 => 1,
    N *阶乘(N -1)



    Rust可能比某些语言要低一些,但底层硬件显然有大量的抽象。


    从技术上讲,您是正确的,尽管这实际上只是一个事实的结果,即当这个术语被创造出来的时候,汇编编码仍然是一件普遍的事情。从技术上讲,C语言也不是一种低级语言。但是像C语言和Rust这样的非正式语言就是这样描述的。
    1907个帖子|注册
  24. gaballard写道:
    我对此持乐观态度。C现在已经50多岁了……总有一天,是时候向前看了。

    为了继续前进的只是一个很好的主意,只是一个好主意。我们应该替代英语,因为它超过50岁?数学语法?

    如果有的话,行业做得太多了。关于C关于C的最喜欢的事情是我可以在其中编写一个程序,几十年后仍将在没有问题的情况下工作。其他编程语言并不是真的,而且一个人有时是为什么我在C中编写一个程序。如果我想要在另外20年内存在的东西,C肯定是我写它的语言。这是额外的如果您没有作为代码包含的依赖项,这通常是我的软件的情况。

    对于许多用例(不管语言)的技术优点,我想看到一个ISO标准,规范静态停留至少5年左右一旦没有任何人发现任何他们觉得他们必须改变在正常的时间表,计划不发行新标准版本通常一次十年左右的时间里,并承诺在发布重大改变或增强时不做出重大改变或增强。


    如果替换C是一个好主意,或者不依赖于您的用法。如果内存问题是您的大问题,它可能是一个好主意(这是一个非常常见的问题,许多程序员都只是糟糕,无论他们如何尝试,所以它限制了可用的员工,我肯定会看到一个OS供应商想要人们在它中写下司机,例如它导致人们责怪供应商的问题)。这不是一个普遍的欲望,有些人喜欢管理自己的记忆,并这样做有时允许你写一个更快的程序,并更快地写下这个程序。

    如果要问在C语言中可以改进什么,我的首选是更好地访问现代广泛使用的汇编指令,特别是缓存控制和并行操作。我真的希望看到一种语言倾向于可移植的汇编方面,而不是另一种试图处理内存管理的高级语言。内建内存处理根本不在我的列表上。

    许多人确实想要一种比C稍高级的语言,但这种语言不会是所有人的一切。C语言拥有非常多样化的用户基础和丰富的历史。如果你在谈论替代者,这两者都很重要。
    |注册了4536个帖子
  25. ninjaneer.写道:
    我个人的经验是,它带来的货物胡扯试图下载如此多的东西编译,我被限制在github上。我不明白为什么如此糟糕的东西可以被信任作为内核代码。

    货物与Rust之间的关系就像pip与Python之间的关系一样。如果您愿意,可以单独使用Rust编译器,或者使用Meson作为构建系统。没有要求你使用货物,但你可能会想要,如果你正在建设任何实质性的东西。

    我在工作中用过Rust,我很喜欢它。我花了大约半天的时间才写完这篇文章,而且我还没碰过它,因为我正在做的其他项目就不需要这么做了。
    693帖子|挂号的
  26. cerberusTI写道:
    .我真的希望看到一种语言倾向于可移植的汇编方面,而不是另一种试图处理内存管理的高级语言。


    我可能会建议在你敲门之前给它拍摄。许多事情的寿命在编译时是已知的,因此它实际上可以最终更快。它不是垃圾收集或类似的东西。
    693帖子|挂号的
  27. Kahurangikea写道:
    Rust不是一种低级编程语言。低级语言类似于底层硬件。例如,机器代码、汇编语言、梯形逻辑(后者目前主要是模拟硬件)。

    我从未用rust编程,但从这个维基百科的代码例子来看,它显然是高级别的。
    代码:
    Fn阶乘(i: u64) -> u64 {
    比赛我{
    0 => 1,
    N *阶乘(N -1)



    Rust可能比某些语言要低一些,但底层硬件显然有大量的抽象。


    我不是一个优秀的程序员,所以你能解释一下你的例子与C版本有什么不同吗?
    代码:
    长因子(int n)

    如果(n == 0)
    返回1;
    其他的
    返回(n * factorial (n - 1));



    我记得在李纳斯的一次采访中,他提到他喜欢C语言,因为C语言和机器非常接近,你可以像机器一样思考,理解正在发生的事情。我相信你也在引用这个想法,但我不确定。

    关于生锈一般,我见过很多备受尊重的人为后端服务搬到它,一个主要的例子是getsentry.io
    |注册了5700个帖子
  28. bubbasnmp.写道:
    与Rust合作的一个主要优势是它从不睡觉。


    你为这个付钱,但他们给你那个。
    280个帖子|注册
  29. Tayhimself.写道:
    我不是一个优秀的程序员,所以你能解释一下你的例子与C版本有什么不同吗?

    Kahurangikea的意思是Rust是一种和c一样的高级语言。然而,作者显然不是指传统意义上的“低级”语言,即“你直接处理处理器指令”。而是从“你必须管理自己的内存”的意义上说,不像Python、c#或Java(平流层级别的语言?)
    |注册了2296个帖子
  30. WaveRunner写道:
    breze写道:
    Kahurangikea写道:
    Rust不是一种低级编程语言。低级语言类似于底层硬件。例如,机器代码、汇编语言、梯形逻辑(后者目前主要是模拟硬件)。

    我从未用rust编程,但从这个维基百科的代码例子来看,它显然是高级别的。

    Fn阶乘(i: u64) -> u64 {
    比赛我{
    0 => 1,
    N *阶乘(N -1)



    Rust可能比某些语言要低一些,但底层硬件显然有大量的抽象。


    从技术上讲,您是正确的,尽管这实际上只是一个事实的结果,即当这个术语被创造出来的时候,汇编编码仍然是一件普遍的事情。从技术上讲,C语言也不是一种低级语言。但是像C语言和Rust这样的非正式语言就是这样描述的。


    是面向对象的吗?是的……那它就不是低级语言了。


    最可能的答案是肯定的,但这有点过头了。甚至在教科书的定义中,编译语言也不是“低级语言”。

    https://en.wikipedia.org/wiki/Low-level…g_language

    几乎可以肯定的是,这个离题的人对这个艺术术语很迂曲。
    1907个帖子|注册
  31. J.King.写道:
    Tayhimself.写道:
    我不是一个优秀的程序员,所以你能解释一下你的例子与C版本有什么不同吗?

    Kahurangikea的意思是Rust是一种和c一样的高级语言。然而,作者显然不是指传统意义上的“低级”语言,即“你直接处理处理器指令”。而是从“你必须管理自己的内存”的意义上说,不像Python、c#或Java(平流层级别的语言?)

    对于编写过大量汇编程序的人来说,x86汇编程序和C之间的差距要比C和c#之间的差距大得多。

    虽然您可以使内存管理需要大量的代码和精力,但如果您这样做,通常它通常是一个整体节目的一小部分。

    在汇编语言中你要做的最重要的事情,而在C语言中你不会做的是将值变换进寄存器和搬出寄存器。无论您如何看待它,这都是一大堆代码,而且它使内容更加难以阅读。你不能像使用内存管理那样通过逻辑解决这个问题(所以我们让编译器代替它)。
    |注册了4536个帖子
  32. henador写道:
    多年来,我写过x86 asm(大量)、C、堕落的c++、最小的c#,甚至modalla -2(在20世纪80年代!)所有这些都在生产环境中。没有“一种”语言可以满足这些要求。我不是计算机语言专家,但有一点你会说,“我不再需要物理布局内存”。我理想的语言应该是在向编译器提供我想要的提示方面更加冗长的语言。如果我正在处理物理硬件,比如在一个驱动程序或从二进制文件中读取,我想使用一个指定实际位布局的PhysicalMap{}结构。否则,我不关心数据在内存中是如何排列的。

    超高层语言的主要问题是复制问题。它们到处复制内存。字符串是一个常见的例子。它是可变的吗?在“构建”阶段会发生什么?我不希望在构建字符串时,有一堆副本在进行。当性能在我的x86代码中至关重要时,我过去常常在堆栈上分配构建空间,然后在超过堆栈上的“短字符串”空间时切换到分配内存。释放空间将检查长指针的段是否为SS,以决定是否释放它。

    继续咆哮,我的理想语言应该查看整个程序,并决定如何为我正在跟踪的各种项目最佳分配内存。我可以在语法中给出提示。性能也是一样。


    你看过Ada吗?它不是20世纪80年代的编译器表现。
    |注册了451个帖子
  33. TheTripod写道:
    bubbasnmp.写道:
    与Rust合作的一个主要优势是它从不睡觉。


    你为这个付钱,但他们给你那个。

    我们谈论的是编程语言还是物理上的东西?物理锈(氧化铁)确实具有这些特性。从不睡觉,需要支付搬家费用。
    |注册了451个帖子
  34. WaveRunner写道:
    breze写道:
    Kahurangikea写道:
    Rust不是一种低级编程语言。低级语言类似于底层硬件。例如,机器代码、汇编语言、梯形逻辑(后者目前主要是模拟硬件)。

    我从未用rust编程,但从这个维基百科的代码例子来看,它显然是高级别的。

    Fn阶乘(i: u64) -> u64 {
    比赛我{
    0 => 1,
    N *阶乘(N -1)



    Rust可能比某些语言要低一些,但底层硬件显然有大量的抽象。


    从技术上讲,您是正确的,尽管这实际上只是一个事实的结果,即当这个术语被创造出来的时候,汇编编码仍然是一件普遍的事情。从技术上讲,C语言也不是一种低级语言。但是像C语言和Rust这样的非正式语言就是这样描述的。


    是面向对象的吗?是的……那它就不是低级语言了。


    和Go一样,Rust使用组合而不是“面向对象”语言的继承。我不知道(也不在乎)这是否能让拉斯特进入高层。

    我已经使用了Go和Rust,而他们有不同的优势(和弱点),他们都以不同的方式,使得难以编码缓冲区溢出,使用余额的错误以及由坚持开发人员管理的所有其他问题记忆(我说是在BCPL中写下他的第一个“Hello World”程序的人,其中甚至c)
    |注册了186个帖子

你必须置评。

通道ARS Technica