LINUX.ORG.RU

Rust is not safe!

 ,


1

7

https://youtu.be/vfMpIsJwpjU

Для Ъ: в этом вашем Rust с 2015 года существует уязвимость, позволяющая неограниченно расширить время жизни любой переменной и воспроизвести любые уязвимости, связанные с памятью.

Это уже вторая подобная уязвимость, первая была, когда люди стали эмулировать сырые указатели с помощью индексов в массивах.

А Linux тут при том, что и на нём эти уязвимости прекрасно воспроизведутся.

★★★★★

Последнее исправление: Dimez (всего исправлений: 3)

Ответ на: комментарий от hateyoufeel

Cargo не единственный пакетный менеджер, умеющий подначивать зависимости, только при этом другие поддерживают скачивание из произвольного места и для нескольких языков.

Дебиан я и на изолированной от интернета машине могу обновить.

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)
Ответ на: комментарий от Lrrr

это все статические инварианты, которые проверяет компилятор.

safe блок не может вызвать unsafe, а только safe или trusted.

unsafe вызывает любой блок

trusted вызывает тоже любой блок, но усиливает утверждение если вызвал unsafe. и тут надо чета написать.

int x = trusting some_unsafe_func(); ///я доверяю в данном контексте some_unsafe_func()!!!

чтобы проверить на всякие небезопасные какашки надо просмотреть код на пример uhsafe частей и тех мест, где они переводятся в trusting.

safe код чист всегда.

trusted считается условно чистым и его можно использовать в чистом.

unsafe всегда грязный


программа в идеале не должна содержать unsafe частей, а только trusted и safe

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 2)
Ответ на: комментарий от theNamelessOne

Просто есть такая штука как fpm (fortran package manager), вдохновлённый идеями cargo. Он для своей сборки требует внешние библиотеки, которые хочет скачать, что в изолированных окружениях сборки проблематично. Хорошо, что он поддерживает линковку с системными библиотеками и все зависимости можно иметь в системе заранее.

grem ★★★★★
()
Ответ на: комментарий от grem

Cargo не единственный пакетный менеджер, умеющий подначивать зависимости

Конечно. Они все это делают. Считать зависимости – это, мать его, основная функция таких программ!

только при этом другие поддерживают скачивание из произвольного места

Карго это тоже умеет. Это вообще кто угодно умеет.

и для нескольких языков.

А можно примеры? Для нескольких языков – это только Nix и, наверное, какой-нибудь Bazel.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

А sprintf — это unsafe, trusted или safe?

если функция ломается в зависимости от подставленных параметров - это не вопрос адресной арифметики и прочего харкора. это вопрос ее логики. можно сломать вполне невинную функцию, просто зациклившись в ней. или уйдя в бесконечную рекурсию. или начиная аллокировать память до бесконечности.


функции системных либ должны быть либо safe, либо trusted. unsafe - это по сути код, про который нет гарантий корректности. такой хоккей нам не нужен!

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от grem

Scons, Meson - заявлена поддержка примерно для 10 языков.

А где они зависимости считают? Meson поддерживает Rust в том смысле, что он знает что для .rs нужно дёрнуть rustc. И всё. Дальше пользователю предлагается самому пердолиться.

Так можно заявить, что Make поддерживает Rust.

Алсо:

https://mesonbuild.com/Rust.html

Meson currently does not support creating a single target with Rust and non Rust sources mixed together, therefore one must compile multiple libraries and link them.

Lol! Lmao even! Говно это полное, а не поддержка.

hateyoufeel ★★★★★
()
Ответ на: комментарий от grem

Не знаю, для c, c++, fortran считают и сами определяют порядок сборки

Потому что там разработчик сам указывает порядок сборки. Meson – довольно простая и низкоуровневая программа, он не для этого.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от unC0Rr

Я, кстати, так и не понял, как этот баг триггернуть случайно. Специально-то понятно, а вот так, чтобы написать какой-то разумный код и при этом чтобы вот это вот преобразование получилось сделать и применить извне.

А то выглядит как хакер с солонкой.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от lovesan

Лисп (особенно CL), это единственная платформа, которая не заставляет тебя дрочить

Если языки программирования заставляют тебя дрочить, то тебе пора найти себе бабу уже.

cumvillain
()

Не люблю Rust, но здесь тейк уровня «Оказывается, если поместить яйца в районе косяка и захлопнуть дверь, будет очень больно. Двери небезопасны!!!»

buddhist ★★★★★
()
Ответ на: комментарий от Lrrr

если у тебя программа работает не так как надо, и ты имеешь дело с отладчиком и стек трейсами, то что дадут сейфы с ансейфами?

а если программа работает так как надо?

Вот такие они, сишники. «Как надо» и «как не надо» это очень качественные критерии кода, а главное объективные 😊.

Virtuos86 ★★★★★
()
Ответ на: комментарий от grem

Ада в своё время не имела толком FFI, что не позволяло её использовать за пределами ада-мира. Потому и военка и прочая энергетика, где были ресурсы напилить проект целиком с нуля.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от lovesan

Вот только этот дроч сильно помогает когда тебе не приходится выдрачивать из корки без символов «а чего и где там сегфолт-то вызывает после дождя по четвергам».

И это хорошо, если у тебя корка есть, а не контроллер упавший в HardFault и перезагруженный watchdog’ом, там задача становится весьма творческой.

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 1)
Ответ на: комментарий от zurg

