| | 1.1, Crazy Alex (ok), 09:15, 07/06/2018  [ответить] [﹢﹢﹢] [ · · · ] | +4 +/– |  |  Что-то ни в этой, ни в предыдущей новости не видать ни оценок падения производительности, ни ссылок на таковые. Вроде там не много совсем, но, во-первых, это только одна из "фишек для безопасности" (а сколько в сумме - ещё вопрос), во-вторых - "вроде" - это какая-то не слишком точная оценка. 
 |  |  | 
 
|  | | 2.6, Нанобот (ok), 11:04, 07/06/2018 [^] [^^] [^^^] [ответить] | +/– |  |  ну, это же openbsd... между безопасностью и производительностью они выбирают безопасность (в разумных пределах,я надеюсь) 
 |  |  | 
 | 2.7, A.Stahl (ok), 11:19, 07/06/2018 [^] [^^] [^^^] [ответить] | –3 +/– |  |  А кому это важно? Это как потребление топлива болидами Формулы 1: вроде бы и важно, но по факту всех интресует лишь сколько прёт. Так и БСД: просто полигон для экспериментов. 
 |  |  | 
 |  | | 3.12, Аноним (-), 15:38, 07/06/2018 [^] [^^] [^^^] [ответить] | +7 +/– |  | >по факту всех интресует лишь сколько прёт Ты эту Формулу-1 хоть раз смотрел? Там трассы не настолько прямые, как твои извилины, чтобы всех "интересовало лишь сколько прёт". 
 Так и тут. OpenBSD - инструмент, и важно знать его сильные и слабые стороны.
 |  |  | 
 | 3.21, бедный буратино (ok), 07:00, 08/06/2018 [^] [^^] [^^^] [ответить] | +1 +/– |  |  > Это как потребление топлива болидами Формулы 1 вааще-то это самый важный параметр - не больше 100 кг, а дальше крутись, как хошь - делай, какой хошь (в рамках регламента) двигатель, лишь бы в 100 кг укладывался
 |  |  | 
 | 
 | 2.11, Аноним (-), 15:23, 07/06/2018 [^] [^^] [^^^] [ответить] | +2 +/– |  | Вы, должно быть, троллите: о каком падении производительности может идти речь, когда после входа и перед выходом из функции добавляется по паре машинных инструкций? Это сложность возрастает на константу. 
 |  |  | 
 |  | | 3.15, имя (?), 19:45, 07/06/2018 [^] [^^] [^^^] [ответить] | +1 +/– |  | >  Вы, должно быть, троллите: о каком падении производительности может идти речь, когда после входа и перед выходом из функции добавляется по паре машинных инструкций? Это сложность возрастает на константу.  Вы, должно быть, троллите: о каком возрастании на константу может идти речь в, например, цикле с read()?
 |  |  | 
 |  | | 4.39, Анонимный Аноним (?), 17:55, 10/06/2018 [^] [^^] [^^^] [ответить] | +/– |  | в каждую функцию добавляются следующие инструкции:     mov r11, [cookie]
xor r11, [rsp]
 ...
 xor r11, [rsp]
 cmp r11, [cookie]
 jeq 2
 int 3
 int 3
 ret
 В случае с циклическим чтением, это добавит около 5 "лишних", но быстрых машинных инструкций. Грубо говоря 5 тактов, если считать, как считали для 80486. Сейчас это намного быстрее
 |  |  | 
 | 
 | 
 | 2.25, PereresusNeVlezaetBuggy (ok), 09:28, 08/06/2018 [^] [^^] [^^^] [ответить] | +/– |  |  > Что-то ни в этой, ни в предыдущей новости не видать ни оценок > падения производительности, ни ссылок на таковые. Вроде там не много совсем,
 > но, во-первых, это только одна из "фишек для безопасности" (а сколько
 > в сумме - ещё вопрос), во-вторых - "вроде" - это какая-то
 > не слишком точная оценка.
 В ближайшее время, думаю, тов. Мортимер выступит где-нибудь с докладом на эту тему. Предыдущая версия того, что было закоммичено, имела потери в рантайме примерно 2%, плюс ещё примерно 4% на запуск. Компиляция тормозилась примерно на 5%.
 |  |  | 
 | 2.26, bOOster (ok), 09:33, 08/06/2018 [^] [^^] [^^^] [ответить] | +/– |  |  Видимо на 1С или Perl или и иже с ними программер? знаешь что такое в ассемблере ТАКТОВ на инструкцию? Так вот сложи, в худшем случае тактов на пихание SALT в стек, в лучшем передача SALT в функци. через регистры, ну и тактов на инструкцию XOR при выходе. 
 |  |  | 
 |  | | 3.35, КО (?), 07:54, 09/06/2018 [^] [^^] [^^^] [ответить] | +/– |  | > Так вот сложи, в худшем случае тактов на пихание SALT в стек, в лучшем передача SALT в функци. через регистры  Самое забавное, что описываемые Вами действия нужны только для атаки на алгоритм защиты. Ибо по условиям атаки, атакующий может писать в стек (и регистры), но не может создавать страницы с кодом. Таким образом он может подделать и адрес возврата и число по которому надо ксорить (например 0).
