Введение

Способ управления правами доступа к памяти на компьютере

Защита памяти – это способ управления правами доступа к памяти на компьютере, являющийся частью большинства современных архитектур наборов команд и операционных систем. Основная цель защиты памяти — предотвратить доступ процесса к памяти, которая не была ему выделена. Это не позволяет ошибке или вредоносному ПО внутри процесса влиять на другие процессы или саму операционную систему. Защита может распространяться на все обращения к определенной области памяти, обращения на запись или попытки выполнить содержимое этой области. Попытка доступа к несанкционированной памяти приводит к аппаратной ошибке, например, к ошибке сегментации или исключению нарушения доступа к памяти, что обычно вызывает аварийное завершение процесса-нарушителя. Защита памяти в целях компьютерной безопасности включает в себя дополнительные методы, такие как рандомизация адресного пространства и защита пространства исполняемого кода.

Сегментация

Сегментация — это разделение памяти компьютера на сегменты. Обращение к местоположению в памяти включает в себя значение, идентифицирующее сегмент, и смещение внутри этого сегмента. Дескриптор сегмента может ограничивать права доступа, например, только для чтения или только из определенных уровней привилегий. Архитектура x86 обладает множеством функций сегментации, полезных для использования защищенной памяти в этой архитектуре. В архитектуре x86 глобальная таблица дескрипторов (GDT) и локальные таблицы дескрипторов (LDT) могут использоваться для обращения к сегментам в памяти компьютера. Указатели на сегменты памяти в процессорах x86 также могут храниться в сегментных регистрах процессора. Изначально процессоры x86 имели 4 сегментных регистра: CS (сегмент кода), SS (сегмент стека), DS (сегмент данных) и ES (дополнительный сегмент); позже были добавлены еще два регистра: FS и GS. Непривилегированное приложение не может получить доступ к странице, которая не была явно выделена ему, поскольку каждый адрес памяти либо указывает на страницу, выделенную этому приложению, либо вызывает прерывание, называемое ошибкой страницы (page fault). Невыделенные страницы и страницы, выделенные любому другому приложению, не имеют адресов с точки зрения данного приложения. Ошибка страницы не обязательно указывает на ошибку. Ошибки страниц используются не только для защиты памяти. Операционная система может управлять таблицей страниц таким образом, чтобы обращение к странице, ранее выгруженной на вторичное хранилище, вызывало ошибку страницы. Операционная система перехватывает ошибку страницы, загружает необходимую страницу памяти, и приложение продолжает работу, как будто ошибки не было. Эта схема, являющаяся разновидностью виртуальной памяти, позволяет перемещать данные, которые в данный момент не используются, на вторичное хранилище и обратно прозрачно для приложений, увеличивая общую емкость памяти. В некоторых системах запрос на виртуальное хранилище может выделять блок виртуальных адресов, для которых еще не назначены фреймы страниц, и система будет назначать и инициализировать фреймы страниц только при возникновении ошибок страниц. В некоторых системах может использоваться сторожевая страница (guard page) для обнаружения ошибок или для автоматического расширения структур данных. В некоторых системах механизм ошибок страниц также используется для защиты исполняемого пространства, например, с помощью W^X.

Защитные ключи

Механизм защиты памяти (MPK) разделяет физическую память на блоки определенного размера (например, 4 КиБ), каждый из которых имеет соответствующее числовое значение, называемое ключом защиты. Каждый процесс также имеет связанное с ним значение ключа защиты. При доступе к памяти аппаратное обеспечение проверяет, совпадает ли ключ защиты текущего процесса со значением, связанным с блоком памяти, к которому осуществляется доступ; в противном случае возникает исключение. Этот механизм был представлен в архитектуре System/360. Он доступен на современных мэйнфреймах System z и широко используется операционными системами System z и их подсистемами. Ключи защиты System/360, описанные выше, связаны с физическими адресами. Это отличается от механизма ключей защиты, используемого в архитектурах, таких как Hewlett Packard/Intel IA 64 и Hewlett Packard PA RISC, которые связаны с виртуальными адресами и допускают несколько ключей на процесс. В архитектурах Itanium и PA RISC к трансляциям (записям TLB) привязаны ключи (Itanium) или идентификаторы доступа (PA RISC). Работающий процесс имеет несколько регистров ключей защиты (16 для Itanium, 4 для PA RISC). Ключ трансляции, выбранной виртуальным адресом, сравнивается с каждым из регистров ключей защиты. Если какой-либо из них совпадает (плюс другие возможные проверки), доступ разрешен. Если совпадений нет, генерируется ошибка или исключение. Обработчик программных ошибок может, при необходимости, проверить отсутствующий ключ по отношению к большему списку ключей, поддерживаемому программным обеспечением; таким образом, регистры ключей защиты внутри процессора можно рассматривать как кэш, управляемый программным обеспечением, более крупного списка ключей, связанных с процессом. PA RISC использует ключи длиной 15–18 бит; Itanium требует не менее 18 бит. Ключи обычно связаны с доменами защиты, такими как библиотеки, модули и т. д. В архитектуре x86 механизм ключей защиты позволяет помечать виртуальные адреса пользовательских страниц любым из 16 ключей защиты. Все страницы, помеченные одним и тем же ключом защиты, составляют домен защиты. Новый регистр содержит разрешения, связанные с каждым доменом защиты. Операции загрузки и сохранения проверяются как на разрешения таблицы страниц, так и на разрешения ключей защиты, связанные с доменом защиты виртуального адреса, и разрешаются только в том случае, если оба разрешения допускают доступ. Разрешения ключей защиты могут быть установлены из пользовательского пространства, что позволяет приложениям напрямую ограничивать доступ к данным приложения без вмешательства ОС. Поскольку ключи защиты связаны с виртуальным адресом, домены защиты относятся к пространству адресов, поэтому процессы, работающие в разных пространствах адресов, могут использовать все 16 доменов.

Защитные кольца

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

Моделированная сегментация

Симуляция — это использование программы мониторинга для интерпретации инструкций машинного кода определенных компьютерных архитектур. Такой эмулятор набора инструкций может обеспечивать защиту памяти, используя схему, подобную сегментации, и проверяя целевой адрес и длину каждой инструкции в реальном времени перед ее фактическим выполнением. Симулятор должен вычислять целевой адрес и длину и сравнивать их со списком допустимых диапазонов адресов, которые он хранит относительно окружения потока, таких как любые динамически выделенные блоки памяти с момента запуска потока, а также любые допустимые общие статические области памяти. Понятие "допустимости" может меняться в течение жизни потока в зависимости от контекста. В некоторых случаях может быть разрешено изменять статический блок памяти, а в других — нет, в зависимости от текущего режима выполнения, который может зависеть или не зависеть от ключа памяти или режима супервизора. Обычно не рекомендуется использовать этот метод защиты памяти, если на ЦП имеются соответствующие средства, поскольку это потребляет ценные вычислительные ресурсы. Однако он обычно используется для отладки и тестирования, чтобы обеспечить более детальный уровень детализации для общих нарушений доступа к памяти и точно указать, какая инструкция пытается перезаписать конкретный участок памяти, который может иметь тот же ключ памяти, что и незащищенная память.

Адресация на основе возможностей

Адресованность на основе возможностей — это метод защиты памяти, который не используется в современных коммерческих компьютерах. В этом методе указатели заменяются защищёнными объектами (называемыми возможностями), которые могут быть созданы только с помощью привилегированных инструкций, выполняемых только ядром или другим процессом, имеющим на это полномочия. Это позволяет ядру эффективно контролировать доступ процессов к объектам в памяти, без необходимости использования отдельных адресных пространств или переключения контекста. Лишь несколько коммерческих продуктов использовали безопасность на основе возможностей: Plessey System 250, IBM System/38, архитектура Intel iAPX 432 и KeyKOS. Подходы, основанные на возможностях, широко применяются в исследовательских системах, таких как EROS и браузер Combex DARPA. Они концептуально используются в качестве основы для некоторых виртуальных машин, в частности Smalltalk и Java. В настоящее время проект CHERI, финансируемый DARPA в Кембриджском университете, работает над созданием современной аппаратной платформы, поддерживающей как возможности, так и устаревшее программное обеспечение.

Динамическое загрязнение

Динамическое запятнание — это техника защиты программ от несанкционированного доступа к памяти. При выделении памяти во время выполнения эта техника помечает как саму память, так и соответствующий указатель одним и тем же маркером запятнания. Маркеры запятнания затем соответствующим образом распространяются по мере выполнения программы и проверяются каждый раз, когда к адресу памяти m осуществляется доступ через указатель p; если маркеры запятнания, связанные с m и p, различаются, выполнение останавливается и сообщается о несанкционированном доступе. Процессоры SPARC M7 (и более новые) реализуют динамическое запятнание аппаратно. Oracle продает эту функцию под названием Silicon Secured Memory (SSM) (ранее известная как Application Data Integrity (ADI)). Архитектура процессора lowRISC CPU включает динамическое запятнание под названием Tagged Memory.

Меры

Уровень защиты конкретной реализации можно оценить по степени соответствия принципу наименьших привилегий.