The OpenNET Project / Index page

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

Проблемы с некорректной очисткой остаточных данных в клиенте Tor и OpenSSL

09.11.2012 09:54

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

Проблема связана с тем, что Tor использует для очистки кэша функцию memset(), которая игнорируется в результате работы оптимизаторов некоторых компиляторов, что может привести к появлению неочищенных областей памяти после закрытия приложения. Например, при выборе режима оптимизации на скорость (-O2) Microsoft Visual Studio 2010 просто удаляет вызов memset при обнулении данных, если буфер в дальнейшем не используется в коде.

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

  1. Главная ссылка к новости (http://www.viva64.com/ru/b/017...)
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/35275-tor
Ключевые слова: tor, security, compiler
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (74) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, аноним2 (?), 10:11, 09/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    > ...вместо размера буфера передаётся размер указателя на буфер...

    Веселые кодеры, блин. Банальнейший эпик-фейл.

     
     
  • 2.9, XoRe (ok), 13:12, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    >> ...вместо размера буфера передаётся размер указателя на буфер...
    > Веселые кодеры, блин. Банальнейший эпик-фейл.

    Да ладно, вопрос одного символа (*|&).

     
  • 2.13, Аноним (-), 13:31, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    на то он и банальный
     
  • 2.30, rshadow (ok), 15:57, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    <facepalm> тесты писать не?
     
     
  • 3.59, Аноним (-), 10:44, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > <facepalm> тесты писать не?

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

     
  • 3.69, ваноним (?), 13:49, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    тест содержал буфер из 4 байт? )
     

  • 1.2, Анонимус_б6 (?), 10:12, 09/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    чем сложнее системы, тем все более странные проблемы они вызывают и тем сложнее^3 их исследовать на предмет странностей
     
  • 1.3, 1 (??), 10:16, 09/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Не понял, о какой версии OpenSSL говорится ?
     
  • 1.4, Andrew Kolchoogin (?), 10:41, 09/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Мне вот только непонятна мысль автора статьи насчёт того, что "компилятор ВПРАВЕ удалить вызов memset(), если ... " -- это в каком стандарте на C написано, что компилятор чего-то там вправе УДАЛЯТЬ?

    Но всё равно и Tor, и OpenSSL поступают плохо. Надо, конечно, звать mlock(), потом затирать (плевать, чем -- нулями тоже сойдёт), а потом звать munlock().

     
     
  • 2.5, BratSinot (?), 11:49, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Мне вот только непонятна мысль автора статьи насчёт того, что "компилятор ВПРАВЕ удалить вызов memset(), если ... " -- это в каком стандарте на C написано, что компилятор чего-то там вправе УДАЛЯТЬ?

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

     
     
  • 3.6, Аноним (-), 12:27, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    То есть, игнорирование функции memset — это нормальное действие компилятора?! На мыло такие компиляторы!!!
     
     
  • 4.7, CssfPZS (ok), 12:43, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >Например, при выборе режима оптимизации на скорость (-O2) Microsoft Visual Studio 2010
    >просто удаляет вызов memset при обнулении данных, если буфер в дальнейшем не используется
    >в коде.

    Там же не про GCC написано =)
    А так все логично, говно компилятор от Microsoft Visual Studio 2010, под говно платформой
    дает говно результат.
    Как дуршлаг не латай, все равно дырявый, так что или безопасность или винда.

     
     
  • 5.22, kuku (?), 13:45, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    +1

    Мелкософт мог бы предупредить об этой "оптимизации"...
    Или вывести список таких "оптимизации".
    А так остаётся ответить, что это не адекватно со стороны
    "кого-то там" где-то там...

     
     
  • 6.33, Aaa (?), 17:42, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    ну вообще то gcc на этой теме тоже когда-то светился
     
     
  • 7.35, Aaa (?), 17:45, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    помнится кто-то даже выступал по этой теме и было предложено помечать такие функции как обязательные к исполнению и оптимизатор их не должен трогать, вот только сдвинулось ли с места - не знаю
     
  • 4.11, Аноним (-), 13:14, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    При включенной оптимизации - да. Если ты не хочешь чтобы компилятор компилировал именно то, что ты написал, тебе необходимо отключить оптимизацию.

    Твой кэп.

     
     
  • 5.15, Аноним (-), 13:33, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    наоборот, Кэп
     
     
  • 6.23, Аноним (-), 13:54, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    >>При включенной оптимизации - да. Если ты не хочешь чтобы компилятор компилировал именно то, что ты написал, тебе необходимо отключить оптимизацию.
    >>Твой кэп.
    >>наоборот, Кэп

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

     
     
  • 7.31, pavlinux (ok), 16:00, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    проверять надо возвращаемые значения. А прогах по безопасности еще и повторную проверку вставлять.
     
     
  • 8.32, Аноним (-), 16:56, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Всё правильно сказал, только как это связанно с предыдущими 4 комментариями ... текст свёрнут, показать
     
     
  • 9.34, pavlinux (ok), 17:42, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Мозг и софт надо оптимизировать И во-вторых, не все операционки, если не ска... текст свёрнут, показать
     
     
  • 10.37, Andrew Kolchoogin (?), 18:40, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Хм Общение между иерархией процессов родитель-потомок через anonymous shared ... текст свёрнут, показать
     
     
  • 11.39, pavlinux (ok), 19:01, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Google R Love, Linux Kernel Development ... текст свёрнут, показать
     
     
  • 12.42, Andrew Kolchoogin (?), 20:19, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    А-а-а-а-а, Линукс Ну, всё понятно, да ... текст свёрнут, показать
     
     
  • 13.43, pavlinux (ok), 20:21, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Извиняйте, VAX VMS internals не проходили --- Кстати, с внедрением FSCACHE, CL... текст свёрнут, показать
     
     
  • 14.46, Andrew Kolchoogin (?), 20:33, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Мне кажется, что ты путаешь поведение ядра и userland овских функций работы с ОЗ... текст свёрнут, показать
     
     
  • 15.50, pavlinux (ok), 20:47, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    юзерам низя работать с ОЗУ, им есть VM ... текст свёрнут, показать
     
     
  • 16.51, Andrew Kolchoogin (?), 20:54, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Можно mlock гарантирует это ... текст свёрнут, показать
     
     
  • 17.54, pavlinux (ok), 21:00, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Покаж как Хачу за маалокать, 2 байта на первом модуле, второго CPU ну вот апп... текст свёрнут, показать
     
  • 14.47, Andrew Kolchoogin (?), 20:34, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Впрочем, как я заметил, с точностью до рескедулинга То есть, без mlock а таки... текст свёрнут, показать
     
     
  • 15.53, pavlinux (ok), 20:59, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Просто с mlock ом тоже может попасть code include sys resource h ... текст свёрнут, показать
     
     
  • 16.60, Аноним (-), 10:45, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Хорошая обработка ошибок При том в 50 программ оно так и остается ... текст свёрнут, показать
     
     
  • 17.68, pavlinux (ok), 13:44, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    ну минимум туда можно всунуть return -1, для полного феншуя, обработать errno и ... текст свёрнут, показать
     
  • 5.41, Аноним (-), 19:14, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Твой кэп.

    Хреновый кэп. Если оптимизация ломает поведение программы, это, пардон, буллшит.

     
     
  • 6.55, Аноним (-), 01:30, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Буллшит - это когда чудаки пальцем тыкают не подумав, а потом удивляются, чо это оно не работает.
     
     
  • 7.61, Аноним (-), 10:46, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Буллшит - это когда чудаки пальцем тыкают не подумав, а потом удивляются,
    > чо это оно не работает.

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

     
     
  • 8.70, Аноним (-), 15:33, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Как ни странно, компилятор работал, как его просили ... текст свёрнут, показать
     
  • 4.24, mrd (??), 14:01, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Microsoft никогда не волновали такие "мелочи"
     
  • 3.8, Аноним (-), 12:50, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +4 +/
    > до тех пор, пока это не влияет на конечный результат

    Удаление memset в данном случае, как показано, влияет на конечный результат, просто компилятор не в состоянии определить что эта память потом используется. Соответственно это ошибка в Visual Studio.

     
     
  • 4.10, rain87 (?), 13:14, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    так память и не используется. данные просто остаются в памяти, в этом и потенциальная уязвимость. в целом к компилятору придраться нельзя, с его точки зрения он всё правильно сделал
     
     
  • 5.16, Аноним (-), 13:35, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Глядя на данную проблему, все таки можно придраться.
     
     
  • 6.20, Xasd (ok), 13:38, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Глядя на данную проблему, все таки можно придраться.

    где проблема-то? как ты получишь доступ к этой [не очищенной] памяти?

    разработаешь rootkit и заразишь им компьютер? но с такимже успехом ты можешь разработать rootkit и ЗАРАНЕЕ заразить систему чтобы она делала ежесекундный разбор и сохранение нужных участков оперативной памяти... никакой super_forced_memset() не поможет

     
  • 4.14, kai (??), 13:33, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Удаляй memset() @ будь плохим парнем^W компилятором
     
  • 4.27, Anonplus (?), 15:36, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Компилятор делает все правильно. Он видит, что эта память потом нигде не используется. Значит и очищать ее незачем. В этом и есть суть оптимизаций - выкидывается "лишний" код. Если вы хотите эту память непременно очистить (из соображений секьюрности) - пишите отдельную собственную функцию для очистки памяти, вместо дефолтной. Или отключайте режим оптимизации, тогда компилятор скомпилирует все именно так, как вы написали. Но уж будьте любезны, тогда, писать сразу быстрый код, так как оптимизация ложится на ваши плечи.
     
     
  • 5.36, Andrew Kolchoogin (?), 18:34, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Он видит, что эта память потом нигде не используется. Значит и очищать ее незачем.

    Ой. Лихо вы...

    Смотрите. Единица трансляции -- это файлы .c, перечисленные в командной строке компилятора, плюс всё то, что в них поместит препроцессор оператором #include. Компилятор не вправе предполагать, что какие-то другие файлы в операционной системе вообще существуют.

    А теперь, внимание, фокус: в первом исходнике я пишу код, в котором аллоцирую ОЗУ, и вызываю функцию, находящуюся во втором исходнике, которой передаю указатель на вышеупомянутую область ОЗУ. В этой функции я делаю pthread_create() -- система у меня с MMU, мне можно -- и из дочернего потока вызываю функцию из третьего исходника, в которой делаю memset() этой области данными вида 0xaa55 -- и всё, "закрывающая фигурная скобка" (tm).

    Я что, не вправе ожидать, что поток-создатель там эти 0xaa55 увидит, если включу оптимизацию у компилятора?

    Или C-компилятор у нас теперь стал stateful, и сохраняет информацию обо всех оттранслированных ими файлах за всё время, начиная с установки операционной системы?

    Или он магически должен догадаться, что я в предыдущем исходнике поток создал, и слежу за этой же областью ОЗУ из, так сказать, "другого места"?

     
     
  • 6.45, aaa (??), 20:32, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    >> Или он магически должен догадаться, что я в предыдущем исходнике поток создал, и слежу за этой же областью ОЗУ из, так сказать, "другого места"?

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

     
     
  • 7.48, Andrew Kolchoogin (?), 20:36, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    >>> Или он магически должен догадаться, что я в предыдущем исходнике поток создал,
    >>> и слежу за этой же областью ОЗУ из, так сказать, "другого места"?
    > для этого и придумали volatile

        'volatile' придумали НЕ для этого: volatile придумали для того, чтобы компилятор не пытался помещать в регистр переменную, которую изменяют из другого места.

        Но вот про выкидывание кода ни в одном стандарте нигде ничего не написано.

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

        Ссылку на документ, согласно которому компилятор чего-то там "вправе выкинуть", в студию.

     
     
  • 8.52, aaa (??), 20:56, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    тогда весь смысл оптимизации теряется если компилятор не вправе изменять код С ... текст свёрнут, показать
     
     
  • 9.62, Аноним (-), 10:47, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Он его в праве изменять только таким образом который не меняет результат выполне... текст свёрнут, показать
     
     
  • 10.71, Аноним (-), 15:41, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Все программы сложнее хелловорлда проблемны Сейчас же вот всё надо бросить и... текст свёрнут, показать
     
  • 8.73, ваноним (?), 18:39, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    и, кроме этого, количество записей в volatile-переменную после оптимизации с... текст свёрнут, показать
     
     
  • 9.74, ваноним (?), 18:40, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    звездочки забыл... текст свёрнут, показать
     
  • 6.58, Xasd (ok), 04:52, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Или он магически должен догадаться, что я в предыдущем исходнике поток создал, и слежу за этой же областью ОЗУ из, так сказать, "другого места"?

    а думаешь компилятор не сможет понять -- используется ли некая переменная (указатель на блок памяти) -- ТОЛЬКО в одном исходном файле, или же существуют внешние (extern) функции которые способны этот указатель передать во вне... ыыыЫЫ?

    помоему вполне логично предположить что если некий указатель замешан (напрямую или внутри структуры) на параметры extern-функции -- то значит НЕ НАДО делать связанные с ним высокоуровневые оптимизации.

    ...соответственно компилятор делать их и НЕ будет :-)

    точнее говоря -- компилятор будет делать высокоуровневые оптимизации только если уверен что переменная (указатель на блок памяти) не имеет связи с "внешним миром".

    # P.S.: ну и конешно же я надеюсь что когда ты пишешь программу на C/C++ -- то ты же НЕ используешь всякие "неопределённые поведения (undefined behaviour)"? а если используешь -- то значит ты сам себе злобный буратино, стреляющий себе в ногу :).

     

  • 1.12, Xasd (ok), 13:29, 09/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > вместо размера буфера передаётся размер указателя на буфер

    строгая типизайия -- оказалась не такая уж и строгая [для функции сёравно какой-именно int ей забирать :-D]

    ...а вот любители утиной типизации -- 20 раз проверят (глазами, и/или тэстами) свой код на то чтобы он делал то что надо.

     
     
  • 2.18, Аноним (-), 13:36, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Естественно, или существует два типа int?
     
  • 2.26, Crazy Alex (ok), 14:50, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Какая, на фиг, строгая типизация в сях? Ох уж эти фанатики, вечно болтают, не разбираясь в предмете...
     

  • 1.17, Xasd (ok), 13:35, 09/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    вообще говоря -- что-то мне не нравится что программы пытаются брать на себя функции операционной системы.

    программа должна сделать ТОЛЬКО ''delete[] my_secret_array'' и дальше НЕ ОБЯЗАНА следить чтобы это утекло из оперативной памяти.

    ...за приватностью оперативной и виртуальной памяти -- должна следить операционная система.

    не так уж и сложно сделать внутри /etc/crypttab -- строчку связанную со SWAP [этим должны заниматсья разработчики дистрибутивов, конешно же, а не простые пользователи].

    малоли какие алгоритмы существуют в операционной системе для работы с памятью, и это ну точно не должно волновать прикладную программу!

     
     
  • 2.19, Аноним (-), 13:37, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Tor не совсем уж прикладная программа.
     
     
  • 3.21, Xasd (ok), 13:44, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Tor не совсем уж прикладная программа.

    Tor -- конешно же -- да -- необычная программа.

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

    сейчас наверно почти каждый-второй разработчик какого-нибудь своего демона -- читая эту тему и думает:

    """
    ой! щаз надо обязательно вставить: mlock() и munlock() в исходный код демона (в функцию очищения паролей из памяти)!
    приватность в опасности!!!
    """

     
     
  • 4.40, Аноним (-), 19:05, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Все верно, без явной поддержки со стороны ОС, я даже и не придумаю, как это можно надежно решить. Нужен отдельный сист. вызов.
     
  • 3.63, Аноним (-), 10:48, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Tor не совсем уж прикладная программа.

    А какая, пардон? Прикладуха самая обычная. Ну, как прокси-сервак например.

     
  • 2.25, Аноним (-), 14:47, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > программа должна сделать ТОЛЬКО ''delete[] my_secret_array'' и дальше НЕ ОБЯЗАНА следить чтобы это утекло из оперативной памяти

    И тормозить будет твоя операционка нещадно, затирая содержимое памяти после каждого delete.

     
  • 2.29, Аноним (-), 15:43, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > программа должна сделать ТОЛЬКО ''delete[] my_secret_array'' и дальше НЕ ОБЯЗАНА следить
    > чтобы это утекло из оперативной памяти.

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

     
     
  • 3.56, Xasd (ok), 04:24, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Во избежание всяких идиотских сюрпризов типа: программа заверщилась а следующая получила память с ключом

    <sarcasm>ды щаз! 25 раз получит новая программа необнулённую память!</sarcasm> ЛОЛ :-D ! это же просто смешно!

    такое только в MS-DOS было

     
     
  • 4.64, Аноним (-), 10:50, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > такое только в MS-DOS было

    Ну да, конечно, операционка сидит и протирает сотни мегов нулями после завершения процесса. Заняться ей нечем, ага.

     
     
  • 5.76, XPEH (?), 18:56, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Ну да, конечно, операционка сидит и протирает сотни мегов нулями после завершения
    > процесса. Заняться ей нечем, ага.

    Учите матчасть.

     

  • 1.28, Аноним (-), 15:41, 09/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    > Microsoft Visual Studio 2010 просто удаляет вызов memset

    Бюро Медвежьих Услуг.

     
     
  • 2.44, Crazy Alex (ok), 20:22, 09/11/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    GCC -O3 делает то же самое, насколько мне известно. Думаю, что и другие компиляторы в процессе оптимизации тоже выкидывают какие-либо действия с областями памяти,которые в дальнейшем не используются. Освобождаемый стек - типичный пример. И для подавляющего большиснтва приложений это оптимлаьная стратегия. А если пишешь экзотику - принимай специальные меры, это вполне возможно. В общем, нормальная ситуация - дефолтная реализация удобная для большиснства, а меньшинство может с разумными затратами сделать так, как ему нужно (в данном случае - использовать вместо memset свою аналогичную функцию).
     
     
  • 3.65, Аноним (-), 10:50, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > GCC -O3 делает то же самое,

    -O3 это вообще небезопасная оптимизация в GCC на свой страх и риск. Стабильным и беспроблемным является -O2. Им все вменяемые люди и пользуются.

     
  • 2.57, Xasd (ok), 04:28, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    >> Microsoft Visual Studio 2010 просто удаляет вызов memset
    > Бюро Медвежьих Услуг.

    в чём заключается медвежья услуга?

    уязвимость -- сугубо теоретическая.

    если не обнулился блок-памяти щаз, значит обнулится чуть по-пожже.

    в этом и заключается оптимизация!

    если бы блок памяти не обнулялся бы ВООБЩЕ (и доставался в таком виде другой программе) -- вот тут бы тогда можно было бы начать говорить про медведей :) .

    но реальность такова что ново-запущенным программам -- достаются уже подчищенные кусочки памяти [а уж в какой конкретно момент они были подчищенны -- не всё ли равно?]

     
     
  • 3.66, Аноним (-), 10:51, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > в чём заключается медвежья услуга?

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

    > уязвимость -- сугубо теоретическая.

    Не, извините, возможность посторонним хапнуть ключ/пароль/... откуда-то слева - это даже теоретически очень плохо.

     

  • 1.38, vi (?), 18:46, 09/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > В процессе анализа исходных текстов клиента для работы в анонимной сети Tor
    > обнаружена (http://www.viva64.com/ru/b/0178/) необычная уязвимость
    > при выборе режима оптимизации на скорость (-O2) Microsoft Visual Studio 2010
    > просто удаляет вызов memset при обнулении данных, если буфер в дальнейшем

    Зачем, достали, очередной зонд из ... пользователей offtop/

     
  • 1.72, Аноним (-), 16:11, 10/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Интересно как подобная проблема безопасности решается в той же реализации ssl у самих М$
     
     
  • 2.75, ваноним (?), 18:45, 10/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    м... никак?
    вообще, у них (внезапно!) может быть другая реализация, на которой их компилятор так себя не ведет. либо, они обложили этот кусок кода прагмами с отключением оптимизации
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



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

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