А просто два ксора адреса возврата по константе (которую бы неплохо инициализировать при загрузки библиотеки в память) это сущие копейки. Ибо на современном этапе главные тормоза - это лишние обращения в память (промахи в кеше).
 
 |  |  | 
 |  | | 4.38, Анонимный Аноним (?), 17:54, 10/06/2018 [^] [^^] [^^^] [ответить] | +/– |  | Он может изменить код только в новых страницах. Загруженные из файла страницы кода не модифицируемы. Эта защита была еще лет 15-20 назад 
 |  |  | 
 | 
 | 
 | 
 
 | 1.3, Аноним (-), 09:41, 07/06/2018  [ответить] [﹢﹢﹢] [ · · · ] | +/– |  | В новости не разъяснено, генерируется ли cookie на этапе компиляции или во время исполнения. И если во время исполнения, то используется ли безопасный ГПСЧ. И если используется, то насколько падает производительность. 
 |  |  | 
 
|  | | 2.4, Аноним (-), 09:48, 07/06/2018 [^] [^^] [^^^] [ответить] | +/– |  | На этапе компиляции конечно. Генерация на лету была бы излишним усложнением и замедлением. Представляйте сколько нужно выполнить кода для генерации псевдослучайного числа? 
 |  |  | 
 |  | | 3.5, Аноним (-), 10:12, 07/06/2018 [^] [^^] [^^^] [ответить] | +/– |  | Там в каком то примере просто использовалось значение esp/rsp (оно для эксплоита не известно, вычисляется в процессе выполнения) 
 |  |  | 
 | 3.9, Аноним (-), 13:36, 07/06/2018 [^] [^^] [^^^] [ответить] | +/– |  | Ну в таком случае что мёртвому припарка, только вредная: оверхед то даёт. Атакующий просто вытащит из метода захардкоденный cookie и положит на стэк. 
 |  |  | 
 |  | | 4.10, Аноним84701 (ok), 14:40, 07/06/2018 [^] [^^] [^^^] [ответить] | +/– |  |  > Атакующий просто вытащит из метода захардкоденный cookie и положит на стэк. Однако, чтобы "просто" вытащить и "просто" положить на стек для успешного RЕТа, нужно таки выполнить свой код. А для этого (по крайней мере, в сценариях, для которых и задумывался RETGUARD) придется успешно "РЕТнуть".
 |  |  | 
 |  | | 5.16, Sw00p aka Jerom (?), 01:47, 08/06/2018 [^] [^^] [^^^] [ответить] | +/– |  | Во-первых, должно быть наличие баги (да, да - вот вам и успешный РЕТ), во-вторых, РОП для того и придуман, чтобы обходить ограничения не исполняемых (ридонли) сегментов памяти (стек, в случае его переполнения), строится цепочка стек фреймов (РОП геджетов) и происходит эксплуатация. |  |  | 
 |  | | 6.20, Аноним84701 (ok), 03:12, 08/06/2018 [^] [^^] [^^^] [ответить] | +/– |  |  > Во-первых, должно быть наличие баги (да, да - вот вам и успешный РЕТ), > во-вторых, РОП для того и придуман, чтобы обходить ограничения не исполняемых (ридонли) сегментов памяти (стек, в случае его переполнения), строится цепочка стек фреймов (РОП геджетов) и происходит эксплуатация.
 Это те же кексы,  вид сбоку (+ индивидуальные для каждой функции). Т.е. и защита как раз от таких багов, при которых перезаписывается адрес возврата. Для того, чтобы (в первый раз) успешно RETнуть, нужно не просто перезаписать RET адрес своим, но и угадать, с каким значением его нужно  поXORить, причем конкретно для этого вот блока кода. 
Ну и снижение общего количества возможных гаджетов тоже, как пишут, есть.
 Если бага из другой разновидности, типа "call/jmp [foo_replaced_addr]", то и обходить сабж, как бы, не нужно.
