Могу ли я использовать системный вызов modify_ldt
, чтобы добавить новую запись (дескриптор ворот вызова) в LDT?
Нет, вы не можете добавить шлюз вызова, используя этот системный вызов, поскольку это системный дескриптор. Глядя на what information can be provided к системному вызову ...
struct user_desc {
unsigned int entry_number;
unsigned long base_addr;
unsigned int limit;
unsigned int seg_32bit:1;
unsigned int contents:2; // HERE
unsigned int read_exec_only:1;
unsigned int limit_in_pages:1;
unsigned int seg_not_present:1;
unsigned int useable:1;
};
... мы видим, что мы можем обеспечить только два бита в contents
поле для описания типа дескриптора мы хотели бы иметь. Отслеживание этих данных с помощью функций системного вызова в ядре Linux не так прямо вперед, но я уверен, что эти данные, наконец, прибывает в fill_ldt
, который содержит следующие строки:
// ...
desc->type = (info->read_exec_only^1) << 1;
desc->type |= info->contents << 2;
desc->s = 1;
// ...
member fieldstype
и s
вместе с полями для уровня привилегий дескриптора (DPL) и формы текущего флага byte 5 of the descriptor. Элемент s
заканчивается в бит 4 (ну, бит «S»), который определяет, является ли дескриптор системным дескриптором (S=0
) или сегментом (кодом/данными) (S=1
). Поскольку код выше hardcodes имеет значение 1
, вы всегда получаете сегмент (код/данные), а не системный дескриптор. Таким образом, нет вызовов.
[..] для повышения привилегий
Таким образом, ответ здесь нет. В противном случае это будет большой недостаток безопасности при разработке ядра Linux. Я был немного удивлен тем, что процессор фактически разрешит вызовы в LDT, тем самым возлагая нагрузку на операционную систему на обнаружение (или полностью запрет) использования этой функции.