2015-09-18 6 views
0

Могу ли я использовать системный вызов modify_ldt, чтобы добавить новую запись (дескриптор ворот вызова) в LDT?добавить дескриптор ворот вызова в локальную таблицу дескриптора (LDT) для повышения привилегий

  • Если да, то это значит, что я могу настроить этот дескриптор с дескриптором
    уровня привилегий (DPL) 3 и сегмент кода равен KERNEL_CS (который является дескриптором коды ядра для CPL0), указывающий на адресное пространство процесса ниже TASK_SIZE, таким образом позволяя пользовательскому режиму задавать прямой вызов своего собственного кода на CPL0.
  • Если нет, то почему бы и нет?

Я новичок в этой области. Большое спасибо за ваше терпение и усилие.

ответ

0

Могу ли я использовать системный вызов 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, тем самым возлагая нагрузку на операционную систему на обнаружение (или полностью запрет) использования этой функции.