The OpenNET Project / Index page

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



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

Оглавление

Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять свои привилегии в системе, opennews (??), 12-Апр-23, (0) [смотреть все]

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


5. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от marten (ok), 12-Апр-23, 14:08 
И опять use-after-free...
Ответить | Правка | Наверх | Cообщить модератору

6. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (10), 12-Апр-23, 14:10 
...ваши предложения?
Ответить | Правка | Наверх | Cообщить модератору

19. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Rock (?), 12-Апр-23, 14:47 
> ...ваши предложения?

Очевидно же -- free должна портить память. Либо скорость, либо безопасность.

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

66. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (18), 12-Апр-23, 16:40 
> Либо скорость, либо безопасность

насколько это:

    free(ptr);

быстрее, чем это:

    free(ptr);
    ptr = NULL;

?

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

67. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +2 +/
Сообщение от Аноним (67), 12-Апр-23, 16:52 
Незаметно.
Удивительно, что дизайнеры C/POSIX API не сделали так, чтобы этот NULL возвращала функция free() после успешного освобождения.
ptr = free(ptr);
Ответить | Правка | Наверх | Cообщить модератору

76. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +1 +/
Сообщение от Аноним (18), 12-Апр-23, 17:13 
ты можешь написать макрос, который будет вызывать free() и обнулять переменную. Вызывать так: clear(ptr). Оставлю тебе на дом, каким должен быть #define clear.
Ответить | Правка | Наверх | Cообщить модератору

79. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +1 +/
Сообщение от InuYasha (??), 12-Апр-23, 17:37 
Вот, только каждый программист напишет своих подобных костылей с разными названиями и поведением - и сиди, сходи с ума, изучая всё это. Хотя, даже позикс иногда объявляется устаревшим - что уж там...
PS: только не макрос лучше, а инлайн, наверное.
Ответить | Правка | Наверх | Cообщить модератору

84. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (18), 12-Апр-23, 17:54 
это лучше, чем заставлять free возвращать что-то там, хотя на самом деле ему возвращать особо нечего. Незачем городить дополнительные машинные коды ради какого-то призрачного удобства при разработке. Если нужно удобство, пили макросы.
Ответить | Правка | Наверх | Cообщить модератору

98. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  –1 +/
Сообщение от InuYasha (??), 12-Апр-23, 18:55 
По мне - так любая функция должна возвращать если не HRESULT, то хоть bool success. Ну, не glVertex3f, конечно, где прям за каждый такт трясёшься. (да, я знаю! это просто пример!)
Ответить | Правка | Наверх | Cообщить модератору

99. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от InuYasha (??), 12-Апр-23, 18:56 
И, да, я знаю про try - throw - catch, но оно дико стрёмное.
Ответить | Правка | Наверх | Cообщить модератору

157. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (157), 14-Апр-23, 09:14 
> И, да, я знаю про try - throw - catch, но оно > дико стрёмное.

В сях вообще нет этих понятий. Да и вон то далеко не везде катит.

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

123. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от n00by (ok), 13-Апр-23, 07:27 
> Удивительно, что дизайнеры C/POSIX API не сделали так, чтобы этот NULL возвращала
> функция free() после успешного освобождения.
> ptr = free(ptr);

А в случае неуспешного освобождения что будет возвращать free()?

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

131. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (-), 13-Апр-23, 09:14 
Неуспешное освобождение памяти - это что?! Как на чисто логическом уровне это могло бы выгдядеть вообще? Потому что в free() такой вариант не присутствует. См man 3 free.

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

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

140. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от n00by (ok), 13-Апр-23, 10:10 
> Неуспешное освобождение памяти - это что?!

Это ситуация, обратная успешному освобождению. См №67, на которое я отвечал.

> Как на чисто логическом уровне это
> могло бы выгдядеть вообще? Потому что в free() такой вариант не
> присутствует. См man 3 free.

ISO/IEC 9899:2017

7.22.3.3 The free function

2 ... if the argument does
not match a pointer earlier returned by a memory management function, or if the space has been
deallocated by a call to free or realloc, the behavior is undefined.

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

И что возвращать в этом случае? Если NULL, тогда можно самому занулять указатель, как и предалали. Если не NULL, тогда рац.предожение теряет смысл. Потому и не вижу ничего удивительно в текущей реализации.

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

142. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (-), 13-Апр-23, 12:35 
> Это ситуация, обратная успешному освобождению. См №67, на которое я отвечал.

В вон том определении реализации функции просто нет места "call fails" - либо всегда success, либо UB. Если что, UB != call fails.

> deallocated by a call to free or realloc, the behavior is undefined.

Ну и как видите в этом (да, достаточно дурацком) определении не предусмотренно именно "fails". Вместо этого "хз что будет, ваша проблема". И вообще-то это пример того как апи делать не надо. Но в сях у комитета есть мерзкая привычка спихивать свои проблемы на других, чтобы не прописывать конкретику behavir. На мой вкус тут вопрос скорее к стандарту и апи самому по себе. Уж как минимум обязать free вешать null на указатель и чекать при входе в него что дали null и репортить жесткий usage error, вплоть до краха программы, было бы весьма логично (и не так уж дорого по ресурсам). Ядерщики кстати могли бы себе нечто такое и сделать - они стандартами си и тем более фичами libc не зажаты так то и у них много забавного кастома есть.

