Является ли CVE-2020-8794 логичной проблемой? - PullRequest
0 голосов
/ 02 марта 2020

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

LPE и RCE в стандартной установке OpenSMTPD (CVE-2020-8794)

AFAIK Я могу прочитать из этого более длинного поста, что это основано на "вне чтения".

Большой вопрос : Если этот код был написан на Rust, а не на C, предотвратит ли Rust «чтение за пределами»?

Спасибо.

1 Ответ

2 голосов
/ 02 марта 2020

Скорее всего, Rust предотвратил бы это.

Это

line = line + 4;

- это не то, что мы бы сделали в Rust. Мы редко используем сырые указатели напрямую, предпочитая более удобные и более безопасные упаковщики с нулевой стоимостью, такие как ломтики. На самом деле арифметика raw-pointer c настолько редка, что у нас даже нет операторов для нее (только методы). Срезы гарантированно указывают на действительную память и знают об их размере, поэтому, если бы разработчики использовали &[u8] для line, это, вероятно, могло бы стать в Rust:

line = &line[4..];

, но по умолчанию оператор индексации выполняет проверку границ, паникуя, если индексы выходят за пределы. Это предотвратит недопустимое чтение, которое следует в остальной части кода C.


Конечно, это предполагает, что разработчики использовали бы только безопасный Rust. Если бы они сочли эту ветку достаточно важной, чтобы заслужить некоторые дополнительные оптимизации, использование которых могло бы потребовать unsafe (например, вызов get_unchecked после того, как они заметили (или предположили !?), что компилятор не может оптимизировать проверка привязки), в Rust могут возникнуть те же проблемы, что и в C.

По умолчанию Rust безопасен только .

...