Это было бы смешно, если бы не случаи, когда исходная библиотека просто становится недоступна по старому адресу. Пример: библиотека METIS - архивы на сайте института стали недоступны, пришлось искать не выложили ли авторы где их ещё. Ещё возможен вариант, когда на зеркале просто исчезают версии старых архивов при переносе на новый сервис.

grem ★★★★★
()
Ответ на: комментарий от grem

Поверь, брали и 23 (который 22) - программный комплекс написанный в нулевых до последнего пытались продолжать поддерживать на аде, но сейчас он переписывается на плюсах, и даже адовые деды при этом выдыхают с облегчением, потому что хочется писать всё-таки на ЯП, а не на этой ублюдской клинописи.

anonymous
()
Ответ на: комментарий от anonymous

Поверь, брали и 23 (который 22) - программный комплекс написанный в нулевых до последнего пытались продолжать поддерживать на аде, но сейчас он переписывается на плюсах, и даже адовые деды при этом выдыхают с облегчением, потому что хочется писать всё-таки на ЯП, а не на этой ублюдской клинописи.

Анон, пиши подробности. Мы хотим историю успеха.

hateyoufeel ★★★★★
()
Ответ на: комментарий от PPP328

Проприетарное хранилище библиотек

Зеркаль себе: github.com/tennix/crates-mirror

Макросы. Все считают «ооо, как круто, написал [abyrvalg] и там всё само!». Ага, вот только это нулевой контроль за тем, что там происходит и что вклинивается в бинарь. Это такой curl xxx | bash только еще и с заливкой в бинарь этой посылки.

Не больше, чем Makefile в проектах на Си. Вообще макросы полностью эмулируются на любом языке несколькими строками в Makefile:

   gen: gen.c
   prog.c: gen
      ./gen > prog.c
   prog: prog.c

Всё остальное — удобство синтаксиса.

Ага, вот только это нулевой контроль за тем, что там происходит и что вклинивается в бинарь.

Исходники макроса доступны. Видно и что происходит на этапе компиляции и что является результатом макроса и вклинивается в бинарь.

monk ★★★★★
()
Ответ на: комментарий от Dark_SavanT

Вот только этот дроч сильно помогает когда тебе не приходится выдрачивать из корки без символов «а чего и где там сегфолт-то вызывает после дождя по четвергам».

Так в CL этой проблемы вообще нет, там любая ошибка даёт нормальную трассу стека. Также, как и в Java. Ценой небольшой потери производительности.

monk ★★★★★
()
Ответ на: комментарий от alysnix

просто в си надо сделать квалификаторы unsafe и trusted.

правда это сломает совместимость.

Можно сделать квалификаторы safe и trusted. Тогда совместимость не пострадает.

Кстати, если их сделать макросами, то можно даже не дёргать разработчиков компиляторов, а сделать внешний анализатор кода.

monk ★★★★★
()
Ответ на: комментарий от monk

safe - это не гарантия, что блок кода корректен по любому. это запрещение адресной арифметики и прочих опасных операций. то есть в safe части опасные операции(их список должен быть составлен) запрещены. это разумеется не гарантирует полной корректности safe части в силу пороков алгоритма.

функции, которые можно сломать через параметры, вообще существовать не должны. это порок дизайна.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от monk

А как должен выглядеть safe аналог sprintf? То есть, чтобы он гарантировано не уходил в UB для любых параметров.

А в чём проблема-то? Если форматная строка константна, то даже gcc умеет проверять это говно сейчас.

hateyoufeel ★★★★★
()
Ответ на: комментарий от monk

ну скорее всего sprintf, если она прям так нужна, должна быть обозначена как unsafe, но ее конкретные вызовы в safe части, как trusted. то есть вызовы, для которых корректность доказана или очевидна являются доверяющими.

alysnix ★★★
()

И что нужно сделать чтобы make rust safe again? Слава б-гу числодробилки я не пишу, и мне нужно учить эту со временем жизни ссылок питушню

rtxtxtrx ★★
()
Ответ на: комментарий от alysnix

А как вообще можно случайно вылезти за границы массива? Напоминает проблемы всех новичков с зацыкливанием, ну те что-то надуманное, непонятное, типа как проблема «отсутствия» типизации в джо-эс

rtxtxtrx ★★
()
Ответ на: комментарий от alysnix

Я про реальные программы, а то что ты прказал - это детские проблемы, для решения который не нужен новый язык… Я ведь помню с чего начинался раст, в нем даже сборщик мусора был…

rtxtxtrx ★★
()
Ответ на: комментарий от rtxtxtrx

так это просто ломаемая извне функция fun. по-хорошему, она должна проверять индекс, или параметр должен быть интервалом [0..9].

вот почему функции должны быть неломаемы извне подстановкой неверного значения параметра.

alysnix ★★★
()
Ответ на: комментарий от alysnix

Она ничего не должна. Массив - это просто адрес в памяти, который не хранит ни информацию о размере массива, ни о типах элемента ряяяя. Зачем какие-то границы проверять? Почему нельзя смириться с тем, что сишка - низкоуровневая хрень. Да у этого есть свои недостатки, но я считаю что у человека должна быть свобода выбора засунуть голову под колеса… Не вижу концептуальных противоречий. Любые проверки и ограничения потребляют процессорные такты… Поговорим когда на растетнапишут первый aaa шутер

rtxtxtrx ★★
()