Из Википедии, бесплатной энциклопедии
  (Перенаправлен из шлюза вызова )
Перейти к навигации Перейти к поиску

Шлюз вызова - это механизм в архитектуре Intel x86 для изменения уровня привилегий процесса, когда он выполняет вызов предопределенной функции с помощью инструкции CALL FAR.

Обзор [ править ]

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

Шлюзы вызова используют специальное значение селектора для ссылки на дескриптор, доступ к которому осуществляется через глобальную таблицу дескрипторов или локальную таблицу дескрипторов , которая содержит информацию, необходимую для вызова через границы привилегий. Это похоже на механизм, используемый для прерываний .

Использование [ править ]

Предполагая, что шлюз вызова уже настроен ядром операционной системы , код просто выполняет CALL FAR с необходимым селектором сегмента (поле смещения игнорируется). Процессор выполнит ряд проверок, чтобы убедиться, что ввод действителен и код работает с достаточными привилегиями для использования шлюза. Предполагая, что все проверки пройдены, новый CS / EIP загружается из дескриптора сегмента , а информация о продолжении помещается в стек нового уровня привилегий (старый SS, старый ESP, старый CS, старый EIP в указанном порядке). При необходимости параметры также могут быть скопированы из старого стека в новый. Количество копируемых параметров находится в дескрипторе шлюза вызова.

Ядро может вернуться в программу пользовательского пространства с помощью инструкции RET FAR, которая извлекает информацию о продолжении из стека и возвращается на внешний уровень привилегий.

Формат дескриптора шлюза [ править ]

typedef  struct  _CALL_GATE { USHORT  OffsetLow ; Селектор USHORT  ; УЧАР Число аргументов : 5 ; UCHAR Зарезервировано : 3 ; УЧАР Тип : 5 ; // 01100 в i386, i286 00100 в Uchar Dpl : 2 ; УЧАР Присутствует : 1 ; USHORT OffsetHigh ; } CALL_GATE , * PCALL_GATE ;       

Предыдущее использование [ править ]

Multics была первым пользователем шлюзов вызова. Honeywell 6180 были ворота вызова в рамках архитектуры, но Multics моделировали их на старшем GE 645 .

OS / 2 была одним из первых пользователей шлюзов вызовов Intel для передачи между кодом приложения, работающим в кольце 3, привилегированным кодом, работающим в кольце 2, и кодом ядра в кольце 0.

Windows 95 выполняет драйверы и переключение процессов в кольце 0, в то время как приложения, включая DLL API, такие как kernel32.dll и krnl386.exe, выполняются в кольце 3. Драйвер VWIN32.VXD предоставляет ключевые примитивы операционной системы в кольце 0. Он позволяет вызывать драйвер. функции из 16-битных приложений (MSDOS и Win16). Этот адрес получается вызовом INT 2Fh с 1684h в регистре AX. Чтобы определить, для какого VxD запрашивается точка входа, регистр BX устанавливается на 16-битный идентификатор VxD. После возврата из инструкции INT регистры ES.DI содержат дальний указатель, который может быть вызван для передачи управления VxD, работающему в кольце 0. Дескриптор, на который указывает ES, фактически является шлюзом вызова. [1] Однако 32-битные приложения, когда им нужен доступ к коду драйвера Windows 95, вызывают недокументированную функцию VxDCall в KERNEL32.DLL, которая по существу вызывает INT 30h, который изменяет режим звонка.

Современное использование [ править ]

Современные операционные системы x86 уходят от ворот вызова CALL FAR. С введением инструкций x86 для системного вызова (SYSENTER / SYSEXIT от Intel и SYSCALL / SYSRET от AMD) был введен новый более быстрый механизм передачи управления для программ x86. Поскольку большинство других архитектур не поддерживают шлюзы вызова, их использование было редкостью даже до этих новых инструкций, поскольку программные прерывания или ловушки были предпочтительны для переносимости, хотя шлюзы вызова значительно быстрее, чем прерывания.

Шлюзы вызовов более гибкие, чем инструкции SYSENTER / SYSEXIT и SYSCALL / SYSRET, поскольку, в отличие от двух последних, шлюзы вызовов позволяют переходить с произвольного уровня привилегий на произвольный (хотя и более высокий или равный) уровень привилегий. Быстрые инструкции SYS * позволяют передавать управление только с кольца 3 на 0 и наоборот.

Проблемы безопасности [ править ]

Для обеспечения безопасности системы глобальная таблица дескрипторов должна храниться в защищенной памяти, в противном случае любая программа сможет создать собственный шлюз вызова и использовать его для повышения уровня своих привилегий. Шлюз вызова использовался в эксплойтах безопасности программного обеспечения , когда были найдены способы обойти эту защиту. [2] Одним из примеров этого является почтовый червь Gurong.A , написанный для использования операционной системы Microsoft Windows , которая использует \ Device \ PhysicalMemory для установки шлюза вызовов. [3]

См. Также [ править ]

  • Глобальная таблица дескрипторов
  • Системный вызов

Ссылки [ править ]

  1. ^ Мэтт Питрек , Секреты системного программирования Windows 95
  2. ^ Блог проекта Xen о повышении привилегий Intel SYSRET
  3. ^ Червь: W32 / Gurong.A Описание F-Secure Labs