Управление памятью


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

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



Здесь &bn — адрес памяти, содержащей переменную bn. Функция bnBegin присвоит этой переменной ссылку на вновь занимаемую память. mgr — это менеджер памяти, который знает, как выделить память, а TRUE указывает на то, что память может содержать ценные данные. Едва ли можно проверить, не сохранит ли Windows эти данные на диск, несмотря на все усилия PGP (Windows NT — огромная программа, и её исходники недоступны), однако мы убедились, что все указания FALSE в вызовах PGP верны.

С помощью программ, наподобие WinGrep, найти все случаи строки "bnBegin" совсем не трудно. Большинство вызовов верны, но несколько из них привлекли более пристальное внимание: в некоторых случаях последние аргументы опущены, как, например, в файле bndsaprime.c:



Выяснить, что это значит, было непросто, поскольку не нашлось макроса или функции bnBegin с одним аргументом. Как оказалось, одноаргументовая bnBegin присутствует только в древнем коде, который при обычных настройках вырезается препроцессором. Если настройки изменить, компилятор начинает ругаться по поводу функций. Подобные находки сами по себе не опасны, но поднимают резонный вопрос: как часто и досконально проверялся этот код? Это похоже на безопасное программирование?

Назад[link1] | Дальше[link2]

Ссылки
[link1] https://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/analizishodnogokoda/kakmyissledovali

[link2] https://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/analizishodnogokoda/parsingfajjlov