ugidctl — linux uid/gid control, часть 1

Всем привет!

Буду делать механизм, позволяющий в userspace одному процессу относительно безопасно прыгать между заранее определенными uid’ами и gid’ами.

Должно выйти что-то типа такого:

К сожалению CAP_SETUID/CAP_SETGID не позволяют ограничить список пользователей, поэтому буду делать модуль ядра.

Назову это как-нибудь ужасно, например ugidctl.c
Итак, поехали:

Ещё понадобится какой-нибудь простенький Makefile для модуля:

Самое первое и важное — собственно научиться переключать идентификаторы пользователей, групп и дополнительных групп. За это отвечают 3 системных вызова в ядре: setuid(2), setgid(2) и setgroups(2) соответственно. Но просто так в модуле их вызвать нельзя — современные ядра для модулей экспортируют только несколько системных вызовов (например sys_close). Сами функции в ядре, естественно, присутствуют:

Просто открыть в модуле ядра /proc/kallsyms и поискать там нужные адреса мне тоже никто не даст, да и глупо это как-то. Зато есть kallsyms_on_each_symbol. Эта функция позволяет проходиться по всем символам ядра, вызывая пользовательскую функцию для каждой записи. Подробнее можно почитать тут. Вот и поищем этой функцией:

Компилим, запускаем:

Работает как и задумывалось.

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

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