-2

来自:https ://www.qualys.com/2020/02/24/cve-2020-8794/lpe-rce-opensmtpd-default-install.txt

OpenSMTPD 默认安装中的 LPE 和 RCE (CVE-2020-8794)

AFAIK 我可以从这篇较长的文章中了解到,它是基于“越界阅读”的。

大问题:如果这段代码是用 Rust 而不是 C 编写的,Rust 会阻止“越界读取”吗?

谢谢。

4

1 回答 1

3

Rust 很可能会阻止这一点。

这个

line = line + 4;

不是我们在 Rust 中会做的事情。我们很少直接使用原始指针,更喜欢更方便、更安全的 0 成本包装器,例如切片。事实上,原始指针算术非常罕见,我们甚至没有它的运算符(只有方法)。切片保证指向有效内存,并且知道它们的大小,所以假设开发人员会使用&[u8]for line,这可能会在 Rust 中变为:

line = &line[4..];

但是索引操作符默认会进行边界检查,如果索引超出范围就会恐慌。这将防止在 C 代码的其余部分中出现无效读取。


当然,这是假设开发人员只会使用安全的 Rust。如果他们认为这个分支足够重要,值得使用可能需要的一些额外优化(例如,在他们注意到(或假设!?)编译器无法优化边界检查之后unsafe调用),同样类型的问题将存在于get_uncheckedRust 就像 C 中一样。

只有默认情况下, Rust 才是安全的

于 2020-03-02T10:05:03.207 回答