Similar presentations:
OS07(1)
1. Кольца защиты
ЗащитаОС требует наложения на обычные программы (не входящие в
операционную систему) трех типов ограничений:
1) обычным программам запрещается выполнять некоторые команды;
2) обычным программам должны быть недоступны определенные сегменты,
доступные операционной системе;
3) должно быть невозможным получение привилегии операционной системы кроме
как входом в нее в разрешенной точке входа.
В процессоре 80286 реализован такой метод расширения и сокращения набора
доступных сегментов, который опирается на вызов процедуры, а не на переключение
задач.
Уровни привилегий при защите документов.
Каждому документу назначается один из четырех
классов: совершенно секретный, секретный,
конфиденциальный и неклассифицируемый. Чем
важнее документ, тем выше класс.
Каждый человек имеет один из четырех уровней
благонадежности:
совершенно
секретный,
секретный, конфиденциальный и неблагонадежный.
Больший уровень благонадежности отражает
большее доверие к человеку. Человеку с конкретным
уровнем благонадежности разрешается доступ к
документам соответствующего или меньшего класса.
2. Кольца защиты
Для защиты сегментов в процессоре 80286 вместо четырех классов и уровнейблагонадежности в нем действуют четыре уровня привилегий с номерами 0-3. Чем
меньше номер уровня, тем более привилегирован этот уровень. Уровни привилегий
находятся в трех различных местах:
1. Каждый дескриптор имеет уровень привилегий дескриптора DPL. Для
записываемых или считываемых сегментов дескриптор DPL можно считать "классом"
сегмента, а для исполняемых сегментов DPL оказывается "уровнем благонадежности"
процедур в этом сегменте.
2. Каждый селектор содержит запрашиваемый уровень привилегий RPL.
3. Процессор 80286 автоматически поддерживает текущий уровень привилегий CPL.
Он показывает "уровень благонадежности" текущей выполняющейся программы и
равен содержимому поля DPL сегмента, который адресует регистр CS. Процессор
хранит содержимое поля CPL в двух младших битах CS, замещая поле RPL хранимого
там селектора.
Чтобы обратиться к сегменту для считывания или записи, программа должна
загрузить в сегментный регистр селектор этого сегмента. Представляется, что
программа может обратиться к любому сегменту (даже более привилегированному,
чем она сама), просто создавая для него селектор и загружая селектор в сегментный
регистр. Для предотвращения этого процессор 80286 генерирует особый случай
защиты, если текущая программа (CPL) менее привилегирована, чем сегмент (DPL), т.
е. если "уровень благонадежности" программы меньше класса сегмента.
Другими словами, доступ разрешается, если DPL > CPL.
3. Кольца защиты
Уровень привилегий 1 должен использоваться большей частью операционнойсистемы. Уровень 0 предназначен для той небольшой части операционной системы,
которая осуществляет управление памятью, защиту и управление доступом. Эта часть
называется ядром безопасности.
Привилегированные команды
Уровни команд
Мнемоники команд
Команды, недопустимые выше уровня 0
LIDT, LLDT, LGDT, LTR, LMSW, CLTS, HLT
Команды, недопустимые выше
INS, IN, OUTS, OUT, STI, CLI, LOCK
ввода-вывода
Команды, модифицируемые
IRET, POPF
в соответствии с уровнем___________________________________________________
Процессор 80286 в регистре флажков имеет поле уровня привилегий ввода-вывода
IOPL, определяющее наименее привилегированное кольцо, в котором разрешены
команды ввода-вывода. Если любая из этих команд выполняется в кольце, менее
привилегированном, чем IOPL, возникает особый случай защиты.
Еще одним столь же важным элементом является флажок разрешения прерываний IF.
Хотя обычным пользовательским программам нельзя изменить эти поля, команды
загрузки флажков имеют и допустимые применения и не должны запрещаться для
менее привилегированных колец. Поэтому, если команда загрузки флажков (а это
команды IRET и POPF) выполняется в кольце, отличающемся от нулевого, поле IOPL
остается неизменным; если такая команда
выполняется в кольце, менее
привилегированном, чем определяется IOPL, флажок IF также не изменяется.
4. Вызов через кольца
Процессор разрешает менее привилегированной процедуре вызывать болеепривилегированную, но ограничивает доступ разрешенными точками входа.
Допустимые точки входа идентифицируются в процессоре 80286 специальными
дескрипторами, называемыми шлюзами вызова.
Вызывающая программа выполняет косвенную передачу управления через шлюз
вызова; команда CALL в вызывающей программе обращается к шлюзу вызова, а он
определяет точку входа в вызываемой программе. Теперь для доступа
пользовательской программы к конкретной процедуре операционной системы нужно
обеспечить шлюз вызова (привилегия которого достаточно низка для доступа
пользовательской программе) и заставить этот шлюз вызова обратиться в точку входа
сильно защищенной операционной системы.
Дескриптор шлюза вызова содержит виртуальный адрес нужной точки входа в более
привилегированном сегменте. Команда вызова содержит виртуальный адрес,
селектор которого адресует шлюз вызова; смещение здесь игнорируется.
Одно из преимуществ хранения адреса точки входа в шлюзе вызова, а не в команде
вызова, заключается в том, что процедуру можно изменять и рекомпилировать, не
требуя рекомпилирования никаких программ, вызывающих ее через шлюз. Чтобы
учесть любые изменения в точке входа процедуры, нужно изменить только
виртуальный адрес в шлюзе вызова. Следовательно, старые программы можно
выполнять с новой версией операционной системы, если позиции в GDT всех шлюзов
для обслуживания старой операционной системы остались неизменными.
5. Формат дескриптора шлюза вызова
Поле DPL определяет, какая привилегиянеобходима для доступа к шлюзу, т.е.
шлюзом можно пользоваться только при
CPL < DPL. Селектор и смещение
назначения определяют нужную точку
входа. Назначением должен быть сегмент
кода; шлюзы в шлюзы запрещены. Поле
RPL селектора назначения игнорируется.
Пятибитное
поле
счетчика
слов
показывает
число
параметров-слов,
передаваемых при вызове.
Здесь шлюз вызова имеет DPL = 2 и обращается к сегменту кода с DPL « 0. Шлюз
вызова можно использовать как назначение для вызовов, осуществляемых в кольцах
0,1 и 2; но шлюз нельзя использовать из кольца 3. Кроме того, сегмент кода может
прямо вызываться любой программой в кольце 0.
6. Вызовы и возвраты в виртуальном режиме
Чтобы проанализировать механизм вызовов и возвратов, рассмотрим три случая:1) вызывающая и вызываемая программы имеют одинаковые привилегии;
2) вызывающая программа менее привилегирована, чем вызываемая;
3) вызывающая программа более привилегирована, чем вызываемая.
Если вызывающий и вызываемый
сегменты
имеют
одинаковые
привилегии,
вызовы
и
возвраты
действуют так же, как в реальном
режиме. Это остается справедливым,
даже если вызов проходит через шлюз:
он просто перенаправляет назначение
вызова.
Если вызывающий сегмент менее привилегирован, чем вызываемый, вызов должен
проходить через шлюз. Кроме того, вызываемая процедура должна использовать
другой, более привилегированный сегмент стека, чем вызывающая процедура. Это
объясняется двумя причинами.
Во-первых, вызываемая процедура должна
защищаться от возможного
переполнения стека, которое возникает, если
вызывающая процедура распределяет недостаточное стековое пространство.
Именно по этой причине большинство ОС почти во всех компьютерах при вызове
переключаются на свои стеки. Процессор 80286 в межкольцевых вызовах
переключает стек автоматически.
7. Вызовы и возвраты в виртуальном режиме
Вторая причина переключения стека. 80286 разрешает задачам разделять сегменты.Возможно, что менее привилегированный сегмент стека менее привилегированной
вызывающей процедуры разделяется с другой задачей. Менее привилегированная
программа, выполняющаяся в этой другой задаче, может разрушить сегмент стека,
когда он используется более привилегированной вызванной процедурой в первой
задаче. В общем, привилегированные процедуры должны считать менее
привилегированные записываемые сегменты подвергающимися разрушению.
80286 получает новые значения регистров SS и SP для нового стека из
специального сегмента, называемого сегментом
состояния задачи TSS и
ассоциируемого с задачей. Каждая задача имеет свой сегмент состояния задачи.
8. Вызовы и возвраты в виртуальном режиме
Верхняя часть стека, видимая вызванной процедуре, одинакова в обоих случаях.Команда возврата может узнать о том, что она осуществляет возврат из
межкольцевого вызова, сравнивая текущее значение CPL с уровнем CPL вызывающей
программы. (Напомним, что уровень CPL сохраняется в поле RPL регистра CS, поэтому
процессор может определить CPL вызывающей программы, анализируя значение CS,
которое было включено в стек как часть адреса возврата.)
При возврате из межкольцевого вызова команда возврата должна :
1. Извлечь адрес возврата и поместить его в регистры CS и IP.
2. Извлечь параметры из стека вызываемой программы.
3. Переключиться на стек вызывающей программы, извлекая старые значения SS и SP
из стека и помещая в регистры SS и SP.
4. Извлечь параметры из стека вызывающей программы.
5. Продолжить выполнение вызывающей программы.
Кроме того, команда возврата сбросит содержимое регистров DS или ES, если любой
из них адресует сегмент, более привилегированный, чем вызывающая программа. Это
действие запрещает вызывающей программе недопустимый доступ к
привилегированным сегментам, случайно оставленным вызванной процедурой.
9. Вызов менее привилегированной программы
В этом маловероятном случае операционная система запрашивает обслуживание отпользовательской программы, что запрещается процессором 80286. Возврат!!!
Предположим, что до выполнения команды возврата "злонамеренная" программа
формирует адрес возврата (значения для регистров CS и IP) и включает его в стек, т. е.
осуществляет "подделку" адреса возврата. Далее предположим, что этот поддельный
адрес возврата соответствует защищенной точке входа в операционной системе.
Когда выполняется команда возврата, пользовательская программа войдет в
операционную систему в недопустимой точке входа. Следовательно, если разрешить
вызовы (и возвраты) менее привилегированных колец, "злонамеренный"
пользователь может "ворваться" в ОС. По этой причине подобные вызовы и возвраты
приводят к особому случаю защиты.
Процессор 80286 при определенных обстоятельствах
позволяет программе
осуществить переход к шлюзу вызова. Опасность в том, что программа может
включить в стек поддельный адрес перехода и осуществить межкольцевой переход
через шлюз вызова к более привилегированной процедуре, которая ожидает вызова,
а не перехода. Переход оказывается замаскированным под вызов. Когда
привилегированная процедура выполнит свою команду возврата, выполнение будет
продолжено с ячейки, определяемой поддельным адресом возврата, а им может
быть недопустимая точка входа в более привилегированное кольцо. Следовательно,
защита не срабатывает. По этой причине межсегментные переходы разрешены
только внутри кольца. Переходы к назначениям в другом кольце приводят к особому
случаю защиты. Переход к шлюзу вызова разрешен, если только назначение шлюза
вызова находится в том же кольце, что и команда перехода.
10. Атака троянского коня
Рассмотрим процедуру ОС из кольца 1, которая записывает текущие дату и время вцепочку в ячейке, определяемой единственным параметром процедуры виртуальным адресом. Злонамеренная программа в кольце 3 вызывает эту
процедуру, передавая как параметр виртуальный адрес, содержащий селектор для
сегмента в кольце 2. После этого процедура кольца 1 записывает дату и время в
указанную ячейку, разрушая сегмент кольца 2. Злонамеренная программа
использовала параметр в качестве троянского коня, который разрушил сегмент кольца
2 после того, как параметр передан в кольцо 1 "доверчивой" процедуре даты и
времени.
11. Атака троянского коня 2
Чтобы отразить эту атаку, используется поле RPL в селекторах и команда ARPL(скорректировать RPL). По существу, поле RPL искусственно увеличивает текущий
номер кольца (уменьшает привилегии), который действует при использовании
селектора. Увеличенный номер кольца равен max (CPL, RPL). Следовательно, мы
можем с помощью поля RPL отметить селектор степенью нашего доверия к нему.
Вызванная процедура должна содержать команды ARPL, которые устанавливают поле
RPL всех селекторных параметров на уровень привилегий вызывающей программы.
Этим вызванная процедура может защититься от атаки троянского коня.
Несколько более лучший подход - установить поле RPL на максимальное значение
(меньшие привилегии) старого RPL и уровня привилегий вызывающей программы.
Команда ARPL имеет два операнда: первый - операнд-слово (память или регистр), а
второй - регистровый операнд-слово. Предполагается, что оба операнда являются
селекторами. Поле RPL первого операнда устанавливается на максимальное значение
обоих RPL. Если команда ARPL увеличивает поле RPL первого операнда, то она
устанавливает в 1 флажок нуля. В противном случае команда ARPL сбрасывает флажок
нуля. Следовательно, предусмотрительная процедура может загрузить селектор из
своего адреса возврата в регистр, а затем применить команду ARPL к каждому
селекторному параметру, чтобы защититься от атаки.
12. Атака троянского коня 3
Программисты, не заботящиеся о троянских конях, могут привести двауспокаивающих объяснения:
1. Если программа использует RPL = 0 во всех своих селекторах, то ее можно
применять в любом кольце без опасности ложных особых случаев защиты. Это
объясняется критерием допустимого доступа
2. Программа, работающая только в кольце 3 (пользовательском кольце), дает одни
и те же результаты, независимо от используемых ею значений RPL. Объясняется это
тем, что критерий допустимого доступа приобретает вид:
Наконец, для предусмотрительных программ введены две команды, которые
проверяют, доступен ли сегмент без риска возникновения особого случая защиты.
Команда VERR (проверить на считывание) воспринимает операнд-слово (память или
регистр), который считается селектором. Если селектор можно безопасно
использовать для считывания, команда VERR устанавливает флажок нуля в 1; в
противном случае флажок нуля сбрасывается. Команда VERW (проверить на запись)
аналогична команде VERR, но она проверяет разрешение записи.
13. Подчиненные сегменты
Недостаток в использовании команды ARPL заключается в том, что онадолжна явно фигурировать в программе. Если процедура никогда не требует
больше привилегий, чем вызывающая ее программа, процессор 80286
обеспечивает автоматическую коррекцию ее привилегий.
Например, в системе может быть процедура для преобразования двоичных
целых чисел в символьный код ASCII, которая используется в каждом кольце.
Поскольку вызовы менее привилегированных процедур запрещены, эта
процедура должна находиться в кольце 0, чтобы ее можно было вызвать из
кольца 0. Но, в общем случае, процедура
преобразования требует
достаточно привилегий только для доступа к своим
аргументам и
возвращению результата, т. е. только такие же привилегии, как и
вызывающая ее программа. В процессоре 80286 для таких ситуаций
предусмотрен элегантный механизм.
Напомним, что в дескрипторах исполняемых сегментов (и только для таких
сегментов) имеется бит подчинения С. Если этот бит установлен в 1, то
обычные правила относительно CPL и DPL не действуют, а вместо них
вводятся другие.
14. Подчиненные сегменты 2
Процедуры в подчиненном сегменте можно вызывать или переходить к нимпрямо из любой программы, не более привилегированной, чем подчиненный
сегмент: поле CPL вызывающей программы должно быть больше или равно
полю DPL подчиненного сегмента. Шлюз вызова не требуется, и стеки не
переключаются. Когда производится передача управления подчиненному
сегменту, поле CPL не изменяется; оно остается на уровне вызывающей
программы.
Следовательно,
подчиненный
сегмент
автоматически
"перемещается" или "подчиняется" кольцу вызывающей программы. Это
правило действует даже в том случае, если подчиненный сегмент вызывается
через шлюз.
Сегменты кода иногда содержат константы, используемые программой и,
следовательно, считываемые при ее выполнении. Обычно, если сегмент кода
считываемый, то он считывается только из содержащего его кольца и из
колец с меньшими номерами (т. е. более привилегированных). Чтобы
считываемый подчиненный сегмент мог обращаться к своим встроенным
константам, считываемые подчиненные сегменты могут считываться из
любого кольца.
electronics