> И что возвращать в этом случае?

По уму это апи надо переделать, но мы повесимся из за слома совместимости.

> Если NULL, тогда можно самому занулять указатель, как и предалали.
> Если не NULL, тогда рац.предожение теряет смысл. Потому и не вижу ничего
> удивительно в текущей реализации.

Мне вообще вот это апи не особо нравится. Я бы вообще запретил комитетчикам использовать слово "undefined behavior". Ибо нефиг.

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

146. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от n00by (ok), 13-Апр-23, 13:17 
>> Это ситуация, обратная успешному освобождению. См №67, на которое я отвечал.
> В вон том определении реализации функции просто нет места "call fails" -
> либо всегда success, либо UB. Если что, UB != call fails.

"call fails" входит в множество UB.

Если что, я знаю, что ты любишь высказывать мнение по вопросам, в коих понимаешь мало.

Я уже просил тебя не тратить моё время и не мешать мне переписываться с другими Анонимами.

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

152. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (-), 13-Апр-23, 22:07 
> "call fails" входит в множество UB.

Call fails - как раз обычно well defined behavior, как именно проверить (не)успех операции при этом явно прописывается в документации. Как в манах линукса, on success... returns X, on failure... returns Y and sets errno to 123. И так далее. Для free() идентификация fail его вызова в стандарте не прописана, такого понятия для этой функции в стандарте просто нет.

Если не указана конкретика как проверить call failed, мы не можем узнать что он failed, и это понятие не имеет смысла. А если указано - тогда это уже "defined behavior", никак не UB. И в этом аспекте free() не имеет понятия "call failed" в определении интерфейса. Только некорректное использование, но это другое.

> Если что, я знаю, что ты любишь высказывать мнение по вопросам, в
> коих понимаешь мало.
> Я уже просил тебя не тратить моё время и не мешать мне
> переписываться с другими Анонимами.

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

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

156. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от n00by (ok), 14-Апр-23, 08:46 
>> "call fails" входит в множество UB.
> Call fails - как раз обычно well defined behavior

Я уже понял, что операции над множествами - не твоё.
Не требуется дальше убеждать меня в этом.

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

158. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (157), 14-Апр-23, 09:30 
А у вас проблемы с логическими операциями. Для меня выглядит так как будто это ЛИБО undefined behavior, ЛИБО, если понятие call fails определено, тогда рассказано как определить fail, и тогда это уже defined behavior. Вы, кажется, этого не поняли.

Defined behavior отличается от undefined как раз тем что конкретно расписано что и как происходит. Если это расписано для call fails - окей, это defined behavior, мы можем определить это в caller'е. А в вон том случае "call fails" просто не определен как сущность. Этого понятия не существует для этой функции, как минимум в стандарте.

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

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

159. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от n00by (ok), 14-Апр-23, 09:46 
> А у вас проблемы с логическими операциями.

Это не имеет отношения к UB и твоему непониманию, что такое UB.

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

161. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (157), 14-Апр-23, 11:27 
По-моему самое непосредственное отношение. Либо поведение определено (и подлежит документированию), либо нет. Это бинарная величина. Для free() не определено понятие фэйла при легитимном использовани, его просто нет. Если понятия нет, оно не может входить в какое либо множество.

При нормальном использовании в пределах спеков видимо считается что он всегда успешен, там нет места для fails в результатах вызова, стало быть это понятие просто не существует в этих абстракциях. Это скорее из категории "should never happen".

И на самом деле это как раз ключевая грабля стандартов на си и их стдлиб, там очень много чего недоопределено, определено неоднозначно или допускает UB. И за это временами тех господ из ISO хочется немножечко придушить.

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

163. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от n00by (ok), 14-Апр-23, 15:03 
3.4.3

1 undefined behavior

behavior, upon use of a nonportable or erroneous program construct or of erroneous data, for which
this International Standard imposes no requirements

поведение ... к которому не предъявляется (никаких) требований.

Т.е. может быть всё, что угодно. В том числе и "неуспешное освобождение".

2 Note 1 to entry: Possible undefined behavior ranges from ignoring the situation completely with unpredictable results,
***to behaving during translation or program execution in a documented manner*** characteristic of the environment (with or
without the issuance of a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic
message).

и разрешено документировать поведение, что как раз и оправдано в ядре.

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

166. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (166), 20-Апр-23, 23:58 
> Т.е. может быть всё, что угодно. В том числе и "неуспешное освобождение".

Для функции "free" в стандарте ничего не сказано про то что эта операция вообще может обломаться. С таким же успехом можно предположить что имелось в виду что это - "should never happen", а если все же happen это баг имплементации.

> 2 Note 1 to entry: Possible undefined behavior ranges from ignoring the
> situation completely with unpredictable results,

