Вызов ворот (Intel) - Call gate (Intel)

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

Обзор

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

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

Применение

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

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

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

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

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

Мультики был первым пользователем ворот вызова. В 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] Одним из примеров этого является электронная почта червь Гуронг.А, написано для использования Майкрософт Виндоус операционная система, которая использует DevicePhysicalMemory для установки шлюза вызова.[3]

Смотрите также

Рекомендации

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