LINUX.ORG.RU

Объясните пожалуйста


0

0

Хочу задать пару вопросов: (используется в основном 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 оказать негативное влияние на работу системы?

Спасибо, что дочитали до сюда ;) Пойду еще вопросы вспоминать. Буду рад за разжевывание.

anonymous

>В третьих, всем проблема всем известным хакам через buffer overflow.(...)
>Вопрос вот в чем - каким образом это реально тогда, когда доступ к памяти какого-то юзера - это работа ядра?! По идее, если программа от юзера N, имея в себе какой-то call на область памяти, >принадлежащая данным другого юзера должна пресекаться прозрачно.
это немного не то: bufer-overlow позволяет, напимер, имея доступ по http запустить на чужой машине программу с правами пользователя, от имени которого запущен httpd


>И в пятых вопрос о LD_PRELOAD. Ничто не мешает пользователю написать библиотеку .so, в которой он пропишет getuid() { return 0 } (...)
а зачем ему обманывать чужие программы, когда он может написать свою? и запустить ее с теми-же(своими) правами

Anonymous ★★★★★
()

О buffer-overlow теперь понятно (правда текст на английском читал - может не до конца все осмыслил - но там все было нацелено на получение рутового шелла таким методом), тогда все встает на свои места ;) А про getuid я просто как пример привел - все же хотелось бы знать - есть ли возможность блокирации. Речь идет не только об обмане через подмену getuid/geteuid (кстати многие программы пишут после этого что я являюсь рутом, хотя фактически прав не пребавляется благодаря ядру). Но ведь можно нанести теоретически ущерб или спровоцировать программу на некорректную работу - например таким же образом подставить какое-нибуть (я не проверял, просто мысли) левое (большее) значение getmemfree - в рез-е чего прога будет думать что памяти у нее много и резервировать будет соответственно, что может повлечь или ее крах или нагрузку на swap. Пример вообщем плохой привел, но что-то не лезет пока в голову ничего. Все же можно таким образом некоторые (точнее все программы кто не статически линкован с этими функциями) ввести в заблуждение. Например старая версия pgsql удачно пишет в логфайх, что действия производились root-ом, хотя на самом деле обращался другой юзер.

anonymous
()

>Если ставить флаг на rc.conf - то тогда каким образом позже удаленно >перевести систему обратно, например для обновок?

в single-user

anonymous
()

Вся проблема в том, что single-mode недоступен удаленно. Я не уточнил просто этот момент. Я сначала было изменил немного исходный код у init для того, чтобы он сам выставил securelevel в 0 (скопировал этот файл с другим именем), а с реального /sbin/init снял флаг schg и поставил noschg на /etc, /etc/rc.conf, /etc/default/rc.conf В итоге когда мне надо - я видоизмененый init ставлю взамен оригинального, перезагружаю - о порядок. Но после того как все это проделал, я понял что просто какой-то туфтой занят =) Да вот еще у меня вопрос появился к anonymous кто ответил на buffer-overlow.

[это немного не то: bufer-overlow позволяет, напимер, имея доступ по http запустить на чужой машине программу с правами пользователя, от имени которого запущен http] Стоп! То есть доступ уже есть по HTTP (точнее от его имени). А речь идет как раз о тех серъезных buffer-overlow, которые позволяют получить права суперпользователя. Например в RedHat и FreeBSD-рассылке очень часто идет фраза, что при такой-то такой то buffer overflow возможно последующее завладение правами. Кстати вот линк на подобное описание проблемы: http://hack.com.ru/papers/advancedoverflows/index.html (В файле adv.overflow.paper.txt)

anonymous
()

Я не договорил ;). Так вот - в тексте просто ставят команды, ЧЕРЕЗ которые хотят попробовать произвести взлом - например самая трифиальная последовательность кода /bin/sh - затем дизасемблируют (для получения этой последовательности) - и после - пытаются через bufferoverlow указать CALL на адрес, где эта последовательность обнаружено. Вот и возник у меня резонный вопрос - КАК ТАКОЕ ВООБЩЕ МОЖЕТ ДОПУСКАТЬСЯ.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.