2015-06-08 5 views
5

У меня есть два места в модуле ядра (Linux 3,13):Различных привилегий в исполнении модуля ядра

  1. Одним из них является module_init
  2. Другого код я крюк с Недействительным опкодом (путем взлома прерывания описания Таблица).

Мой код предназначен для включения счетчика производительности оборудования. Когда я помещаю его в module_init, код работает нормально. Но когда я помещаю его на второе место (вызванное запуском команды с недопустимым кодом операции), код получает ошибку permission denied (т. Е. Errno: -13).

Поскольку оба места находятся в одном модуле ядра, верно ли, что «даже в пространстве ядра существуют разные привилегии?»

Обновления: то, что стоит упомянуть, заключается в том, что когда я запускаю недопустимый код операции как root в пользовательском пространстве, ошибка -13 errno отсутствует; в противном случае он остается ...

Я предполагаю, что «привилегия исполнения команды решает задачу выполнения обработчика прерывания».

+0

У вас всегда есть [OS privelleges] (http://en.wikipedia.org/wiki/Privilege_level) на процессоре. Даже в * режиме ядра *; не все разрешено. В противном случае вы можете легко взять под контроль. –

+0

@CommuSoft: Объясняет ли это различие между его кодом ядра в 'module_init' и его кодом ядра для ловушки опкода? – Nemo

+2

[SSCCE] (http://www.sscce.org/) очень помог бы здесь, я думаю. – Nemo

ответ

2

Потому что module_init и ваш код крюка работает в разных процессах. И есть разные привилегии между разными процессами.

Как правило, код должен выполняться в процессе.

module_init всегда работает в течение периода модуляции (см. Функцию sys_init_module). Когда вы вводите модуль ядра, вы должны быть root. И этот процесс тоже корень. Так что он работает хорошо.

Но когда вы помещаете код в IDT, он может выполняться в пользовательском процессе, так как пользовательский процесс вызывает прерывание. Так получилось -EPERM.

Вы можете проверить euid, uid, pid и comm в своем коде. Пример:

int hook_func() 
{ 
    printk(KERN_INFO"Code Called in hook_func. My pid: %d, comm: %s, uid: %d, euid: %d\n", 
      current->tgid, current->comm, current->cred->uid, current->cred->euid); 
    ... 
} 

int my_init() 
{ 
    printk(KERN_INFO"Code Called in my_init. My pid: %d, comm: %s, uid: %d, euid: %d\n", 
      current->tgid, current->comm, current->cred->uid, current->cred->euid); 
    ... 
} 

module_init(my_init); 
+0

есть способ изменить такое поведение (что обработчик работает с той же привилегией процесса запуска), снова взломав IDT? – Richard

+0

@ Рихард К сожалению, нет. – shuofei

Смежные вопросы