The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Локальная root-уязвимость в подсистеме inotify ядра Linux, opennews (??), 04-Авг-17, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


41. "Локальная root-уязвимость в подсистеме inotify ядра Linux"  +2 +/
Сообщение от Orduemail (ok), 05-Авг-17, 10:17 
> Гораздо больше логических ошибок,

"А у них негров линчуют", да? Здесь речь про race condition и переполнение буфера, то есть про ошибки которых можно избегать чисто механически, следуя определённым правилам программирования, типа "не использовать unsafe".

> только создадут излишние надежды у молодежи

Меня вот до сих пор удивляет то, с какой настырностью люди лезут в абсолютно неквалифицированные воспитатели, причём полагая себя умнее воспитуемых. Почему ты полагаешь, что подрастающие поколения настолько тупые, что они не смогут исследовать те ошибки, которые они совершают при написании кода на rust'е и не испытывать бесплодных надежд? То есть вот Вареник может даже не заглядывая в rust осознать, что rust не панацея, а вот подрастающие поколения такие тупые, что понять этого не смогут даже изучая rust, и даже реальное совершение ошибок их ничему не научит. Ну да, поколение ЕГЭ, я знаю. Все умные люди уже родились, Вареник был последним.

Ответить | Правка | К родителю #4 | Наверх | Cообщить модератору

46. "Локальная root-уязвимость в подсистеме inotify ядра Linux"  +2 +/
Сообщение от Crazy Alex (ok), 05-Авг-17, 12:24 
Смогли бы... Если пришли к расту, предварительно изучив ассемблер и поработав год-другой на си (и потыкавшись в несколько прежних "серебряных пуль"). Но они ж напрямую норовят лезть, и те вещи, который для сишника очевидны, относят к магии компилятора. Ровно так же нормальный вменяемый джавист, начинавший с более низкого уровня, отлично знает, что именно ему может в джаве прилететь, а тот, который кроме VM ничегоне нюхал - два слова не свяжет о том, какие у той же сборки мусора будут нюансы просто в силу архитектуры.

Раст ещё молод, чтобы это было с ним на практике видно, но у нас уже есть PHP, Python, Javascript и Java - там очень наглядно, что используемый язык на количество ошибок влияет очень слабо.

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

Ответить | Правка | Наверх | Cообщить модератору

70. "Локальная root-уязвимость в подсистеме inotify ядра Linux"  +6 +/
Сообщение от Orduemail (ok), 05-Авг-17, 22:37 
> Смогли бы... Если пришли к расту, предварительно изучив ассемблер и поработав год-другой
> на си (и потыкавшись в несколько прежних "серебряных пуль"). Но они
> ж напрямую норовят лезть, и те вещи, который для сишника очевидны,
> относят к магии компилятора.

Я не могу говорить определённо в силу отсутствия фактов -- раст действительно молодой язык, -- но всё же мне кажется, что растового понимания указателей, ссылок и памяти вполне достаточно для того, чтобы реально понимать происходящее. В том смысле, что можно изучать как это всё работает, кувыркаясь с C и заглядывая в асм код, и создать в своей голове понимание достойное какого-нибудь там Линуса Торвальдса, а можно достигнуть того же самого, заменив C на rust.

Rust реально очень недалеко ушёл от C в том смысле, что именно он делает за программиста. Он далеко ушёл в объёмах того, что он _не_позволяет_ делать программисту. Правда это с моей точки зрения, то есть с точки зрения человека, который многие вещи давным давно считает самоочевидными и не заслуживающими внимания. Эти вещи при этом могут быть неочевидными и требующими весьма пристального внимания в процессе обучения.

> прежних "серебряных пуль"

Мне не очень нравится сравнение rust'а с серебряной пулей. Мне он больше напоминает серебряную очередь из пулемёта. В том смысле, что там нельзя выделать какую-то одну идею, которая может претендовать на роль серебряной пули, там очень много чего есть, начиная естественно с системы типов, продолжая, например, типами Result и Carrier для структурной обработки ошибок, и заканчивая тем как организован процесс исследования путей дальнейшего развития rust'а, разработка rust'а и его документирование. Не последнюю роль играет и пакетный менагер при rust: одна из вещей, которую людям приходящим из C/C++ приходится менять в своей голове, для того чтобы освоить rust -- это отношение к депендансам. В C/C++ принято всё писать вручную, подключая дополнительные библиотеки только тогда, когда это сэкономит больше недели напряжённого кодинга, иначе овчинка выделки не стоит. В rust'е я могу засунуть в депендансы пакет содержащий один макрос, который я бы сам написал за час-два, и нисколько не париться на этот счёт. Излишняя увлечённость тем, чтобы писать максимум своими руками, тоже ведёт к повышению количества ошибок.

> Раст ещё молод, чтобы это было с ним на практике видно, но
> у нас уже есть PHP, Python, Javascript и Java - там
> очень наглядно, что используемый язык на количество ошибок влияет очень слабо.

Я не уверен, что такое сравнение имеет смысл, без глубокой рефлексии на предмет того, чего пытались достичь, отливая ту или иную серебряную пулю, что они получили на самом деле и что было упущено, какие ошибки были совершены, что пуля оказалась не серебряной.
Да, все предыдущие попытки сделать более безопасный язык оказались провальными, из чего напрашивается сделать вывод по индукции, что и все будущие ошибки кончат тем же. Но из этого напрашивается ещё один вывод: не стоит даже заморачиваться разрабатывать новые языки, ни в практическом плане, ни в теоретическом. А это уже пахнет для меня махровым консерватизмом и всепроникающей духовностью. И я вижу единственный способ примирить логику с обонянием: считать что индукция в данном случае -- неверный способ рассуждений. В конце-концов, индукция стопроцентов работает только в математике, в виде матиндукции. Даже в физике, которая ближе всего остального к математике, индукция работает не всегда, и иногда выясняется, что уже открытые законы физики надо исправлять. Нассим Талеб даже своего Чёрного Лебедя написал специально для того, чтобы обозначить проблему. Поэтому я не вижу ничего плохого в том, чтобы иногда положить на индукцию с прибором.

А если я кладу на индукцию с прибором, то rust -- это лучший сегодняшний кандидат на создание безопасной замены для C. Более того, я ужасно раздасадован самонадеянными разработчиками D, которые свой язык назвали этой самой буквой. Потому что если глянуть на последовательность
B -> C -> C++ -> ???,
то rust отлично вписывается на роль того, кого надо было бы поставить следом за C++, если рассмотреть C++ как процесс выполнения инкремента. Но эти любители высокоуровневого кодинга всё испортили. С другой стороны ржавчина, корродирующая мозги людей так, что вылезает наружу и начинает корродировать[1] всё остальное, вплоть до ls[2], тоже довольно метафорична. Меня это тоже заразило, я тоже сижу и переписываю избранную мною C'шную программу на rust -- это настолько fun, что меня даже не волнует бессмысленность этого процесса и ненужность программы.

[1] https://github.com/jameysharp/corrode
[2] https://the.exa.website/

Ответить | Правка | Наверх | Cообщить модератору

91. "Локальная root-уязвимость в подсистеме inotify ядра Linux"  –1 +/
Сообщение от pripolz (?), 11-Авг-17, 17:20 
> считать что индукция в данном случае -- неверный способ рассуждений

Тут верный способ рассуждений такой: а кому ВЫГОДНО вкладываться в развитие Rust/Go/D ?

Приведу пример: MS Visual Studio принципиально не поддерживает стандарт C11 до сих пор.

Ответить | Правка | Наверх | Cообщить модератору

92. "Локальная root-уязвимость в подсистеме inotify ядра Linux"  +/
Сообщение от Orduemail (ok), 11-Авг-17, 19:46 
> Тут верный способ рассуждений такой: а кому ВЫГОДНО вкладываться в развитие Rust/Go/D ?

Не совсем так. Выгодно всем, кто хоть немного в теме. Вопрос в том, кто вкладывается.

> Приведу пример: MS Visual Studio принципиально не поддерживает стандарт C11 до сих
> пор.

А майкрософтовский C++ компилятор ещё жив? Ну, в смысле, есть gcc, есть llvm, зачем кому-нибудь может быть нужен майкрософтовский компилятор? Если нужен MSVS, то проще ведь воткнуть llvm в MSVS и не париться на этот счёт больше никогда. То есть, я не в курсе на самом деле, писать какой-либо код под венду я не пытался очень давно и очень давно не интересовался как это надо делать. Может быть там все давно перешли писать на паскале, а я и не заметил.

Вообще же это майкрософт в её стиле. Если MS занимается поддержкой какой-нибудь не своей технологии, то исключительно с целью перетянуть одеяло на себя. С C++ им особо ничего не светит в их понимании света. Поэтому они не будут заморачиваться поддерживать какие-то там стандарты C++. MS никогда особо с C++ не дружила: win32api наваян на C, а не на C++. Они потом пытались MFC протолкнуть, но это был один из самых неудачных их экспериментов, на мой взгляд, там даже маркетинг не особо помог, и они переключились на .NET и C#.

Если же попытаться предсказывать будущее... У меня чай так себе (я чёт последнее время расслабился, и меня жаба душит покупать действительно хороший чай) я не уверен, что принцессе нури можно доверять. Но её чаинки говорят... Ща, очки одену... Да, они говорят, что MS ещё несколько лет понаблюдает за тем, что сегодня творится с языками программирования, выберет те перки, которые ей понравятся и выкатит либо новый язык для .NET, либо даже объявит .NET устаревшим и выкатит совершенно новый стек технологий, и скажет, что это самая распоследняя и наисовременнейшая технология, которой нет аналогов в мировом производстве.

Ответить | Правка | Наверх | Cообщить модератору

50. "Локальная root-уязвимость в подсистеме inotify ядра Linux"  +/
Сообщение от eganru (?), 05-Авг-17, 15:05 
[i]чисто механически, следуя определённым правилам программирования, типа "не использовать unsafe"[/i] - не могу осознать, каким образом unsafe связан c состоянием гонки в данном случае?
я не знаю rust и интересно, каким образом он помогает избегать состояний гонки.
Ответить | Правка | К родителю #41 | Наверх | Cообщить модератору

54. "Локальная root-уязвимость в подсистеме inotify ядра Linux"  +1 +/
Сообщение от pda (?), 05-Авг-17, 16:03 
Rust не позволить написать код, который одложит указатель в событие inotigy и одновременно даст другому куску кода владеть им с правом на запись.
Ответить | Правка | Наверх | Cообщить модератору

55. "Локальная root-уязвимость в подсистеме inotify ядра Linux"  +2 +/
Сообщение от Orduemail (ok), 05-Авг-17, 17:06 
> [i]чисто механически, следуя определённым правилам программирования, типа "не использовать
> unsafe"[/i] - не могу осознать, каким образом unsafe связан c состоянием
> гонки в данном случае?
> я не знаю rust и интересно, каким образом он помогает избегать состояний
> гонки.

Я сейчас потратил полчаса пытаясь изобрести краткое объяснение. Мне не удалось это. Там вся магия сокрыта в системе типов с лайфтаймами и borrowing'е, и мне кажется, что единственный способ понять как это работает -- это взять и попытаться создать race condition в rust'е. Если потратить несколько дней на борьбу с borrow checker'ом, пробуя объехать его на кривой козе и так, и эдак, то в голове начинает зарождаться понимание, почему race condition невозможен. Если потратить ещё месяц на то, чтобы читать статьи и чужой код, то можно понять как, несмотря на всё это, возможно писать какой-нибудь рабочий и полезный код. Но так или иначе, чтобы понять как это работает, надо рассмотреть десяток примеров с потенциальным race condition, разбирая каждый на предмет "а если попытаться так, то ничего не получиться потому-то и потому-то", и завершая это сентенцией типа "таким образом у нас есть такие-то пути справится с проблемой, этот лучше в таких-то ситуациях, а этот в таких-то".

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

struct Dummy {
    a: u32,
    b: u32,
}

Допустим я хочу чтобы для этой структуры всегда выполнялся бы какой-нибудь инвариант, например, a = 2*b.

Допустим, я напишу функцию:

fn double_this_dummy(dummy: &mut Dummy) {
    dummy.a *= 2;
    dummy.b *= 2;
}

Инвариант сохраняется. Можно предположить, что параллельный поток в это время изменит именно этот объект, вот ровно между удвоением a и b он возьмёт и уменьшит a на 3 и b на 6. Тогда инвариант будет нарушен. Но rust не позволит мне создать две mutable ссылки на этот объект, поэтому если внутри этой функции у меня есть ссылка на dummy, то у параллельного потока её не будет. А значит никакого race condition'а не случится.

Если мы попытаемся таки создать две mutable ссылки на один и тот же объект, так чтобы одна была в одном потоке, а другая в другом, то это выльется в долгий сеанс переругивания с borrow-checker'ом, и кончится либо использованием unsafe кода, либо осознанием своей глупости и нахождением safe пути достичь наших целей. Сложно объяснить как это происходит -- это надо испытать на себе.

Ответить | Правка | К родителю #50 | Наверх | Cообщить модератору

60. "Локальная root-уязвимость в подсистеме inotify ядра Linux"  +/
Сообщение от egan_ru (?), 05-Авг-17, 18:05 
спасибо. в общих чертах понял.
Ответить | Правка | Наверх | Cообщить модератору

