Шлюз виклику () — механізм у процесорній архітектурі x86, призначений для зміни рівня привілеїв задачі, і реалізований за допомогою механізму CALL FAR.
Призначення Призначення шлюзів виклику — дозволити менш привілейованому коду (такому, як звичайний застосунок) викликати код, що виконується з вищим рівнем привілеїв. Це може бути, наприклад, ядро операційної системи, або спеціальні системні бібліотеки чи драйвери, що працюють у кільцях захисту 0, 1 або 2.
Кожен шлюз виклику має відповідний селектор, що обирає відповідний дескриптор у GDT чи LDT. Схожий механізм має в архітектурі x86 обслуговування переривань.
Використання Якщо шлюз виклику коректно встановлений ядром ОС, прикладна програма здійснює інструкцію CALL FAR з потрібним селектором сегмента як аргументом. Поле «зміщення» (offset) при цьому ігнорується. Після успішної перевірки привілеїв процесор завантажує пару CS: EIP з дескриптора сегмента, і записує до стека нового рівня привілеїв всю інформацію, потрібну для коректного відновлення програми після виклику (регістри SS, ESP, CS і EIP перерваної задачі, у вказаному порядку. При потребі зі стека перерваної задачі копіюються параметри, їх кількість вказується у дескрипторі шлюзу.
Після закінчення обробки виклику виконання повертається назад до перерваної задачі за допомогою інструкції RET FAR.
Формат
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 offset 31..16 P DPL 0 type 1 1 0 0 0 0 0 count selector offset 15..0
typedef struct _CALL_GATE { USHORT OffsetLow; USHORT Selector; UCHAR NumberOfArguments:5; UCHAR Reserved:3; UCHAR Type:5; UCHAR DPL:2; UCHAR Present:1; USHORT OffsetHigh; }CALL_GATE;
Безпекові проблеми Для збереження безпеки системи глобальна таблиця дескрипторів повинна зберігатися у захищеній пам'яті, інакше будь-яка програма зможе створити свій власний шлюз виклику і використати його для підвищення рівня привілеїв. Шлюзи виклику використовувалися у програмних експлойтах, коли були знайдені способи обійти цей захист. Прикладом цього є поштовий хробак Gurong.A, написаний для експлуатації операційної системи Microsoft Windows, який використовує \Device\PhysicalMemory для встановлення шлюзу викликівWorm:W32/Gurong.A Description F-Secure Labs.
Див. також Глобальна таблиця дескрипторів Системний виклик
Джерела
Посилання Bringing Call Gates Back (Alex Ionescu)