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

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

В системе 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).

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