Ваш Кэп.
 |  |  | 
 |  | | 7.32, Sw00p aka Jerom (?), 16:04, 08/06/2018 [^] [^^] [^^^] [ответить] | +/– |  | Так суть механизма RETGUARD, не от закрытия каких-то багов, а от предотвращения дальнейшей эксплуатации бага (того же переполнения стека). А так если даже предотвращается эксплуатация, но никак не защитит от DOS и приведёт в любом случае к падению приложения. Если имеется возможность как-то получить результат ксора, то легко можно вычислить ту самую куку, которая непонятно когда вычисляется (формируется) на этапе компиляции или в рантайме, одна ли она для всех ретурнов или разная, и внизу в коментах задали наводящий вопрос - а как валидируется потом реальный адресс возврата (хотя его валидация не важна, приложение будет падать при "хер пойми ретурн адресе", а что когда он неожиданно укажет на валидное место?). Доказано - РОП идеальный механизм, которому нужно противодействовать только, как я думаю, попыткой переосмысления всей Фоннеймановской архитектуры, как минимум вынести хранения адресов возврата из стека куда нить в другое место :) 
 |  |  | 
 | 
 | 
 | 5.17, Аноним (-), 01:49, 08/06/2018 [^] [^^] [^^^] [ответить] | +/– |  | Если значение захардкодено, то вытащить из скачанного пакета не проблема. >положить на стек для успешного RЕТа, нужно таки выполнить свой код.
 чтобы работало rop, нужно положить на стек. а это типа митигация от ропа.
 |  |  | 
 |  | | 6.19, Sw00p aka Jerom (?), 01:58, 08/06/2018 [^] [^^] [^^^] [ответить] | +1 +/– |  | > чтобы работало rop, нужно положить на стек. а это типа митигация от > ропа.
 так уже всё в стеке при наличие баги о чём речь? роп - техника обхода так называемого не исполняемого стека.
 
 |  |  | 
 | 
 | 
 | 
 | 3.13, КО (?), 17:06, 07/06/2018 [^] [^^] [^^^] [ответить] | +/– |  | >На этапе компиляции конечно. Генерация на лету была бы излишним усложнением и замедлением. Да ладно - вон адреса при загрузки в память меняют, так что еще одну константу рандомизировать ...
 Другое дело глупо как-то описано. Для атакующего положить в стек рядом с адресом возврата нули - ксорь по ним не ошибешься дело плевое. Кука должна быть в недоступной для атакующего памяти.
 |  |  | 
 | 
 | 2.22, PereresusNeVlezaetBuggy (ok), 09:19, 08/06/2018 [^] [^^] [^^^] [ответить] | +1 +/– |  |  > В новости не разъяснено, генерируется ли cookie на этапе компиляции или во > время исполнения. И если во время исполнения, то используется ли безопасный
 > ГПСЧ.
 Во время исполнения. При загрузке программы для каждой функции генерируется персональная кука. С ГПСЧ у OpenBSD всё давно хорошо: https://www.openbsd.org/papers/hackfest2014-arc4random/index.html
 > И если используется, то насколько падает производительность.
 Сборка базовой системы на предпоследней версии патча замедлялась примерно на 11% (результаты авторские, не мои), из них:
 2% рантайм (то, что всем интересно)
4% запуск (из-за нагрузки на ГПСЧ)
 5% компиляция + всё остальное
 Тод Мортимер (основной автор) обещал попробовать ещё что-то подкрутить, подробностей пока нет.
 |  |  | 
 |  | |  | | 4.30, PereresusNeVlezaetBuggy (ok), 11:40, 08/06/2018 [^] [^^] [^^^] [ответить] | +/– |  |  > Ну вот. Существенно хуже, чем я ожидал, кстати. SSP обычная на момент внедрения отъедала около 5% в рантайме (правда, SSP, в отличие от retguard, используется не для всех функций), так что могло быть и хуже. :)
 |  |  | 
 | 
 | 
 | 
 
 
 | 1.14, Аноним (-), 17:32, 07/06/2018  [ответить] [﹢﹢﹢] [ · · · ] | +/– |  | Я первый раз слышу про RETGUARD. Читая вот это: > Суть метода защиты RETGUARD заключается в искажении адреса возврата обработчиков функций. Перед началом обработчика функции добавляется вызов XOR, комбинирующий адрес возврата с генерируемым для каждой функции случайным значением Cookie, которое затем сохраняется в стек. Перед командой возврата управления из функции (ret) значение Cookie извлекается из стека и при помощи операции XOR повторно применяется к адресу возврата, что восстанавливает его исходное значение и позволяет убедиться в том, что адрес перехода не изменился. Для усложнения атак код проверки дополнительно снабжается добавочным заполнением в виде инструкций int03 перед каждой инструкцией ret
 возникло несколько вопросов:
 вопрос №1: насколько сложно изменить значение cookie?
вопрос №2: как после второго XOR для восстановления происходит валидация неизменности адреса возврата?
 
 |  |  | 
 
|  | | 2.18, Sw00p aka Jerom (?), 01:52, 08/06/2018 [^] [^^] [^^^] [ответить] | +/– |  | > вопрос №2: как после второго XOR для восстановления происходит валидация неизменности > адреса возврата?
 а вот это никого не волнует)) если пихать в роп гаджетах разные адреса возвратов, то при ксоре получется адрес возврата "хер пойми куда" и произойдёт, что? сегфолт? а если по вероятности адрес после ксора укажет куда нужно, что тогда?
 добавлю ещё один вопрос - кука одна на один процесс? 
 
 |  |  | 
 |  | | 3.24, PereresusNeVlezaetBuggy (ok), 09:24, 08/06/2018 [^] [^^] [^^^] [ответить] | +/– |  |  >> вопрос №2: как после второго XOR для восстановления происходит валидация неизменности >> адреса возврата?
 > а вот это никого не волнует)) если пихать в роп гаджетах разные
 > адреса возвратов, то при ксоре получется адрес возврата "хер пойми куда"
 > и произойдёт, что? сегфолт? а если по вероятности адрес после ксора
 > укажет куда нужно, что тогда?
 Значит, не повезло. Retguard — не серебряная пуля; как и классическая SSP эта мера эффективна только вместе с другими, суммарно увеличивая сложность эскалации атаки на многие порядки.
 > добавлю ещё один вопрос - кука одна на один процесс?
 Одна на каждую функцию, генерится при запуске программы.
 |  |  | 
 | 
 | 2.23, PereresusNeVlezaetBuggy (ok), 09:22, 08/06/2018 [^] [^^] [^^^] [ответить] | +1 +/– |  |  > Я первый раз слышу про RETGUARD. Читая вот это: >> Суть метода защиты RETGUARD заключается в искажении адреса возврата обработчиков функций. Перед началом обработчика функции добавляется вызов XOR, комбинирующий адрес возврата с генерируемым для каждой функции случайным значением Cookie, которое затем сохраняется в стек. Перед командой возврата управления из функции (ret) значение Cookie извлекается из стека и при помощи операции XOR повторно применяется к адресу возврата, что восстанавливает его исходное значение и позволяет убедиться в том, что адрес перехода не изменился. Для усложнения атак код проверки дополнительно снабжается добавочным заполнением в виде инструкций int03 перед каждой инструкцией ret
 > возникло несколько вопросов:
 > вопрос №1: насколько сложно изменить значение cookie?
 Она живёт в read-only памяти.
 > вопрос №2: как после второго XOR для восстановления происходит валидация неизменности 
> адреса возврата?
 Естественным путём: если в результате XOR получилась фигня, то мы и улетим в результате ret фиг знает куда. При широком (64-битном) адресном пространстве это практически наверняка будет не туда, куда хотел атакующий.
 |  |  | 
 |  | | 3.36, КО (?), 16:39, 09/06/2018 [^] [^^] [^^^] [ответить] | +/– |  | >значением Cookie, которое затем сохраняется в стек. >>Она живёт в read-only памяти.
 ну, пожалуй, read-only stack _действительно_ защитит от возвратного программирования, но при таком подходе печенки излишни. :)
 |  |  | 
 |  | | 4.37, PereresusNeVlezaetBuggy (ok), 15:14, 10/06/2018 [^] [^^] [^^^] [ответить] | +/– |  |  >>значением Cookie, которое затем сохраняется в стек. >>>Она живёт в read-only памяти.
 > ну, пожалуй, read-only stack _действительно_ защитит от возвратного программирования,
 > но при таком подходе печенки излишни. :)
 А кто сказал, что эта кука лежит на стеке? Она лежит в памяти по некоему ASLR-нотому адресу. Чтобы утащить куку, да ещё от нужной функции, нужно сделать то, для чего и нужно утащить куку, причём не обрушив программу — при следующем запуске процесса куки будут уже другие. Это не обычный SSP, где куку можно утащить со стека простым чтением за границами буфера.
 |  |  | 
 | 
 | 
 | 
 
 |