Я хочу сохранить некоторые данные в переменной (и я знаю, что переменные хранятся в памяти). Зашифровываются ли эти данные в памяти? Кроме того, возможно ли, чтобы программное обеспечение могло читать имена переменных, хранящиеся в памяти, и иметь возможность фактически извлекать данные из него?
Память не шифруется на любой платформе, о которой я знаю. В любом случае это будет иметь ограниченное значение, поскольку процессор должен, в общем, работать с данными открытого текста, поэтому данные должны находиться в открытом тексте на машине где-то .
Вместо этого современные операционные системы (и большинство из них) используют защиту памяти, позволяющую только определенным процессам получать доступ к определенным страницам памяти. Каждая страница памяти поставляется с правами на чтение, запись и (иногда) выполнение. Ядро операционной системы отвечает за обработку этих разрешений на коммутаторе контекста, чтобы предоставить или запретить доступ к страницам памяти в процессе при необходимости.
В статье Салцера и Шредера за 1975 год «Защита информации в компьютерных системах» описывается механизм, использующий сегменты , а не страницы, но принцип остается неизменным на протяжении десятилетий.
Как правило, любая страница памяти, принадлежащая процессу, читается процессом с достаточно высокой привилегией; ядро ОС, безусловно, может изменять любую страницу памяти, и она может также делегировать эту привилегию для пользовательских процессов. Системный вызов ptrace(2)
в Linux предоставляет отладчик-бэкдор, который может использоваться для реализации систем контроля strace(1)
только для чтения, таких как strace(1)
или ltrace(1)
или gdb(1)
, или систем модификации памяти, таких как gdb(1)
и ptrace
основе песочницы .
Или, в некоторых ситуациях, файл ядра может быть сброшен (см. core(5)
и setrlimit(2)
manpages), содержащие содержимое памяти процесса. Это одна из причин, по которой важно освободить память важных данных перед выпуском .
Я был частью команды, которая работала над указателями шифрования ( не-PTO ) в запущенных программах. Накладные расходы были потрясающими, и количество угловых случаев было еще более удивительным. Использование этих методов для общих программ, вероятно, нецелесообразно, хотя я мог представить себе ограниченную среду, в которой зашифрованная память или структуры управления являются приемлемым подходом. (Хотя, вероятно, более подходящими были бы другие методы).
Хорошо, поэтому я хочу хранить некоторые данные в переменной (что, я знаю, переменные хранятся в памяти) – эти данные в памяти зашифровываются?
НЕТ
Кроме того, возможно ли, чтобы программное обеспечение могло читать имена переменных, хранящиеся в памяти, и иметь возможность фактически извлекать данные из него?
Имена или значения?
Для значений:
Вы имеете в виду другую программу, а не вашу, чтобы получить доступ к ней и прочитать ее? Да, возможно, в зависимости от ОС это может быть сложно или сложнее, но выполнимо.
Для имен: зависит от того, как вы создаете свое программное обеспечение – если вы оставите в нем информацию об отладке – это очень легко сделать.
Нет. Память обычно не шифруется.
Память хранит данные, которые вы записываете в нее. В какой-то точке память будет содержать текстовую версию ваших данных, и это иногда используется как способ использования систем.
Тем не менее, если у злоумышленника есть физический доступ к вашим машинам, их очень сложно обеспечить.
Существуют некоторые специфические для языка функции, которые пытаются решить эту проблему, например C # SecureString , но даже они имеют свои ограничения.
Зашифровываются ли эти данные в памяти?
Обычно нет. Я говорю «обычно» только потому, что вы могли бы сделать операционную систему или аппаратное обеспечение, которое шифрует память. Так что действительно, нет.
Возможно ли, чтобы программное обеспечение могло читать имена переменных, хранящиеся в памяти, и иметь возможность фактически извлекать данные из него?
Зависит. С кодом в интерпретируемом языке, например, имена переменных PHP хранятся где-то в памяти, так что это возможно. С скомпилированным кодом, подобным (например, C ++), он может быть скомпилирован с помощью отладочной информации (а затем отладчик сможет видеть имена переменных и извлекать их значения), или он может быть скомпилирован без него, а затем имена переменных будут потеряны.
Кроме того, очень легко написать программу, которая считывает произвольные адреса памяти, но гораздо сложнее понять, что означают байты, которые вы читаете.
Ответ sarnold на защиту памяти правилен. Однако есть атаки, которые могут обойти многие формы защиты памяти. К ним относятся скрытые каналы, остаточная информация в недавно выделенной памяти, атаки на основе DMA, такие как firewire, атака доверенного устройства с доступом, атака программ ядра, физические атаки и т. Д. Комбинация шифрования и проверки целостности памяти может помочь с некоторыми из этих атак.
Если вы заинтересованы в зашифрованной памяти, вот несколько проектов для вас.
Процессор MIT AEGIS
Архитектура SecureCore
Архитектура SecureME
Система HAVEN на базе FPGA от ВВС
Для некоторых из них могут использоваться защищенные от несанкционированного доступа, криптопроцессоры. Они не просто общие цели.
Альтернативой, которая снова становится популярной, является внедрение всей платформы, ОС и всех, в управляемый или безопасный код типа. Это позволяет системе типа выполнять большую часть защиты памяти для вас. Примеры включают операционные системы и программное обеспечение Scheme48, SPIN, JX и Verve.
Появляются решения, которые могут шифровать память на стандартных микропроцессорах x86 из-за физического компрометации (атаки на холодную загрузку, кто-то уходит с энергонезависимыми модулями двойной встроенной памяти (NVDIMM), содержащие постоянные данные, подключая вредоносные карты ввода-вывода, которые используют прямой доступ к памяти (DMA) и т. Д.).
Один из подходов – использовать гипервизор с высокой степенью уверенности, который работает в кэше последнего уровня процессора (кеш-память L3). Внутри процессора есть чистый текст, вне ЦП – зашифрованная память.
Обратите внимание, что вам по-прежнему необходимо защищать от привилегированных пользователей и исправлять свои приложения (все, что вы уже делаете), но новая технология защищает данные в использовании от физического компрометации.