Глава 9. Проблемы реализации. Часть I
главная память, объем которой зачастую достигает сотен мегабайт. Но глав-
ная память функционирует сравнительно медленно, поэтому помимо нее су-
ществует и кэш. Кэш — это небольшая, зато более быстрая память. В кэше
содержится копия недавно использованных данных из главной памяти. Ко-
гда процессору нужно осуществить доступ к каким-либо данным, он вначале
проверяет свой кэш. Если в кэше имеются нужные данные, доступ процес-
сора к ним осуществляется сравнительно быстро. Если же нужных данных
в кэше нет, они считываются (относительно медленно) из главной памяти, по-
сле чего копия этих данных помещается в кэш для будущего использования.
Чтобы освободить в кэше место для новых данных, из него выбрасывается
копия каких-нибудь других данных.
Почему мы упомянули о кэше? Потому что в нем могут храниться копии
данных, включая и копии наших секретных данных. Проблема состоит в том,
что, когда мы пытаемся удалить из памяти наши секреты, они не всегда уда-
ляются там, где нужно. В некоторых системах изменения данных вносятся
только в кэш, а не в главную память. Они будут записаны в главную па-
мять только тогда, когда кэшу понадобится свободное место для размещения
новых данных. Мы не знаем всех тонкостей работы этих систем, а они изме-
няются от процессора к процессору. Невозможно узнать, существует ли такое
взаимодействие между единицей выделения памяти и системой кэширования,
которое может привести к удалению данных из кэша без их записи в глав-
ную память, когда она высвобождается еще до сброса кэша. Производители
никогда не объясняют, как следует поступить, чтобы гарантированно уда-
лить из памяти конкретные данные. По крайней мере мы никогда не видели
подобных спецификаций, а поскольку такие методы не задокументированы,
доверять им не стоит.
Вторая опасность, связанная с наличием кэша, состоит в следующем. Ино-
гда кэш узнает, что содержимое конкретной области памяти было изменено
(возможно, другим процессором в многопроцессорной системе). В этом слу-
чае кэш помечает свои данные, которые когда-то находились в этой области
памяти, как “недостоверные”, но не всегда уничтожает сами данные. Это мо-
жет привести к появлению копии наших секретных данных, которая не будет
уничтожена.
Мы мало что можем сделать в этой ситуации. Вообще-то опасность утечки
данных из кэша невелика, так как в большинстве систем непосредственный
доступ к кэшу может получать только код операционной системы. Кроме то-
го, нам так или иначе приходится доверять операционной системе, поэтому
мы можем довериться и этому механизму. Тем не менее нас беспокоит теку-
щий принцип работы кэша, поскольку он никак не обеспечивает функцио-
нальности, которая требуется для реализации хороших систем безопасности.
9.3. Как сохранить секреты
163
9.3.4
Удерживание данных в памяти
Очень многих удивляет тот факт, что простое перезаписывание данных
не обязательно приводит к их удалению. Детали этого процесса в некоторой
степени зависят от типа используемой памяти, однако в общем случае, если
данные помещаются в какую-либо область памяти, эта область начинает по-
тихоньку “заучивать” или “удерживать” данные. Когда вы перезаписываете
данные или выключаете компьютер, старые данные теряются не полностью.
В зависимости от обстоятельств, простое выключение и включение питания
может восстановить некоторые или все старые данные. Другие типы памяти
могут “вспомнить” старые данные, если доступ к ним осуществляется в те-
стовых режимах (часто незадокументированных) [38].
Причина этого феномена кроется в принципах работы нескольких меха-
низмов. Если одни и те же данные на протяжении достаточно долгого вре-
мени хранятся в одной и той же области статической оперативной памяти
(Static RAM — SRAM), они будут рассматриваться как предпочтительное со-
стояние загрузки этой памяти. Наш друг столкнулся с этой проблемой мно-
го лет назад при сборке компьютера в домашних условиях [9]. Он написал
BIOS, которая использовала магическое число (magic value), расположенное
в конкретной области памяти, чтобы определить, какая выполняется переза-
грузка: “холодная” (cold reboot) или “горячая” (warm reboot)
2
. Через некото-
рое время машина отказалась загружаться после выключения и повторного
включения компьютера, потому что оперативная память “выучила” магиче-
ское число, в результате чего каждая перезагрузка воспринималась системой
как горячая. Поскольку в процессе горячей перезагрузки не инициализиро-
вались некоторые нужные переменные, система не могла загрузиться. Для
устранения этой проблемы пришлось поменять местами некоторые модули
памяти, чтобы SRAM не могла “вспомнить” магическое число, которое она
“выучила”. Для нас это послужило уроком: оперативная память сохраняет
больше данных, чем мы думаем.
Аналогичные, хотя и несколько более сложные процессы происходят с ди-
намической оперативной памятью (Dynamic RAM — DRAM). Кодирование
битов в памяти DRAM выполняется путем помещения небольшого электри-
ческого заряда в крошечный конденсатор. Изоляционный материал вокруг
пластин конденсатора подвергается напряжению, что приводит к измене-
2
В те времена компьютеры, собранные в домашних условиях, программировались путем
непосредственного введения двоичной формы машинного языка, что, конечно же, приводи-
ло к появлению массы ошибок. Один из гарантированных способов восстановить машину
после “падения” программы заключался в перезагрузке компьютера. Холодная перезагруз-
ка — это выключение и повторное включение компьютера. Горячая перезагрузка — это пе-
резагрузка наподобие той, что выполняется при нажатии кнопки Reset. В процессе горячей
перезагрузки система не выполняет повторную инициализацию всего состояния, а значит,
не уничтожает настройки, сделанные пользователем.
164
Достарыңызбен бөлісу: |