Маленький нюанс в том что в доке описывающей free() про UB вообще совсем ничего не упомянуто. То-есть не специфицировано что оно может обломаться и что при этом будет UB. Это вы сами от себя додумали. Откуда это следует я не знаю.

Как более жесткий пример: если я вызываю void something(void) - тут прямо на уровне прототипа прозрачный намек что оно не обламывается, и с таким прототипом как правило предполагается что оно всегда успешно - например, в чистой математике нечему обламываться. И в освобождении памяти в его изначальном понимании тоже: все ресурсы на этот момент уже выделены а новых выделять не надо.

> и разрешено документировать поведение, что как раз и оправдано в ядре.

Ну вот в ядре могли бы и сделать зануление указателей и жесткий завал если null на входе оказался. Там местами некая смежная активность есть, скажем они научились в зануление памяти при alloc/free оного (выбираемо для каждого из) - это тоже так то полезно для безопасности и утечек информации.

Может не особо парятся потому что кому сильно надо KASAN всякие использовали при пуске на этом syzbot и тому подобных штук.

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

167. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от n00by (ok), 21-Апр-23, 07:01 
>> Т.е. может быть всё, что угодно. В том числе и "неуспешное освобождение".
> Для функции "free" в стандарте ничего не сказано про то что эта
> операция вообще может обломаться.

Всё там сказано, читайте цитаты в моих сообщениях, начиная с №140. Или учитесь их понимать, если уже читали.

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

165. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Rock (?), 18-Апр-23, 20:17 
>> Либо скорость, либо безопасность
> насколько это:
>     free(ptr);
> быстрее, чем это:
>     free(ptr);
>     ptr = NULL;
> ?

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

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

20. Скрыто модератором  +1 +/
Сообщение от Анонимусс (?), 12-Апр-23, 14:49 
Ответить | Правка | К родителю #6 | Наверх | Cообщить модератору

21. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +1 +/
Сообщение от Аноним (21), 12-Апр-23, 14:51 
собирать мусор 30 минут, как в джаваскрипте
Ответить | Правка | К родителю #6 | Наверх | Cообщить модератору

102. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  –1 +/
Сообщение от Аноним (102), 12-Апр-23, 19:19 
В JS (V8,JavaScriptCore) довольно быстрый сборщик мусора - в отличие от сишного дидовского кода, где memory-leak-мусор по всей системе и убирать его не спешат.
Ответить | Правка | Наверх | Cообщить модератору

121. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (21), 13-Апр-23, 07:07 
джаваскрипт легендарен своей текущей jvm, учи матчасть
Ответить | Правка | Наверх | Cообщить модератору

132. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (-), 13-Апр-23, 09:18 
> В JS (V8,JavaScriptCore) довольно быстрый сборщик мусора -

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

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

37. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  –3 +/
Сообщение от FF (?), 12-Апр-23, 15:25 
да они не понимают, что такие ситуации можно отследить только контролем за каждой ссылкой, а значит затормаживанием операций, это же в многозадачной среде никакой канпилятор не отследит, т.к. они асинхронно работают, а за всеми проверками не уследишь.
Ответить | Правка | К родителю #6 | Наверх | Cообщить модератору

77. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +1 +/
Сообщение от Аноним (77), 12-Апр-23, 17:26 
Уже много раз повторялось - прикрутите вы нормальный менеджер памяти типа FastMM, который в FullDebugMode будет жутко тормозить, но зато показывать вообще все возможные косяки. А если будут програть наугад как сейчас, то так и будут вечно страдать от своих use-after-free.
Ответить | Правка | К родителю #6 | Наверх | Cообщить модератору

133. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (-), 13-Апр-23, 09:19 
> Уже много раз повторялось - прикрутите вы нормальный менеджер памяти типа FastMM,
> который в FullDebugMode будет жутко тормозить, но зато показывать вообще все
> возможные косяки. А если будут програть наугад как сейчас, то так
> и будут вечно страдать от своих use-after-free.

Для тех кто этого хотел уже давно есть KASAN. Enjoy your ride (if you can). Но простите, ядро станет именно тем что вы просили.

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

124. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от n00by (ok), 13-Апр-23, 07:35 
std::unique_prt<>

Но это породит новые проблемы, из-за использования двух языков. Потому Линус берёг хрупкий внутренний мир бородатых сишников.

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

71. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Иваня (?), 12-Апр-23, 16:58 
Не ной, сделай чекер, который будет находить такое и исправлять.
Ответить | Правка | К родителю #5 | Наверх | Cообщить модератору

74. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Аноним (74), 12-Апр-23, 17:04 
зачем чекер ? достаточно просто в chatGPT написать - сделай нам хорошо; и всё, делов то на пару минут.
Ответить | Правка | Наверх | Cообщить модератору

75. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от анон (?), 12-Апр-23, 17:06 
/fix
Опять дырявая x86.
Ответить | Правка | К родителю #5 | Наверх | Cообщить модератору

105. "Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять ..."  +/
Сообщение от Michael Shigorinemail (ok), 12-Апр-23, 20:11 
Ну кстати, -mptr128 на e2k рубит и use-after-free.
Ответить | Правка | Наверх | Cообщить модератору

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

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




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

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