7

Linus:"Rust是安全的 "并不是对代码安全的某种绝对保证

 1 year ago
source link: https://www.jdon.com/62735
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Linus:"Rust是安全的 "并不是对代码安全的某种绝对保证


你需要认识到:

  •  (a) 现实胜过幻想
  •  (b) 核心的需要胜过了任何Rust的需要

而*现实是,没有绝对的保证。  永远不会。而
"Rust是安全的 "并不是对代码安全的某种绝对保证。
从来都不是。

即使是用户空间的 "安全 "Rust代码也会做一些事情,比如当事情出错(溢出、分配失败等)时就会抛panic(类似Exception)。
事情出错时(溢出、分配失败等),也会做出panic的事情。如果你不
意识到这不是某种真正的安全,我不知道该说些什么。

(出错时)不继续完成操作,并不*比得到错误的答案好,它只是更容易被调试而已。

在内核中,"panic和停止 "不是一个选项(它甚至比错误的答案更糟糕,因为它真的无法调试)。
它甚至比错误的答案还要糟糕,因为它真的无法调试),所以
所以内核版的 "panic "是 "WARN_ON_ONCE()警告一次",并继续执行完成错误的答案。

因此,我真的*需要*Rust的人去理解这一点。
整个 "安全 "的现实不是某种绝对的的现实,以及内核方面*需要*与用户空间传统上稍有不同的规则的现实。

。。。
(在用户空间)你有一个错误。该死的事情发生了。我们有很多的调试工具
当发生这种错误情况时,会给你一个*大的警告,包括发送自动报告给发行版制造商。然后你修复错误。

要把 "调试工具给出一个巨大的警告 "看成是相当于标准Rust中的std::panic。
但是,内核应该在错误是继续运行(除非你设置了 panic-on-warn),因为内核*必须*继续,以便有 "向上游报告 "发生情况的机会。

所以从技术上讲,它与std:panic的实现非常不同:
但你基本上应该把它看作是:一个*技术上的*,而不是概念上的差异。
内核如何处理bug的规则是不同的,因为我们没有核心文件,
在一般情况下,我们没有核心文件和调试器。

(是的,你可以有一个内核调试器,而且你可以让
WARN_ON_ONCE触发调试器,但是想想那些在普通用户手中的数十亿设备)。

....
或者,你知道,如果你不能处理好内核所要求的规则,那么就不要做内核编程。

因为到最后,它真的就这么简单。  我真的需要你理解内核中的Rust是依赖于*内核*规则的。而不是一些存在于其他地方的随机规则。

(banq:领域规则说了算,内核领域不同于内核以外的使用内核的用户领域)

Reddit网友:
1、Linus 真正想说的是,在内核中继续运行比 Rust 的安全保证更重要。内核更关心这一点而不是安全性,这并不是 Rust 的错。

2、崩溃比继续不正确的状态或允许非法操作要好得多?
请记住,美国范围内的 AT&T 中断是由崩溃和崩溃引起的崩溃引起的。

https://users.csc.calpoly.edu/~jdalbey/SWE/Papers/att_collap

3、内核崩溃可能相当于将您的设备变砖。对于大多数用户来说,这绝对是最糟糕的安全漏洞。

4、数量惊人的内核代码可以在不关闭系统的情况下运行?

5、,“Rust 是安全的”具有明确定义的技术含义,而不是“每个 Rust 程序都有绝对的代码安全保证”。

6、panic(抛Exception)在 Rust 意义上是“安全的”,因为它不会导致未定义的行为,没有机会访问未初始化或已释放的内存。但这在生产化库和二进制文件中也被认为是不好的做法。“永远不要panic”不是该语言做出的承诺,但“避免panic并更喜欢返回结果”绝对是一种文化和惯用的最佳实践。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK