Шлюз виклику

Шлюз виклику (англ. call gate) — механізм у процесорній архітектурі 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;

Безпекові проблеми

Для збереження безпеки системи глобальна таблиця дескрипторів повинна зберігатися у захищеній пам'яті, інакше будь-яка програма зможе створити свій власний шлюз виклику і використати його для підвищення рівня привілеїв. Шлюзи виклику використовувалися у програмних експлойтах, коли були знайдені способи обійти цей захист[1]. Прикладом цього є поштовий хробак Gurong.A, написаний для експлуатації операційної системи Microsoft Windows, який використовує \Device\PhysicalMemory для встановлення шлюзу викликів[2].

Див. також

Джерела

  1. The Intel SYSRET privilege escalation. Xen Project Blog. Архів оригіналу за 17 лютого 2019. Процитовано 14 лютого 2022.
  2. Worm:W32/Gurong.A Description F-Secure Labs

Посилання

 

Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia