Хочу задать пару вопросов: (используется в основном FreeBSD, но о аналогиях на Linux был бы тоже рад услышать)
Во-первых, вопрос о kern.securelevel. Читал много статей о нужности и ненужности, пришел к выводу - что вещь очень полезна ;) Например мне в ней очень нравиться блокирование операции chflags при уровне 1. Но при этом у меня возник сразу вопрос - chflags ставиться на все значимые флаги, включая инициализацию на последней стадии загрузки /sbin/init - его подменить невозможно. Но зато возможно (если кто-то завладел правами достаточного уровня) в /etc/rc.conf поставить просто опцию kern_securelevel_enable="NO" и ребутнуться. Если ставить флаг на rc.conf - то тогда каким образом позже удаленно перевести систему обратно, например для обновок?
Во-вторых, по описанию на kern.securelevel уровня 2 написано о блокирации доступа к /dev/kmem... Довольно смутно. Каким образом можно вычислить - какая прога использует доступ к kmem а какая нет? Рисковать опытным путем на машине с двадцатью сервисами как-то неспортивно ;)
В третьих, всем проблема всем известным хакам через buffer overflow. Как я понимаю, технология хака: При вызове к каким-то процедурам, в стеке остается адрес, куда нужно вернуться процедуре после ее отработки. Используется buffer overflow с целью затирания этого адреса и ювелироной замены этого значения на другое - например на /bin/sh из примера, который гуляет во всех подобных текстах. Вопрос вот в чем - каким образом это реально тогда, когда доступ к памяти какого-то юзера - это работа ядра?! По идее, если программа от юзера N, имея в себе какой-то call на область памяти, принадлежащая данным другого юзера должна пресекаться прозрачно. Даст ли kern.securelevel дополнительную защиту для таких действий?
В четвертых, вот какой вопрос: например код обычного юзера вроде fork(); for (;;) {
memmove(a,argv);
} - где argv больше a (тоесть результат Segmentation Fault) - способен не только постоянно засорять системный лог, но и делает работу системы нереальной (загрузка CPU/число процессов до результата, когда система не способна завести новый процесс). При начальной дефолтовой установке Фряшке - без каких-то настроек, токой код запущеный любым юзерам делает из системы просто ноль, даже админу зайти нереально. Покопался, нашел всякие нужности вроде kern.maxproc, kern.maxprocperuid - вполне подходит. Но у меня есть такие пользователи - у которых потолок максимального числа процессов должен быть разным (желательно) А также, я ничего не нашел о каких бы то ни было квотах использования ресурсов конкретному юзеру - например чтобы юзер N от системы отнимал не больше M% от общего числа, ну или что-то вроде этого.
И в пятых вопрос о LD_PRELOAD. Ничто не мешает пользователю написать библиотеку .so, в которой он пропишет getuid() { return 0 }, чем обманет программы, делающие проверку на то - от рута ли запущены мы или нет. Почти все программы - таким образом раскалываются. Ядро этим не обманешь или те проги, что скомпилированны статически - но можно ли исправить ситуацию с первыми (обманывающимеся) программами? Может ли какое-то блокирование LD_PRELOAD оказать негативное влияние на работу системы?
Спасибо, что дочитали до сюда ;) Пойду еще вопросы вспоминать. Буду рад за разжевывание.