Является ли очистка / обнуление чувствительных переменных после использования разумными? - PullRequest
11 голосов
/ 22 мая 2011

Я заметил, что некоторые программы явно не обращают внимания на выделение памяти после использования.Например, в OpenSSL есть метод для очистки памяти, занимаемой ключом RSA:

"Освобождает структуру RSA rsa. Эту функцию всегда следует использовать для освобождения структуры RSA, так как она также освобождает подполя безопасносначала очистка памяти. "

http://www.rsa.com/products/bsafe/documentation/sslc251html/group__COMMON__RSA__KEY__FUNCS.html#aRSA_free

Если любая (C / C ++) программа содержит такие чувствительные переменные, следует ли явно обнулять память, как указано выше?(Или обнуление памяти является актом паранойи или просто защитой)?

Кроме того, когда программа завершает свою работу, любая выделенная память в конечном итоге выделяется другой программе.В системе Linux очищается или очищается память перед ее выделением другой программе?Или вторая программа может считывать содержимое старой памяти первой программы?

Ответы [ 4 ]

3 голосов
/ 22 мая 2011

В системе Linux очищается или очищается память перед ее выделением другой программе?

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

Где угодно (CПрограмма / C ++) содержит такие чувствительные переменные, если вы явно обнуляете память, как указано выше?

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

1 голос
/ 22 мая 2011

С точки зрения безопасности ваша память может содержать данные, которые вы не хотели бы хранить.Если процесс завершится сбоем и файл ядра будет иметь полный дамп памяти.Можно копаться в этих основных файлах и моих данных.Если вам нужно отправить этот основной файл для звонка в службу поддержки, вы бы чувствовали себя в большей безопасности, если после использования очистить память.Когда я работал над VMS, некоторые чувствительные клиенты воздерживались даже от предоставления нам файлов дампа (что крайне затрудняло отладку).

1 голос
/ 22 мая 2011

Когда программы / библиотеки, такие как GPG и OpenSSL с конфиденциальными криптографическими данными, явно обнуляют память, это не имеет ничего общего с опасением, что память будет «переназначена» другим программам, которые могут читать данные.Это принципиально невозможно из-за того, как работают многопроцессорные / многопользовательские операционные системы.

Причины обнуления данных двояки:

  1. Если код является библиотекой, вам нужнозащитить от неосторожной утечки информации вызывающей программой.Даже если память, которая содержала конфиденциальную информацию, не может быть переназначена другому процессу, освобожденная память может и будет повторно использоваться в том же процессе , пока она все еще работает с тем же образом программы (т.е. пока она нет называется exec*).Неисправная программа может вызвать malloc, а затем записать буфер на диск, не заполнив сначала весь выделенный объект, и в этом случае старая потенциально чувствительная информация может просочиться на диск.Подобные проблемы существуют в крупных реальных продуктах, таких как Microsoft Office (хотя они, возможно, уже исправлены).

  2. Даже если код не библиотека, а автономныйПрограмма, вы можете обнулить конфиденциальные данные в памяти, прежде чем освободить их для целей паранойи.Если федералы разрушат вашу дверь и заберут ваш компьютер, они могут впоследствии проверить, что произошло на разделах подкачки.Если они будут осторожны в удалении, они могут даже изучить содержимое памяти.Если вы параноидально относитесь к физическим атакам, вы должны убедиться, что парольные фразы и т. Д. не существуют в любом месте оперативной памяти или на диске после их использования.Многие криптографические программы даже хотят иметь root-доступ, чтобы они могли mlockall хранить свою память, чтобы не допустить того, чтобы что-либо было выгружено на диск (хотя, на мой взгляд, это глупо - торгует серьезный риск взлома root из-за ошибок в программном обеспечении для паранойи по поводуфизическая атака).

Если вы не беспокоитесь о физических атаках или если вы достаточно соприкасаетесь с реальностью, чтобы понять, что у физических злоумышленников, вероятно, есть лучшие способы получить вашу фразу-пароль, чем свопраздел криминалистики, то причина № 2, вероятно, в основном фальшивая, но большинство программ в любом случае решает эту проблему просто для того, чтобы довольствовать психом.: -)

0 голосов
/ 22 мая 2011

В системе Linux очищается или очищается память перед ее выделением другой программе?

Зависит от деталей, которые можно найти на справочной странице mmap:

MAP_UNINITIALIZED (начиная с Linux 2.6.33)

          Don't clear anonymous pages.  This flag is intended to improve
          performance on embedded devices.  This flag is only honored if the
          kernel was configured with the CONFIG_MMAP_ALLOW_UNINITIALIZED option.
          Because of the security implications, that option is normally enabled
          only on embedded devices (i.e., devices where one has complete control
          of the contents of user memory).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...