94. "Локальная root-уязвимость в подсистеме inotify ядра Linux"  –1 +/
Сообщение от Аноним (-), 15-Авг-17, 12:33 
Это все простейшие примеры. А логические гонки, когда, например (первое что пришло, сильно надуманно, но думаю степень можно опять), мы сохраняем на диск, а второй поток начинает читать от туда, но первый ещё не досохранял. Такое вот rust никак не отследит.

А то что у вас, это просто переменная в памяти, которая в двух потоках трогается. Такое "ещё в школе проходят", хотя не спорю, случайно где-нибудь наступить можно.

Ответить | Правка | К родителю #55 | Наверх | Cообщить модератору

95. "Локальная root-уязвимость в подсистеме inotify ядра Linux"  +/
Сообщение от Аноним (-), 15-Авг-17, 12:35 
> Это все простейшие примеры. А логические гонки, когда, например (первое что пришло,
> сильно надуманно, но думаю степень можно опять), мы сохраняем на диск,
> а второй поток начинает читать от туда, но первый ещё не
> досохранял. Такое вот rust никак не отследит.
> А то что у вас, это просто переменная в памяти, которая в
> двух потоках трогается. Такое "ещё в школе проходят", хотя не спорю,
> случайно где-нибудь наступить можно.

При всём при этом, возникает вопрос, придется ли мучится, если реально логикой эти потоки разделены, то есть одновременное выполнение кода не возможно, потому что второй поток уснул в ожидание. Я так понял, rust за такое будет пинать

Ответить | Правка | Наверх | Cообщить модератору

97. "Локальная root-уязвимость в подсистеме inotify ядра Linux"  +1 +/
Сообщение от Orduemail (ok), 15-Авг-17, 19:29 
>[оверквотинг удален]
>> сильно надуманно, но думаю степень можно опять), мы сохраняем на диск,
>> а второй поток начинает читать от туда, но первый ещё не
>> досохранял. Такое вот rust никак не отследит.
>> А то что у вас, это просто переменная в памяти, которая в
>> двух потоках трогается. Такое "ещё в школе проходят", хотя не спорю,
>> случайно где-нибудь наступить можно.
> При всём при этом, возникает вопрос, придется ли мучится, если реально логикой
> эти потоки разделены, то есть одновременное выполнение кода не возможно, потому
> что второй поток уснул в ожидание. Я так понял, rust за
> такое будет пинать

На такие случаи есть RefCell. RefCell сам по себе immutable объект (а значит можно одновременно иметь много ссылок на него), но если его попросить, то он выдаст mutable ссылку на содержащийся в нём объект. При этом он выполнит в рантайме проверки того, что в любой момент времени существует только одна mutable ссылка на объект. По сути, этот RefCell -- это те же проверки, которые выполняет компилятор, отличие в том, что они выполняются в рантайме, а не во время компиляции. Если логические допущения о том, что одновременное выполнение кода невозможно, окажутся неверными, то поток вывалится в панику.

Ответить | Правка | Наверх | Cообщить модератору

96. "Локальная root-уязвимость в подсистеме inotify ядра Linux"  +1 +/
Сообщение от Orduemail (ok), 15-Авг-17, 19:24 
> Это все простейшие примеры. А логические гонки, когда, например (первое что пришло,
> сильно надуманно, но думаю степень можно опять), мы сохраняем на диск,
> а второй поток начинает читать от туда, но первый ещё не
> досохранял. Такое вот rust никак не отследит.

Чем эта гонка "логическая"? Чтобы читать в или писать из File нужна mutable ссылка на этот File. Но rust запрещает иметь две mutable ссылки. В зависимости от того, каким образом вы попытаетесь создать две такие ссылки в разных потоках, вы получите либо ошибку компиляции, либо падение одного из потока в панику в описываемой ситуации, либо блокирование одного потока до завершения операции в другом.

Другое дело, что потоки могут независимо придти к выводу, что файл надо открыть и что-то с ним сделать, и у них будет два разных объекта File. И да, от этого rust не защитит. Но в этом случае, race происходит _вне_ rust'а. Здесь же речь идёт о _memory_ safety.

> А то что у вас, это просто переменная в памяти, которая в
> двух потоках трогается. Такое "ещё в школе проходят", хотя не спорю,
> случайно где-нибудь наступить можно.

Да, проходят в школе. И здесь я изложил самые-самые азы и то не полностью. О чём я кстати даже предупредил. Совершенно не удивительно, что тот единственный пример, который я привёл, оказался таким, который "проходят в школе". Или вы всё же полагаете, что мне следовало написать здесь целую книгу, сопроводив её десятком искусственных примеров, и несколькими десятками реальных, надёрганных из разных проектов на github'е?

Ответить | Правка | К родителю #94 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру