ugidctl – linux uid/gid control, часть 4

Теперь я буду собирать все элементы мозаики в кучу. Отдельного внимания разве что стоит механизм, которым я буду разрешать ядру переключать uid/gid или дополнительные группы, если мои проверки прошли успешно, но процесс непривелигерован. План такой:

  1. Даю процессу (задаче) CAP_SETUID/CAP_SETGID
  2. Вызываю sys_setuid/sys_setgid/sys_setgroups
  3. Отбираю CAP_SETUID/CAP_SETGID. Если на этой стадии что-то пошло не по плану, убиваю процесс SIGKILL‘ом — ему нельзя позволить дальше работать с повышенными привилегиями


Примерно это должно выглядеть вот так:

Также хочу отдельно отметить, где буду хранить ключ и корни деревьев со списком разрешенных uid’ов и gid’ов для открытого файлового дескриптора. При отрытии устройства, kmalloc‘ом можно выделить небольшой кусок памяти, закинуть туда рандомный ключ, корни деревьев и всяких полезностей. Адрес на этот кусок памяти можно положить в поле private_data структуры file, которую ядро мне будет передавать при каждом вызове open, ioctl и close. При закрытии нужно будет освободить этот кусок памяти и все связанные с ним структуры:

Полный листинг получившегося модуля выйдет слишком большим, поэтому даю ссылки на результат.

Header-файл с описанием протокола и структур данных: ugidctl.h
Функции работы с красно-черными деревьями: ugidctl-cache.c
Основной модуль: ugidctl-dev.c

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *